王者荣耀英雄图片爬取

pyquery库

https://pyquery.readthedocs.io/en/latest/ 官方文档

https://github.com/gawel/pyquery github

  • 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的文本