【问题标题】:Scraping across multiple pages using ThreadPoolExecutor使用 ThreadPoolExecutor 跨多个页面抓取
【发布时间】:2020-11-10 02:58:27
【问题描述】:

我需要了解在使用 ThreadPoolExecutor 对页面进行迭代抓取时什么不起作用:

with ThreadPoolExecutor(max_workers=10) as executor:
    with requests.Session() as req:
        fs = [executor.submit(main, req, num) for num in range(1, 2050)]
        allin = []
        for f in fs:
            f = f.result()
            if f:
                allin.extend(f)
                print("\n", allin)
       

我想在特定链接的所有页面上抓取一些信息(标题、摘要和日期)。上面的代码提交了主派。我在运行时没有收到任何错误,但缺少新闻/页面。

import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
import pandas as pd


def main(req, num):
    r = req.get(
        website+"/pag/{}/".format(num))
    soup = BeautifulSoup(r.content, 'html.parser')
    stories = soup.select("div.story-content-pull")
    data = []
    for story in stories:
        row = []
        row.append(story.select_one('a').text)
        row.append(story.select_one('p').text.strip())
        row.append(story.select_one('time').text)
        data.append(row)
        return data

如果您能告诉我代码中的问题,那将非常有帮助。

【问题讨论】:

    标签: python web-scraping beautifulsoup threadpoolexecutor


    【解决方案1】:

    我认为这可能与您使用ThreadPoolExacutor 的方式有关。我已经清理并简化了您的代码。此外,还有2050 页面,但您的代码中缺少一个,因为range() 的停止值是专有的。

    试试这个:

    from concurrent.futures import ThreadPoolExecutor
    
    import requests
    from bs4 import BeautifulSoup
    
    
    def main(num):
        page = requests.get("https://www.cataniatoday.it/cronaca/pag/{}/".format(num))
        stories = BeautifulSoup(page.content, 'html.parser').select("div.story-content-pull")
        return [
            [
                story.select_one('a').text,
                story.select_one('p').text.strip(),
                story.select_one('time').text,
            ] for story in stories
        ]
    
    
    if __name__ == "__main__":
        with ThreadPoolExecutor(max_workers=10) as executor:
            for result in [executor.submit(main, num) for num in range(1, 2051)]:
                print(result.result())
                # do more stuff here
    

    这会按照文章在网站上的顺序解析文章。使用较小的页面范围进行测试,例如 1 - 6

    【讨论】:

    • 我认为代码有问题。它仍然没有收集每页的所有信息。我选择了一个小范围,但我可以看到即使在第一页中也缺少一些信息。你能确认一下吗?
    • 你能分享一个缺少什么的例子吗?
    • 这些是正在抓取的一些数据:Date 0 stamattina, 11:48 1 ieri mattina, 09:30 2 venerdì pomeriggio, 16:06 3 giovedì pomeriggio, 15:44 4 mercoledì scorso, 15:20 5 martedì scorso, 12:12 ,例如,如果您转到第 1 页,则缺少最新消息(例如,大约 4 ore fa),并且其他一些新闻(例如,一个 stamattina、11:06 等)
    猜你喜欢
    • 2019-02-16
    • 2017-03-28
    • 2016-08-09
    • 2021-09-30
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多