【问题标题】:How to parallel download and parse HTML files using Python 3?如何使用 Python 3 并行下载和解析 HTML 文件?
【发布时间】:2019-07-13 16:29:43
【问题描述】:

我试图从互联网上将一长串 HTML 文件下载到我的计算机上,然后使用 BeautifulSoup 从我的计算机上抓取这些文件。说来话长,为什么我想在刮之前先把它们保存到我的电脑上,所以我不写文章就省去了你的麻烦!

无论如何,对我来说,请求模块在处理许多 URL 时太慢了,所以我决定坚持使用 urllib 并使用多处理/线程池来使请求函数并行运行(因此它比一个接一个地请求每个文件要快)。

我的问题是:我想要做的是独立保存每个 HTML/URL - 也就是说,我想存储 每个 HTML 文件 单独,而不是写所有的 HTML 到一个文件中。虽然多处理和 urllib 可以并行请求 HTML,但我不知道如何分别下载(或保存/写入 txt)每个 HTML。

我正在想象类似于我刚刚在下面编写的一般示例,其中并行函数中的每个请求都将并行执行。

parallel(

request1
request2
request3
...

)

希望它是这样的原因是我可以在下一步使用相同的简单脚本结构:使用 BeautifulSoup 解析 HTML。就像我在第一部分中为每个 URL 设置单独的请求函数一样,我需要为每个 HTML 设置单独的解析函数,因为每个 HTML 的结构都不同。如果您有不同的解决方案,那也没关系,我只是想解释一下我的想法;它没有是这样的。

是否可以使用多处理(或任何其他库)来执行此操作(单独请求和单独解析)?昨天我花了一整天的时间在 StackOverflow 上试图找到类似的问题,但很多都涉及使用复杂的东西,比如 eventlet 或 scrapy,没有人提到将每个 HTML 下载到单独的文件中并单独解析它们,但并行进行。

【问题讨论】:

    标签: python-3.x web-scraping beautifulsoup parallel-processing urllib


    【解决方案1】:

    这是可能的(: 只需编写单线程函数,它会从头到尾完成您所需的一切,然后在多处理池中执行它。

    from multiprocessing import Pool
    
    def my_function(url_to_parse):
        request()...
        parse()...
        save_with_unique_filename()
        return result[optional]
    
    NUM_OF_PROCS = 10
    pool = Pool(NUM_OF_PROCS)
    pool.map(my_function, [list_of_urls_to_parse])
    

    【讨论】:

    • 嘿,非常感谢!这对请求很有用,并且可以加快速度!然而,关于解析部分,它并不能很好地工作,因为每个 URL/文档都有不同的结构,所以一个解析函数并不适用于所有人。如果我添加更多解析函数,它会在每个 URL 上尝试每个解析函数,使其不必要地变慢。如果您有任何克服这一点的想法,请告诉我!我可以发布另一个问题,你可以回答这个问题! :)
    • 这完全取决于你打算解析什么。如果您有固定数量的 html 模式,您可以在解析部分添加更多条件。如果您使用某种正则格式提取数据,则可以使用正则表达式。等等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多