requests+selenium+pyquery+threading实现LOL所有装备图片爬取保存
程序员文章站
2022-05-28 23:26:10
...
注意:
- chrome的chromedriver.exe文件需要和代码放在同一路径下,有了chromedriver才能使用selenium驱动浏览器,根据浏览器版本,在http://npm.taobao.org/mirrors/chromedriver/下载chromedriver
- 本环境为python3.5版本之后,需要安装好pyquery、selenium、requests模块
pip install pyquery pip install requests pip install selenium
话不多说,上代码,对应的关键位置我都注释了。
# coding=utf-8
import requests
from threading import Thread
from pyquery import PyQuery as pq
from selenium import webdriver
import time
# 利用pyquery解析网页标签,获取需要的装备名字,以及img src地址
def get():
driver = webdriver.Chrome()
driver.get(url)
driver.implicitly_wait(10)
doc = pq(driver.page_source) # 使用selenium加载获取网页的源码,使用requests是无法直接获取得到装备的标签的
lis = doc("#jSearchItemDiv li")
for li in lis.items():
imgsrc = li('img').attr('src') # 装备图片的url地址
name = li('p').text() # 装备的名称
yield {'imgsrc': imgsrc, 'name': name}
time.sleep(5)
driver.close()
# 保存图片到当前路径,需要以‘wb’模式新建文件,写入获取的流数据res.content
def save_pic(data):
with open(r'.\%s.png' % data.get('name'), 'wb') as f: # 定义保存格式,装备名+.png
try:
res = requests.get(data.get('imgsrc'), headers=headers)
content = res.content
f.write(content)
print('%s 保存完成.....' % data.get('name'))
except Exception as e:
print(e)
# 多线程运行函数,其实用不用多线程都很快,毕竟数据很小
def run():
datas = get()
tasks = [Thread(target=save_pic, args=(data, )) for data in datas]
for t in tasks:
t.start()
for t in tasks:
t.join()
if __name__ == '__main__':
headers = {"User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)"}
url = "https://lol.newyx.net/data/item/"
run()
最终保存效果:图片太多,只截图部分…
喜欢的新手小伙伴可以拿去玩一下…
推荐阅读