python抓取动态网页(代码最大的瓶颈并不在于你想多进程来爬?)
优采云 发布时间: 2021-12-30 18:03python抓取动态网页(代码最大的瓶颈并不在于你想多进程来爬?)
然后就可以设置上面的模板了。
完整模板列表(python):
def main(start_url,data_selector,next_page_selector):
current_url = start_url
while True:
# 下载页面
page = ......getdata(current_url)
# 根据我们定义的selector选择感兴趣的页面元素列表
data_list = page.selector(data_selector)
# 如果这个页面选择不到元素了,说明我们已经读取完了
# 也可以计算页面元素数量的最大值,比如你第一页爬到了10个元素
# 当你到了第N页,你只爬到了2个,说明这就是最后一页了
if len(data_list) == 0:
break
# 对每一个元素,我们把它放进另一个函数中读取
for data in data_list:
claw_data_from_detail_page(data.getattr("href"))
# 当这一页完成的时候,我们就更新一下当前页面的url地址,
# 回到while loop最开始的地方开始下一页
current_url = page.selector(next_page_selector).getattr("href")
def claw_data_from_detail_page(url):
# 详细页面就具体问题,具体分析了。。。。。。。。
跟进:
有人会问,我觉得这个单线程太慢怎么办?我想在多个进程中爬行?
其实上面代码最大的瓶颈不是main,而是你每次发布详细任务的claw_data_from_detail_page(url)。因此,你可以在这个子功能中做文章,比如:
我们不直接在这个子函数中下载内容,而是将其放入队列或数据库中。如果可能的话,我们可以搞N台机器去下载具体的内容。所以你有一个主/从结构。master是运行MAIN函数的机器,slave从你的master机器的数据库中获取url,然后抓取机器的详细数据。
注意:不要在main函数中下载data的内容,这里只需要获取你感兴趣的元素列表即可。因为这类爬虫最大的瓶颈就是下载每个详情页的时间。main函数本身也不会太慢,因为每次运行一个循环,都会发布N个claw_data_from_detail_page任务。所以主函数不需要多线程,只要子函数取数据的功能做好就可以了。您可以获得快速高效的抓取页面。
此外:
安利,我写的chrome插件,可以帮你自动找到上面的data_selector和next_page_selector。这个插件目前是alpha,功能有点不完善,但是对于*敏*感*词*这种结构非常统一的来说已经足够了。
直接从github下载:
GitHub-huangwc94/scraping-helper-chrome-extension: Scraping Helper 将帮助您找到某些元素的最佳 html/css 选择器
谷歌插件库下载:
/webstore/detail/%E6%95%B0%E6%8D%AE%E6%8A%93%E5%8F%96%E5%88%86%E6%9E%90%E5%B7%A5%E5% 85%B7/kmghfpaenbmakjffjhjncacmhagadgbg