我所做的只是根据别人代码进行优化,加快爬虫效率,网页解析啥玩意的并,反爬啥的就不是本问考虑范围
多协程爬虫
协程原理及解析参考这篇文章Python并发编程
改善后的版本协程版
# 1.导入所需模块
import requests, sys
from fake_useragent import UserAgent
from tqdm import tqdm
from gevent import monkey
monkey.patch_all()
from gevent.pool import Pool
ua = UserAgent()
# 2.读取json文件
url = 'http://pvp.qq.com/web201605/js/herolist.json'
headers = {'User-Agent': ua.random} # 添加用户代理
response = requests.get(url, headers=headers)
json_list = response.json()
# print(len(json_list)) # 英雄总数量:95个英雄
# print(json_list) # 打印结果,了解json_list的构造
def get_pic_url():
try:
# 3.提取json文件,下载图片
for m in range(len(json_list)):
# 英雄编号
hero_num = json_list[m]['ename']
# 英雄名称
hero_name = json_list[m]['cname']
# 获取皮肤列表
skin_name = json_list[m]['skin_name'].split('|')
# 统计皮肤数量
skin_count = len(skin_name)
# print('英雄名称:', hero_name, ' 皮肤数量:', skin_count) # 打印英雄的皮肤数量
# 遍历每一个图片网址
for i in range(1, skin_count + 1):
# 网址拼接, 构造完整的图片网址
url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' # 图片网址固定前缀
url_pic = url + str(hero_num) + '/' + str(hero_num) + '-bigskin-' + str(i) + '.jpg'
# 获取图片信息
yield url_pic, hero_name, skin_name[i - 1]
except KeyError:
# 捕获异常:解决皮肤名称全部打印完成后会报错的问题
print('程序执行完毕!')
sys.exit()
def download_pic(url_pic, hero_name, skin_name):
picture = requests.get(url_pic, headers=headers).content
# print(picture) # 打印图片网址
# 下载图片 文件路径为: pic/英雄名-皮肤名.jpg (需要新建pic文件夹)
with open('pic/' + hero_name + ' - ' + skin_name + '.jpg', 'wb') as f:
f.write(picture)
if __name__ == '__main__':
pool = Pool(8)
for heroinfo in tqdm(get_pic_url()):
pool.spawn(download_pic, heroinfo[0], heroinfo[1], heroinfo[2])
用协程可以很大程度上利用网络带宽,但其实想这样做无疑需要考虑反爬,这个例子网站反爬没那么强