如何使用Python 3并行下载和解析HTML个文件?
How to parallel download and parse HTML files using Python 3?
我试图从互联网上下载一长串 HTML 文件到我的计算机上,然后使用 BeautifulSoup 从我的计算机上抓取这些文件。说来话长,为什么我要先把它们保存到我的电脑上,然后再抓取,所以我不写文章来省去你的麻烦!
无论如何,对我来说,请求模块在处理许多 URL 时太慢了,所以我决定坚持使用 urllib 并使用 multiprocessing/threadpooling 来使请求函数 运行 并行(所以它比一个接一个地请求每个文件更快)。
我的问题是:我想做的是独立保存每个 HTML/URL - 也就是说,我想存储每个 HTML 文件 分开,而不是将所有HTML写入一个文件。虽然 multiprocessing 和 urllib 可以并行请求 HTML,但我找不到如何分别下载(或 save/write 到 txt)每个 HTML。
我正在想象类似于我在下面编写的一般示例,其中并行函数中的每个请求都将并行执行。
parallel(
request1
request2
request3
...
)
之所以希望它像这样,是因为我可以在下一步中使用相同的简单脚本结构:用 BeautifulSoup 解析 HTML。就像我在第一部分为每个 URL 设置单独的请求函数一样,我需要为每个 HTML 设置单独的解析函数,因为每个 HTML 的结构都不同。如果您有不同的解决方案,那也没关系,我只是想解释一下我的想法; 没有是这样的。
是否可以使用多处理(或任何其他库)来做到这一点(分别请求和分别解析)?我昨天花了一整天的时间在 Whosebug 上试图找到类似的问题,但很多涉及使用复杂的东西,如 eventlet 或 scrapy,并且 none 提到将每个 HTML 下载到单独的文件中并单独解析它们,但并行.
肯定有可能 (:
只需编写单线程函数,它将完成您从头到尾所需的一切,然后在多处理池中执行它,例如。
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])
我试图从互联网上下载一长串 HTML 文件到我的计算机上,然后使用 BeautifulSoup 从我的计算机上抓取这些文件。说来话长,为什么我要先把它们保存到我的电脑上,然后再抓取,所以我不写文章来省去你的麻烦!
无论如何,对我来说,请求模块在处理许多 URL 时太慢了,所以我决定坚持使用 urllib 并使用 multiprocessing/threadpooling 来使请求函数 运行 并行(所以它比一个接一个地请求每个文件更快)。
我的问题是:我想做的是独立保存每个 HTML/URL - 也就是说,我想存储每个 HTML 文件 分开,而不是将所有HTML写入一个文件。虽然 multiprocessing 和 urllib 可以并行请求 HTML,但我找不到如何分别下载(或 save/write 到 txt)每个 HTML。
我正在想象类似于我在下面编写的一般示例,其中并行函数中的每个请求都将并行执行。
parallel(
request1
request2
request3
...
)
之所以希望它像这样,是因为我可以在下一步中使用相同的简单脚本结构:用 BeautifulSoup 解析 HTML。就像我在第一部分为每个 URL 设置单独的请求函数一样,我需要为每个 HTML 设置单独的解析函数,因为每个 HTML 的结构都不同。如果您有不同的解决方案,那也没关系,我只是想解释一下我的想法; 没有是这样的。
是否可以使用多处理(或任何其他库)来做到这一点(分别请求和分别解析)?我昨天花了一整天的时间在 Whosebug 上试图找到类似的问题,但很多涉及使用复杂的东西,如 eventlet 或 scrapy,并且 none 提到将每个 HTML 下载到单独的文件中并单独解析它们,但并行.
肯定有可能 (: 只需编写单线程函数,它将完成您从头到尾所需的一切,然后在多处理池中执行它,例如。
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])