几十行代码批量下载高清壁纸 爬虫入门实战

时间:2022-07-23
本文章向大家介绍几十行代码批量下载高清壁纸 爬虫入门实战,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

爬取图片

概述

电影桌面背景时间长了也会腻,换背景的话一般去网上下载又需要挑来挑去,一页一页的翻很烦人,能不能一次展示很多图片呢?省的一页一页看。比较简单的方法就是把图片存到本地,然后一次性看所有图片。本部分就是写一个没有任何复杂结构的爬虫去把网上的图片爬取到本地。

任务分析

需求是从网上获取一些比较好看的电脑壁纸,采用爬虫的实现策略。

1.找到需要爬取的图片网站,在这里我以彼岸图网为例

2.选择恰当的爬取方式,由于本任务过于简单,因此就直接写一个爬虫就行。

爬虫设计

说是设计,其实就是说一下爬虫的基本构成。爬虫一般分为几步(这里把步骤拆分到最小)。

1.确认你抓取目标的url(核心在于查找),这部分一般观察即可,要注意首页的重定向问题。

2.使用Python代码发送请求获取数据(java go)

3.解析获取到的精确数据, 找到新的目标(新的url)回到第一步(自动化)

4.数据持久化(保存到本地)

爬虫实现

在实现时,我直接把数据解析和数据存储放在了一起,你也可以拆分为两个方法。

对于刚刚接触爬虫的人而言,难点在于如何从一堆代码中找到自己需要的内容。

数据解析一般分为三类:正则表达式、xpath、bs4.推荐后两种,当然如果是大佬也可以使用第一种,我个人倾向于使用xpath,因此下文也是使用xpath实现的。本项目是我当时作为入门项目做的,很适合新手入门

import urllib
import os
import requests
from bs4 import BeautifulSoup
from lxml import etree
import json


class PicSpider(object):
    def __init__(self):
        self.base_url = "http://pic.netbian.com/4kdongwu/index_{}.html"
        self.headers = {
            # 浏览器版本
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) "
                          "Chrome/14.0.835.163 Safari/535.1",
        }

    # 1.构建所有url
    def get_url_list(self):
        url_list = []
        for i in range(2, 4):
            url = self.base_url.format(i)
            url_list.append(url)
        return url_list

    # 2.发送请求
    def send_request(self, url):
        print(url)
        data = requests.get(url, headers=self.headers).content.decode('gbk')
        return data

    # 3.解析存储数据
    def parse_data(self, data):
        tree = etree.HTML(data)
        li_list = tree.xpath("//div[@class='slist']//li")
        for li in li_list:
            pic_name = li.xpath('./a/b/text()')[0]
            pic_url = 'http://pic.netbian.com' + li.xpath('./a/img/@src')[0]
            print(pic_url)
            pic_path = './imgs/' + pic_name + '.jpg'
            urllib.request.urlretrieve(url=pic_url, filename=pic_path)

    def start(self):
        if not os.path.exists('./imgs'):
            os.mkdir('./imgs')
        url_list = self.get_url_list()
        # 循环遍历请求
        for url in url_list:
            data = self.send_request(url)
            self.parse_data(data)


PicSpider().start()

在初始化时,有一个参数叫User-Agent,该参数被称为请求头,有些网站(几乎没有)中可以不用请求头,所以这个参数可以称之为必填参数,获取地方在你的浏览器network下。

由于这个网站就是的Url的变化在index_{}这,所以base_url定义为:

self.base_url = "http://pic.netbian.com/4kdongwu/index_{}.html"

在步骤1中,就是利用for循环构建所要访问的url列表,range(开始页,终止页)。

在请求时采用第三方模块requests,其实应该要会Python自带的urllib的request,毕竟这个是原生的。

解析数据就是采用xpath解析的。

由于在src下获取的是url的一部分,因此多了url的二次拼接,也就是第38行的代码

pic_url = 'http://pic.netbian.com' + li.xpath('./a/img/@src')[0]

接着就是创建一个文件夹存储就ok了。

结果展示

运行过程中为了显示获取进度,可以把url打印出来。

结果存在同级目录下的imgs文件夹下。