如何使用Python 3并行下载和解析HTML文件?

时间:2019-07-13 16:29:43

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

我试图从Internet将一长串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下载到单独的文件中并分别但并行地进行解析。

1 个答案:

答案 0 :(得分: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_ulrs_to_parse])