Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建特定的Web刮板_Python_Html_For Loop_Beautifulsoup_Screen Scraping - Fatal编程技术网

Python 创建特定的Web刮板

Python 创建特定的Web刮板,python,html,for-loop,beautifulsoup,screen-scraping,Python,Html,For Loop,Beautifulsoup,Screen Scraping,我正在努力学习用Python进行刮取,在本例中,我的想法是制作一个从网页获取数据的工具。我有一个问题,建议“for”遍历页面并收集每个框(项目)的数据,因为它们是: 伊多弗 名单 头衔 位置 内容 电话 这不是一项任务,这是我自己的倡议,但我没有向前迈进,为此我感谢你的帮助 以下是我对代码的理解: from bs4 import BeautifulSoup import requests URL_BASE = "https://www.milanuncios.com/oferta

我正在努力学习用Python进行刮取,在本例中,我的想法是制作一个从网页获取数据的工具。我有一个问题,建议“for”遍历页面并收集每个框(项目)的数据,因为它们是:

  • 伊多弗
  • 名单
  • 头衔
  • 位置
  • 内容
  • 电话
这不是一项任务,这是我自己的倡议,但我没有向前迈进,为此我感谢你的帮助

以下是我对代码的理解:

from bs4 import BeautifulSoup
import requests

URL_BASE = "https://www.milanuncios.com/ofertas-de-empleo-en-madrid/?dias=3&demanda=n&pagina="
MAX_PAGES = 2
counter = 0

for i in range(0, MAX_PAGES):

    #Building the URL
    if i > 0:
        url = "%s%d" % (URL_BASE, i)
    else:
        url = URL_BASE

    #We make the request to the web
    req = requests.get(url)
    
    #We check that the request returns a Status Code = 200
    statusCode = req.status_code
    if statusCode == 200:

        #We pass the HTML content of the web to a BeautifulSoup () object
        html = BeautifulSoup(req.text, "html.parser")

        #We get all the divs where the inputs are
        entradas_IDoffer = html.find_all('div', {'class': 'aditem-header'})
        
        #We go through all the inputs and extract info
        for entrada1 in entradas_IDoffer:
            
            #THIS ARE SOME ATTEMPS
            #Title = entrada.find('div', {'class': 'aditem-detail-title'}).getText()
            #location = entrada.find('div', {'class': 'list-location-region'}).getText()
            #content = entrada.find('div', {'class': 'tx'}).getText()
            #phone = entrada.find('div', {'class': 'telefonos'}).getText()
        
            #Offer Title
            entradas_Title = html.find_all('div', {'class': 'aditem-detail'})
            for entrada2 in entradas_Title:
                counter += 1
                Title = entrada2.find('a', {'class': 'aditem-detail-title'}).getText()
                
            counter += 1
            IDoffer = entrada1.find('div', {'class': 'x5'}).getText()
                    
                    

        #Location
        #entradas_location = html.find_all('div', {'class': 'aditem-detail'})
        #for entrada4 in entradas_location:
        #    counter += 1
        #    location = entrada4.find('div', {'class': 'list-location-region'}).getText()

                    #Offer content
                    #entradas_content = html.find_all('div', {'class': 'aditem-detail'})
                    #for entrada3 in entradas_content:
                     #   counter += 1
                      #  content = entrada3.find('div', {'class': 'tx'}).getText()

            print("%d - %s  \n%s\n%s" % (counter, IDoffer.strip(),url,Title))

    else:
        try:
            r = requests.head(req)
            print(r.status_code)

        except requests.ConnectionError:
            print("failed to connect")
        break
        #If the page no longer exists and it gives me a 400

正确的陷阱

entradas_IDoffer = html.find_all("div", class_="aditem CardTestABClass")
标题位于“a”标签下,而不是“div”

对于其他数据,请执行此操作

他们可能正在使用javascript加载电话号码,所以您可能无法使用bs4获取该号码,您可以使用selenium获取该号码

您编写了非常长的代码来循环多个页面,只需使用range来遍历第1页和第2页。将url放入格式化字符串中

for page in range(1, 3):
    url =  f'https://www.milanuncios.com/ofertas-de-empleo-en-madrid/?dias=3&demanda=n&pagina={page}'
完整代码:

import requests
from bs4 import BeautifulSoup

for page in range(1, 5):
    url =  f'https://www.milanuncios.com/ofertas-de-empleo-en-madrid/?dias=3&demanda=n&pagina={page}'
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    entradas_IDoffer = soup.find_all("div", class_="aditem CardTestABClass")

    for entrada in entradas_IDoffer:
        title = entrada.find("a", class_="aditem-detail-title").text.strip()
        ID = entrada.find("div", class_="x5").text.strip()
        location = entrada.find("div", class_="list-location-region").text.strip()
        content = entrada.find("div", class_="tx").text.strip()
        
        print(title, ID, location, content)

在这一行中,输入标题中的输入2的
,什么是
input\u Title
?您从未在任何地方定义过它。@SimonR谢谢您的观察,我已经更正了代码。这是一个翻译问题。现在您可以继续帮助我了。正如您所说,使用Selenium似乎更容易,但我仍然难以提出for循环。如果我用你的,我只得到每一页的第一条记录,它不会抓取整页的每一条。有什么建议吗?完整代码已更新。它将通过前4页,你可以改变范围内的页数。我真的很感谢你的帮助。祝你2021年万事如意!!祝你有一个美好的2021!!代码更新了一点。我使用了“page”两次,一次作为页码,一次作为变量,这不会引起任何问题,但这不是一个好的做法。
import requests
from bs4 import BeautifulSoup

for page in range(1, 5):
    url =  f'https://www.milanuncios.com/ofertas-de-empleo-en-madrid/?dias=3&demanda=n&pagina={page}'
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    entradas_IDoffer = soup.find_all("div", class_="aditem CardTestABClass")

    for entrada in entradas_IDoffer:
        title = entrada.find("a", class_="aditem-detail-title").text.strip()
        ID = entrada.find("div", class_="x5").text.strip()
        location = entrada.find("div", class_="list-location-region").text.strip()
        content = entrada.find("div", class_="tx").text.strip()
        
        print(title, ID, location, content)