王者荣耀英雄图片爬取
pyquery库
-
pyquery实际上是python中的jquery
-
安装
pip install pyquery
-
导入
from pyquery import PyQuery as pq
-
对象解析
urlparse = pq(url='https://www.baidu.com/') # urlparse = pq(url='https://www.baidu.com/',headers=USER_HEARDER) fileparse=pq(file='./test.html') # 本文不做过多阐述 reqparse = pq(req.text) #req = requests.get('https://www.baidu.com/') # 本文不做过多阐述
-
元素定位:直接使用css选择器
element = reqparse(css表达式).items() # .items()得到了一个generator 可以遍历获取每个元素
-
元素属性值/文本获取
- element.attr.属性名 # 如ele.attr.class就是获取class属性的值 # 这是获取元素属性方式1
- element.attr['属性名'] # 获取元素属性方式2
- element.text() # 获取元素的文本
示例代码1: 用pyquery爬
from pyquery import PyQuery as pq
import requests
from pathlib import Path
hero_url = pq(url='https://pvp.qq.com/web201605/herolist.shtml',encoding='gbk')
heros = hero_url('.herolist img').items()
Path('hero').mkdir(exist_ok=True)
for hero in heros:
img_url = 'https:' + hero.attr.src
hero_name = hero.attr.alt
with open(f'./hero/{hero_name}.png','wb') as f:
f.write(requests.get(img_url).content)
- 几点说明
- encoding要加,不然无法解析出html中的中文
- Path('hero').mkdir(exist_ok=True)只是为了在当前目录下创建一个hero的文件夹用来存放英雄图片
- hero.attr.src得到的url地址不全,要在前面加上协议信息
- 写文件的时候要用wb模式来写图片
- f.write应该塞一个二进制的对象,这个对象可以通过requests请求上面的url得到的响应的content来获取。
- 但是!这样下载下来的英雄图片是缺失的,只有93个。
- 截止到目前版本,王者已有113个,前面的一些英雄丢失了。(我的理解是延迟了?)
示例代码2: 用selenium爬
- 不解释了
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://pvp.qq.com/web201605/herolist.shtml')
driver.maximize_window() # 最大化窗口
driver.implicitly_wait(5) # 隐式等待5s, 定位元素的时候如果没找到,等5s
heros = driver.find_elements('css selector','.herolist img') # 找到所有的英雄
for hero in heros: # hero 就是某个英雄元素, 对应到selenium中是WebElement类型
img_url = hero.get_attribute('src') # 获取元素的src属性值
hero_name = hero.get_attribute('alt')
with open(f'./hero1/{hero_name}.png','wb') as f:
pic_content = requests.get(img_url).content
f.write(pic_content)
-
这样可以爬下来113个英雄
-
element.text() # 获取的是element的文本