------废话不多说,直接写思路
------我是用浏览器驱动来写的(直接用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()
最后,附上我写的代码,页欢迎各位大佬的指正