关于批量爬取wallhaven的解析+源码

一.本文介绍

wallhaven是一个可以获取免费图片的优秀资源网站,由于网站资源开源因此对我们爬虫的初学者来说比较友好。代码也比较简短,大家可以一起看看。

二.主要内容

在此我将逐段向大家解释源码的构成(本文并未用到多线程多进程进行爬取)

1.首先介绍一下我们接下来将会用到的库

import requests
from lxml import etree
import os

第一个便是我们大家熟知的requests库了,它用来帮助我们请求网页内容。第二行所导入的库将用来进行xpath的数据内容清洗。第三个os库将用来创建文件夹。

2.接下来是我们目标网页各组照片的url的获取

#url我们将用for循环的形式给到函数 
def get_href(url,headers):
    r = requests.post(url=url,headers=headers)
    
    #进行数据清洗
    et = etree.HTML(r.text)

    #括号里的内容直接在网页中复制xpath即可
    hrefs = et.xpath('/html/body/section/div[3]/div/div/div/a/img/@src')
    
    index = []  #给每个网址按顺序加上索引
    for q in range(1, len(hrefs)):
        index.append(q)
    #将索引和网址用字典进行一一对应的封装
    dic = dict(zip(index,hrefs))
    return dic

3.接下来是数据的保存,我们将创建一个大文件夹,把爬取到的每套数据放在一个下边的小文件夹中。

    def Down_data(headers):
        #接收一下上边函数所传出的数据
        dic = get_href(url,headers)
        #处理一下由于文件夹可能重复被建而报错的异常
        try:
            #建一个文件夹
            os.mkdir(f"E:\\爬虫\\pics\\wallhaven\\{page}")
        except:
            pass
        #把获取到的各个图片的网址传入进行保存
        for index,href in dic.items():
            req = requests.get(url=href,headers=headers).content
            with open(f'E:\\爬虫\\pics\\wallhaven\\{page}\\{index}.jpg',mode='wb')as f:
                f.write(req)
                print('正在下载',page,'    ',index)

    Down_data(headers)

4.在上边代码完成后,传入hreders,url便可以进行数据的爬取了

下边我们将加上for循环进行多页爬取

#加上防盗链以及UA伪装
headers = {
    'referer': 'https://www.so.com/s?ie=utf-8&src=hao_360so_b_cube&shb=1&hsid=e9d239476ff95ce7&q=%E6%B7%98%E5%AE%9D%E7%BD%91.',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
#通过for循环遍历出多个目标网址
for page in range(100):
    url = f'https://wallhere.com/zh/user/14286?order=popular&page={page}'

三.让我们将上边所以代码组合一下,可以得到该次爬取的源码如下:

import requests
from lxml import etree
import os


headers = {
    'referer': 'https://www.so.com/s?ie=utf-8&src=hao_360so_b_cube&shb=1&hsid=e9d239476ff95ce7&q=%E6%B7%98%E5%AE%9D%E7%BD%91.',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
for page in range(100):
    url = f'https://wallhere.com/zh/user/14286?order=popular&page={page}'
    def get_href(url,headers):
        r = requests.post(url=url,headers=headers)
        et = etree.HTML(r.text)
        hrefs = et.xpath('/html/body/section/div[3]/div/div/div/a/img/@src')
        index = []
        for q in range(1, len(hrefs)):
            index.append(q)
        dic = dict(zip(index,hrefs))
        return dic

    def Down_data(headers):
        dic = get_href(url,headers)
        try:
            os.mkdir(f"E:\\爬虫\\pics\\wallhaven\\{page}")
        except:
            pass
        for index,href in dic.items():
            req = requests.get(url=href,headers=headers).content
            with open(f'E:\\爬虫\\pics\\wallhaven\\{page}\\{index}.jpg',mode='wb')as f:
                f.write(req)
                print('正在下载',page,'    ',index)

    Down_data(headers)
    # for i in range(5):
    #     t = threading.Thread(target=Down_data)
    #     time.sleep(0.1)
    #     t.start()

希望这个简单的小爬虫可以帮助到大家,如果有什么问题我们可以一起交流一下!

你可能感兴趣的:(爬虫,网络爬虫,python,贴图)