python抓取动态网页(代码最大的瓶颈并不在于你想多进程来爬?)

优采云 发布时间: 2021-12-30 18:03

  python抓取动态网页(代码最大的瓶颈并不在于你想多进程来爬?)

  然后就可以设置上面的模板了。

  完整模板列表(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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线