Glidedsky第二关详细解答(结合进程池)
程序员文章站
2022-12-20 19:51:29
第二关是解决1000个分页数字加减的问题,比第一关多了一个翻页的步骤。翻页只要用到requests.get的params参数即可。不多说,直接上代码:import requestsfrom lxml import etreeimport renumber_lists = []url='http://www.glidedsky.com/level/web/crawler-basic-2'headers={ 'User-Agent': 'Mozilla/5.0 (Windows...
第二关是解决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是一个嵌套列表,处理后即可使用。
关于嵌套列表的遍历,可以查看我写的另一篇文章。
进程池能够明显缩短程序运行的时间,具体开放的个数视个人电脑的性能而定。注意慎用,过度使用进程池可能对目标服务器造成压力从而影响其他用户的访问。
本文地址:https://blog.csdn.net/qq_45443898/article/details/113999386