Python爬取高质量壁纸
2020-04-04 本文已影响0人
弗罗伊德
本次选择抓取壁纸的网站为:pixel4K
分析网站结构
经过测试,在抓取网页信息时可以不用加请求头信息,但在后面下载图片时需要cookie信息。在首页选择一个分类后可以看到下面有分页选择:
image.png
点击下一页之后可以看到第一页和后面页地url区别
https://www.pixel4k.com/category/anime
https://www.pixel4k.com/category/anime/page/3
因此便可通过循环来实现动态翻页
先导入所需要的库:
import requests
import re
import os
import time
from bs4 import BeautifulSoup as bs
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36','cookie': '__cfduid=dbc4a25090b9c655e91440677115e64251585898884; _ga=GA1.2.2122477128.1585898921; _gid=GA1.2.1379899880.1585898921; sc_is_visitor_unique=rx11860127.1585918213.04A600EC165D4F38E07A021EBE303A26.5.3.3.2.2.2.2.2.2'
}
root='https://www.pixel4k.com/category/anime'
获取每一页的网页并进行网页请求:
htmls=[]
for idx in range(10):
if idx==0:
url='https://www.pixel4k.com/category/anime'
else:
url=f'https://www.pixel4k.com/category/anime/page/{idx+1}'
r=requests.get(url)
htmls.append(r.text)
在网页中检查元素以找到每一张图片链接,选择其中的一张图片
获取图片详情页链接
此处出现了两个与图片相关地链接,上面一个是图片详情页地址,下面src属性中的链接是这里地缩略图地址,不是我们想要的高清图地址。因此我们需要获取这个地址并进入,通过对比分析可以通过这里a标签下的rel和id属性利用find_all()函数唯一确定这个链接
pichtmls=[]
for html in htmls:
soup=bs(html,'lxml')
a=soup.find_all(attrs={'rel':'nofollow','id':'featured-thumbnail'})
for i in a:
pichtml=i.get('href')
pichtmls.append(pichtml)
点击一张图片进入详情页可以看到各种尺寸图片大小的下载链接,点击对应链接便可直接下载,因此我们在抓取图片时只需要拿到这个链接即可。
图片详情页
下面我们就看一下这个详情页的网页结构,看如何得到这个下载链接,进行元素检查,我们这里选择HD 4K的看一下
元素检查
可以看到这个3840*2160的图片下载链接包含在一个a标签的href属性里,但是这样的结构对于其他图片大小的下载链接也一样,而且是属于同一级的,但经过仔细地对比不难发现,这里与其他图片链接不同之处在于有一个class="blue",因此便可通过这个属性来确定所需要的图片链接:
picurls=[]
for h in pichtmls:
r1=requests.get(h).text
soup1=bs(r1,'lxml')
try:
span=soup1.find_all(class_='blue')
picurl=span[0].get('href')
print(picurl)
picurls.append(picurl)
except:
print('error')
之后便可开始下载,先建立一个文件夹
dir_name=root.split('/')[-1]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
n=0
for pic in picurls:
time.sleep(1)
fname=pic.split('/')[-1].split('&')[0]
response = requests.get(pic,headers=headers)
with open(dir_name + '/' + fname, 'wb') as f: #写入文件
f.write(response.content)
print(pic)
print('downloading:',fname)
n=n+1
print('Download successfully,Total:',n)
result