Glidedsky第二关详细解答(结合进程池)

第二关是解决1000个分页数字加减的问题,比第一关多了一个翻页的步骤。
翻页只要用到requests.get的params参数即可。不多说,直接上代码:

import requests
from lxml import etree
import re

number_lists = []
url='http://www.glidedsky.com/level/web/crawler-basic-2'
headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36',
        'Cookie': '***'
    }
for i in range(1,1001):
    params = {
        'page': '%s' % i
    }
    html=requests.get(url,headers=headers,params=params).content.decode()

Cookie处依然是从浏览器复制,注意Cookie具有时效性,如果隔几天要再次运行需要更新Cookie。

接着使用xpath定位到数字:

	tree = etree.HTML(html)
    find_num = tree.xpath("//*[@id='app']/main/div[1]/div/div/div/div/text()")
    find_nums = "".join(find_num)
    number_list = re.findall('\d+', find_nums)
    number_lists.extend(number_list)
    print('正在导入第%s页的数据'%i)

导入的过程比较漫长,所以我们可以写一个print来查看到底进行到哪一步。

最后就是制作一个计数器来得出结果:

sum=0
for number in number_lists:
    number=int(number)#转化为长整型才可以加减
    sum=number+sum
print(%sum)

但是!对于1000次请求,耗费的时间非常漫长,我们可以试着使用进程池加快效率。

纵观整个程序,发现get请求是一个阻塞的操作,我们把它放进进程池,多个进程同时进行。

from multiprocessing.dummy import Pool

i_list=[]
for i in range(0,1001):
    i_list.append(i)
pool = Pool(6)
number_lists = pool.map(get_num, i_list)

先把i做成可迭代对象,然后使用map函数进行进程池搭建,最后得到的number_lists是一个嵌套列表,处理后即可使用。

关于嵌套列表的遍历,可以查看我写的另一篇文章。

进程池能够明显缩短程序运行的时间,具体开放的个数视个人电脑的性能而定。注意慎用,过度使用进程池可能对目标服务器造成压力从而影响其他用户的访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值