(最近学业课程较为紧张,码代码的时间比较紧,利用零散时间终于做完了此次爬取)
作为爬虫小白,代码偏向简单,大佬勿喷~
本次爬取网站:https://wallhaven.cc/toplist
本次所用工具:requests,re,BeautifulSoup
首先先吐槽,在爬取过程中时不时会遇到SSLError: HTTPSConnectionPool的问题,在网上搜索了解决方法,尝试了删除header但无效果。最后在requests.get()后加verify = False,虽然会warning但解决了error。其中的原理还不清楚。
requests.get(url = url,headers = header,verify = False)
开始正题。
wallhaven主页,里面很多精美的图片值得收藏!
1.进入Chrome开发者工具,随便选中一幅图,发现有两个链接,第一个为缩略图可直接下载,第二个为原图,点开后会进入单图页面不能直接下载。我们选择第二个。
2.观察网页源代码,原图url确实都在 (a class=“preview”)中,使用BeautifulSoup和正则表达式获取ID,存储到pic_id列表中。
3.获取ID后进入单图片页面,观察源代码搜索img,发现有三个片段,其中第三个的src为图片下载url。思考可以先使用items = soup.find_all()然后再选取items[2]获取下载url。url存储在picHTML列表中。
4.遍历picHTML,开始下载!
import requests
import re
import time
from bs4 import BeautifulSoup
'''
总思路:
0.在”https://wallhaven.cc/toplist“加“?page=页数”可进行翻页
1.使用Chrome开发工具,发现在主页有两种图片的url,一个为缩略图可直接下载,一个为原图,需要进入下载。此次选择下载原图。
2.观察网页源代码,原图url在中,使用BeautifulSoup和正则表达式获取ID。
3.获取ID后进入单图片页面,发现有3个带有标签的片段,其中第三个片段的src为图片下载url。
4.获取下载url后便可下载到制定文件夹中。
'''
'''
函数说明:
getPic_ID():获取每张图的ID
getPic_HTML():获取每张图的url
Download():根据url下载并保存图片
'''
def getPic_ID(pic_id, page, header):
url = "https://wallhaven.cc/toplist?page="+str(page)
r = requests.get(url = url,headers = header,verify = False)
soup = BeautifulSoup(r.text, 'html.parser')
for tag in soup.find_all("a",class_="preview"):
picURL = re.findall('href="https://wallhaven.cc/w/(.*?)"',str(tag))
pic_id.append(picURL[0]) #findall元素问列表,我们的目的是存储str类型的id
print(pic_id)
return pic_id
def getPic_HTML(picHTML, pic_id, page, header):
for i in range(len(pic_id)):
pic_url2='https://wallhaven.cc/w/'+pic_id[i]
try:
r = requests.get(url = pic_url2, headers = header,verify = False)
#print(r.text)
soup = BeautifulSoup(r.text, 'html.parser')
items = soup.find_all('img')
picHTML.append(items[2].attrs['src']) #第3个是可下载的url
print("第"+str(page)+"页第"+str(i)+"张图片url获取成功")
except:
print("第"+str(page)+"页第"+str(i)+"张图片url获取失败")
# for i in range(len(picHTML)):
# print(picHTML[i])
return picHTML
def Download(picHTML, page):
path = 'D:/pycode/python123demo/python123demo/spiders/pictures/' #路径自行设定
for i in range(len(picHTML)):
html = picHTML[i]
img_name = path + str(page)+"-"+str(i)+'.png' #图片名称
try:
data = requests.get(picHTML[i])
with open(img_name, 'wb') as file:
file.write(data.content)
file.flush()
print("第"+str(page)+"页第"+str(i)+"张图片下载完成")
except:
print("第"+str(page)+"页第"+str(i)+"张图片下载失败")
print("第"+str(page)+"页爬取完成")
def main():
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1'
}
for page in range(1,6):#此为1~5页,自行设定
pic_id = [] #每张图片的id列表
picHTML = [] #每张图片的下载url列表
getPic_ID(pic_id, page, header)
getPic_HTML(picHTML, pic_id, page, header)
Download(picHTML, page)
main()
加了verify=False后每次获取url都会报warning,有点烦。待更好的办法解决SSLError问题。
pic_id
下载进度
下载的图片(小部分下载失败)