王者荣耀皮肤壁纸爬取

------废话不多说,直接写思路
------我是用浏览器驱动来写的(直接用request也可以,不过要记得UA伪装),然后通过xpath解析,最后保存到文件夹里面。 至于我为什么用浏览器驱动而不用request,文末我会解释。

网址:https://pvp.qq.com/web201605/wallpaper.shtml

爬取思路:首先获得网页,其次得到图片的list(如下图)
在这里插入图片描述
接下来,我们对第一个div解析(如下图),我们发现这个图片只是215✖120,必然是个小图片,不是我们需要的。因此,我们还要找。
在这里插入图片描述
我们从网页来看(见下图)我们把鼠标放上去,对应右边的代码部分我们发现是可以对应起来的,也就是说,我们找这个是正确的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述接下来无非是把解析到的list用for循环走一遍。不过,这只是第一页的图片,我们把页面拉到最后,我们发现一共有25页,对应着我们外层还要25个for循环。思路到此为止,接下来我们看代码部分
在这里插入图片描述

首先,实例化一个驱动对象
bro = webdriver.Chrome(executable_path="chromedriver.exe")

其次,通过bro.page_source获得到页面的代码(这里就是我为什么说request也可以。这一步可以写成request.get(url,headers).text)

再然后,就是xpath解析了

获取英雄的div列表
hero_div=tree.xpath('//*[@id="Work_List_Container_267733"]/div')

对list循环获取每一个图片的名称以及二进制文件


img_name=div.xpath('./img/@alt')[0]+".jpg"
img_data=requests.get(url=img_url,headers=headers).content
img_path="../王者荣耀壁纸/"+img_name

最后就是保存,紧接着,系统会自动运行下一个外层的for循环,下面就是时间问题了

 with open(img_path,"wb") as f :
     f.write(img_data)

关于为什么不用线程池:线程池确实可以加快速度,但是我之前设置太多了,结果ip地址被封了,用代理也不行,哎!说多了都是泪,只能一次一次来了

为什么我喜欢用浏览器自动化而不是用request:首先,仁者见仁智者见智,我仅发表我个人看法
①request有时候解析到之后你需要注意编码,可能原来网页得编码是gbk而你得pycharm是utf-8,这就需要转译得过程,虽说转译并不是很难,一句话得事,但还是容易引起下面得代码编写
②其次,request需要UA伪装吧,浏览器自动化完全就是以一个浏览器得方式去访问得,实际上已经伪装过了
综上诉说,是我懒,嘿嘿嘿

#-*-coding:utf-8-*-
from selenium import webdriver
from lxml import etree
import requests
import os
import time

headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36 SLBrowser/6.0.1.9171"}
bro = webdriver.Chrome(executable_path="chromedriver.exe")

if __name__ == '__main__':
    if not os.path.exists("../王者荣耀壁纸"):
        os.mkdir("../王者荣耀壁纸")

    bro.get("https://pvp.qq.com/web201605/wallpaper.shtml")
    for i in range(1,25):

        page_text=bro.page_source

        tree=etree.HTML(page_text)
        hero_div=tree.xpath('//*[@id="Work_List_Container_267733"]/div')
        # // *[ @ id = "Work_List_Container_267733"]
        for div in hero_div:
            img_url_list=div.xpath('./ul/li[6]/a/@href')
            if img_url_list==[]:
                print("获取失败")
                break
            else:
                img_url=img_url_list[0]

                img_name=div.xpath('./img/@alt')[0]+".jpg"
                img_data=requests.get(url=img_url,headers=headers).content
                img_path="../王者荣耀壁纸/"+img_name

                with open(img_path,"wb") as f :
                    f.write(img_data)
                    print(F"{img_name}\t下载成功")
            time.sleep(1)
        bro.find_element_by_class_name("downpage").click()

bro.close()

最后,附上我写的代码,页欢迎各位大佬的指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值