爬虫实战-爬取wallhaven图片(小白入门)

(最近学业课程较为紧张,码代码的时间比较紧,利用零散时间终于做完了此次爬取)

作为爬虫小白,代码偏向简单,大佬勿喷~
本次爬取网站: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开发者工具,随便选中一幅图,发现有两个链接,第一个为缩略图可直接下载,第二个为原图,点开后会进入单图页面不能直接下载。我们选择第二个。

爬虫实战-爬取wallhaven图片(小白入门)_第1张图片
2.观察网页源代码,原图url确实都在 (a class=“preview”)中,使用BeautifulSoup和正则表达式获取ID,存储到pic_id列表中。

爬虫实战-爬取wallhaven图片(小白入门)_第2张图片
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问题。
爬虫实战-爬取wallhaven图片(小白入门)_第3张图片
pic_id
爬虫实战-爬取wallhaven图片(小白入门)_第4张图片
下载进度
爬虫实战-爬取wallhaven图片(小白入门)_第5张图片
下载的图片(小部分下载失败)
爬虫实战-爬取wallhaven图片(小白入门)_第6张图片

你可能感兴趣的:(爬爬爬,Python)