【问题标题】:Python BeautifulSoup doesn't scrape any information and produces no errros or warningsPython BeautifulSoup 不会抓取任何信息,也不会产生错误或警告
【发布时间】:2020-11-13 09:44:15
【问题描述】:

我正在尝试使用 BeautifulSoup 从网站上抓取一些信息,但我遇到了很大的麻烦。我一直在寻找并试图弄清楚这几个小时,但我无法弄清楚。我正在尝试从 (https://www.duckduckgo.com/privacy) 中刮取公司的名称,并用粗体红色文本以及报价数量(描述底部的数字)。我知道代码目前只寻找“h2”而不是段落,我也知道完全匹配是一个超链接“a”但我找不到一次搜索多个类的解决方案一个标签,因为超链接的原始类是“class="link ng-binding"”,我不知道如何同时引用它们中的多个,所以我试图指出单个类“h2”标题其中包含超链接本身。这是我遇到问题的代码:

from urllib.request import urlopen
from bs4 import BeautifulSoup

# Scrape company names, offers

toScrape = "https://www.duckduckgo.com/privacy"

requestPage = urlopen(toScrape)
pageHTML = requestPage.read()
requestPage.close()

HTMLSoup = BeautifulSoup(pageHTML, 'html.parser')

scrapedItems = HTMLSoup.find_all('h2')

CSVExport = 'ConectHeader.csv'
save = open(CSVExport, 'w')

CSVHeaders = 'Price, stock\n'

for item in scrapedItems:
    company = item.find('h2', class_="title").text
    offers = item.find('p', class_="estates-cnt").text

    save.write(company + '' + stock)

我的 IDE 中没有收到任何错误甚至警告。该过程以退出代码 0 结束,但是当我打开最终的 .csv 文件时,它不包含任何信息。我无法弄清楚为什么输出没有保存到 csv 文件中。我还尝试通过打印运行它,打印返回“[]”这可能意味着问题不是由保存到 csv 文件中的数据直接引起的。感谢任何人对此提供任何帮助,因此我现在正在扯掉我的头发!

【问题讨论】:

    标签: python python-3.x beautifulsoup urllib urlopen


    【解决方案1】:

    BeautifulSoup 看不到动态呈现的内容,如本例所示。但是,您可以查询一个 API,它会返回您需要的所有数据。

    方法如下:

    import time
    
    import requests
    
    data = requests.get(f"https://www.sreality.cz/api/cs/v2/companies?page=2&tms={int(time.time() * 1000)}").json()
    
    for company in data["_embedded"]["companies"]:
        print(f"{company['url']} - {company['locality']}")
    

    打印出来:

    Sklady-cz-Praha-Stodulky - Praha, Stodůlky, Bucharova
    PATOMA-Praha-Nove-Mesto - Praha, Nové Město, Washingtonova
    Molik-reality-s-r-o-Most - Most, Moskevská
    ERA-Reality-Praha-Holesovice - Praha, Holešovice, Jankovcova
    LOKATIO-Praha-Zizkov - Praha, Žižkov, Kubelíkova
    REAL-SPEKTRUM-Brno-Veveri - Brno, Veveří, Lidická
    FARAON-reality-Praha-Vinohrady - Praha, Vinohrady, Polská
    108-AGENCY-s-r-o-Praha-Zizkov - Praha, Žižkov, Příběnická
    Realitni-spolecnost-Mgr-Jan-Vodenka-Praha-Nove-Mesto - Praha, Nové Město, Václavské náměstí
    RapakCo-s-r-o-Praha-Zizkov - Praha, Žižkov, Žerotínova
    Euro-Reality-Plzen-s-r-o-Plzen-Vychodni-Predmesti - Plzeň, Východní Předměstí, Šafaříkovy sady
    Happy-House-Rentals-s-r-o-realitni-kancelar-Praha-Vinohrady - Praha, Vinohrady, Uruguayská
    VIAGEM-servisni-s-r-o-Praha-Karlin - Praha, Karlín, Sokolovská
    I-E-T-Reality-s-r-o-Brno-Brno-mesto - Brno, Brno-město, náměstí Svobody
    RK-NIKA-realitni-kancelar-Semily - Semily, Sokolská
    FF-Reality-2014-s-r-o-Praha-Karlin - Praha, Karlín, Pernerova
    REALITY-PRORADOST-Breclav - Břeclav, Lidická
    ORCA-ESTATE-a-s-Kyjov - Kyjov, Jungmannova
    RAZKA-reality-Tachov - Tachov, náměstí Republiky
    LUXENT-Exclusive-Properties-Praha-Josefov - Praha, Josefov, Pařížská
    

    您可以更进一步,首先发出一个请求,获取结果总数,然后循环遍历每个页面。

    import time
    
    import requests
    
    api_endpoint = "https://www.sreality.cz/api/cs/v2/companies?"
    query = f"tms={int(time.time() * 1000)}"
    
    initial_request = requests.get(f"{api_endpoint}{query}").json()
    total_results = initial_request["result_size"]
    
    for page in range(1, total_results + 1):
        current_url = f"{api_endpoint}page={page}&tms={int(time.time() * 1000)}"
        data = requests.get(current_url).json()
        for company in data["_embedded"]["companies"]:
            print(f"{company['url']} - {company['locality']}")
    
    

    【讨论】:

      【解决方案2】:

      Selenium 比 BeautifulSoup 更好,更容易使用

      还有更多对 selenium 的支持

      【讨论】:

      • 我会调查的!性能怎么样?你说BeautifulSoup是领先还是落后?
      • 比汤快得多
      • @HazimArafa 声称selenium“比汤快得多”的理由是什么?你能提供一些基准吗?
      猜你喜欢
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多