【问题标题】:Fix BeautifulSoup code to get data from all pages and output into csv修复 BeautifulSoup 代码以从所有页面获取数据并输出到 csv
【发布时间】:2022-01-02 09:50:33
【问题描述】:

完全的初学者。请帮忙。我有这段代码,当我没有尝试输出到 .csv 而是在那里有一个打印命令时它起作用了——所以我没有最后两行或任何与变量“数据”相关的东西。 “工作”是指它打印了所有 18 页的数据。

现在它将数据输出到 .csv 但仅从第一页 (url)。

我看到最后我没有将 nexturl 传递给 pandas - 因为我不知道该怎么做。非常感谢您的帮助。

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = 'https://www.marketresearch.com/search/results.asp?qtype=2&datepub=3&publisher=Technavio&categoryid=0&sortby=r'


def scrape_it(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.text, 'html.parser')
    nexturl = soup.find_all(class_="standardLinkDkBlue")[-1]['href']
    stri = soup.find_all(class_="standardLinkDkBlue")[-1].string
    reports = soup.find_all("tr", {"class": ["SearchTableRowAlt", "SearchTableRow"]})
    data = []

    for report in reports:
        data.append({
               'title': report.find('a', class_='linkTitle').text,
               'price': report.find('div', class_='resultPrice').text,
               'date_author': report.find('div', class_='textGrey').text.replace(' | published by: TechNavio', ''),
               'detail_link': report.a['href']
        })

    if 'next' not in stri:
        print("All pages completed")
    else:
        scrape_it(nexturl)

    return data

myOutput = pd.DataFrame(scrape_it(url))
myOutput.to_csv(f'results-tec6.csv', header=False)

【问题讨论】:

    标签: python web-scraping beautifulsoup export-to-csv


    【解决方案1】:

    data 设为全局,这样您就可以在循环过程中继续添加它,而不是重新创建。然后让你的递归函数在DataFrame() 调用之外被调用,这样你就可以将data 传递给pandas。

    最后,您可以传递一个 cookie 以获得每个请求的最大可能结果,以减少请求的数量。

    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    
    url = 'https://www.marketresearch.com/search/results.asp?qtype=2&datepub=3&publisher=Technavio&categoryid=0&sortby=r&page=1'
    
    data = []
    
    def scrape_it(url):
        page = requests.get(url, headers = {'Cookie':'ResultsPerPage=100'})
        soup = BeautifulSoup(page.text, 'html.parser')
        nexturl = soup.find_all(class_="standardLinkDkBlue")[-1]['href']
        stri = soup.find_all(class_="standardLinkDkBlue")[-1].string
        reports = soup.find_all("tr", {"class": ["SearchTableRowAlt", "SearchTableRow"]})
        
        for report in reports:
            data.append({
                   'title': report.find('a', class_='linkTitle').text,
                   'price': report.find('div', class_='resultPrice').text,
                   'date_author': report.find('div', class_='textGrey').text.replace(' | published by: TechNavio', ''),
                   'detail_link': report.a['href']
            })
    
        if 'next' not in stri:
            print("All pages completed")
        else:
            scrape_it(nexturl)
    
    scrape_it(url)
    myOutput = pd.DataFrame(data)
    myOutput.to_csv(f'results-tec6.csv', header=False)
    

    【讨论】:

    • 哇,非常感谢。完美运行,我已经了解了 Python 中的数据范围。还要感谢您期待我关于每页结果的问题。我看到它与 cookie 一起工作,但我认为我需要启动一个会话来执行此操作,所以我安装了 HTMLSession 并询问是否将它用于您看到的确切目的。这很棒,它确实加快了抓取时间!
    猜你喜欢
    • 2017-08-12
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2019-02-24
    • 2021-01-01
    相关资源
    最近更新 更多