王者荣耀官网https://pvp.qq.com/web201605/wallpaper.shtml壁纸的python爬取

链接: 王者荣耀壁纸官网.

遇到的问题

此网站的壁纸显示采用了动态网页技术,也就是说用爬取一般的静态网站的方法是不行的。笔者一开始就是妄图使用大名鼎鼎的requests库的get()方法来获取该网站的HTML源码,但是发现里面并没有想要的关于壁纸的信息。百度之后知道了问题的解决方法:就是弃用requests库,转战selenium库

神奇的selenium库

1.安装selenium库

pip install selenium

2.下载chromedriver.exe并将其放在你的谷歌浏览器chrome.exe所在目录。
3.导入selenium库中的webdriver,相当于模拟浏览器的运行

from selenium import webdriver

观察网页源代码(这一步很关键)

在浏览器中打开网址,按F12键,点击下图圈出的按键,然后随便点击一个壁纸图片
无
如下图,按1,2,3操作
在这里插入图片描述
复制元素后,粘贴观察,得到三处关键点

<div class="p_newhero_item">

<img
        data-src="http://shp.qpic.cn/ishow/2735010212/1577940124_84828260_1263_sProdImgNo_1.jpg/200"
        src="http://shp.qpic.cn/ishow/2735010212/1577940124_84828260_1263_sProdImgNo_1.jpg/0" width="215" height="120"
        alt="貂蝉-猫影幻舞"><a href="###" class="p_item_imghover">

<li class="sProdImgDown sProdImgL5"><a
                href="http://shp.qpic.cn/ishow/2735010212/1577940125_84828260_1263_sProdImgNo_5.jpg/0"
                rel="http://shp.qpic.cn/ishow/2735010212/1577940125_84828260_1263_sProdImgNo_5.jpg/200"
                target="_blank">

第1处,通过class属性可以找到关键位置;
第2处,通过img标签的alt属性可以设置壁纸的名字,如貂蝉-猫影幻舞
第3处,通过li标签的a标签的href属性可以得到1980*1080的壁纸网址(这才是灵魂所在啊)

代码

from selenium import webdriver
import time
from selenium.common.exceptions import StaleElementReferenceException

def get_img_data(img_url,file_name):#下载图片数据
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36"}
    try:
        r = requests.get(img_url, headers=headers, timeout=20)
        r.raise_for_status()
        if r.status_code == 200:
            with open(file_name, 'wb') as fw:
                fw.write(r.content)
    except Exception as e:
        print('Error: ', e)
        return

def get_list():#得到壁纸的网址列表
    es = driver.find_elements_by_class_name('p_newhero_item')
    for i in es:
        i.get_attribute('innerHTML')
        et = i.find_element_by_tag_name('img').get_attribute('alt')
        name_list.append(et)
        ee = i.find_elements_by_tag_name('li')
        for j in ee:
            if j.get_attribute('class') == 'sProdImgDown sProdImgL6':
                ui = j.find_element_by_tag_name('a')
                url_list.append(ui.get_attribute('href'))

def nextpage():#模拟浏览器点击下一页,从而得以继续爬取
    es = driver.find_element_by_id('Page_Container_267733')

    et = es.find_elements_by_tag_name('a')
    for u in et:
        if u.get_attribute('class') == 'downpage':
            print(u.get_attribute('alt'))
            u.click()

url='https://pvp.qq.com/web201605/wallpaper.shtml'

'''下面三行代码如果就会出现阻塞错误,没办法,加上就完事了'''
options=webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
driver=webdriver.Chrome(chrome_options=options)

driver.get(url)

url_list=[]#图片网址列表
name_list=[]#图片名字列表

for o in range(0,20):
    get_list()
    if o != 19:
        try:
            nextpage()
        except StaleElementReferenceException:#模拟点击下一页总会出现这个错误,所以加上此异常处理
            time.sleep(1)
            print('try to find element click')

num = len(name_list)
for t in range(0,num):
    path = 'tupian/'+name_list[t]+'.jpg'
    get_img_data(url_list[t],path)#开始下载图片
    print(path+' had been stored.')


input('Press ENTER to close the automated browser')
driver.quit()

第一次发博客嘻嘻!!!,大家见谅

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值