继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

用python帮隔壁小张获取动漫壁纸

Python白白白白
关注TA
已关注
手记 18
粉丝 3
获赞 17

机缘巧合下得知小张的喜好二次元 美女 动漫 …图片做电脑壁纸, 而选择壁纸成为小张的难题
正好遇到我这种有乐于助人的精神的人, 怎不会出手相助呢?

咳咳…
image.png

步入正题

  • 以下本次所用到的模块
import requests # 用于请求
import time
import random
from lxml import etree
from fake_useragent import UserAgent # 伪造 User-Agent的值

以上缺少模块的小伙伴可通过以下安装

pip install 模块名

权限不足的加上sudo

sudo pip install 模块名

如:
缺少 lxml 模块可以使用
使用以下命令安装

pip install lxml

sudo pip install lxml

fake_useragent模块缺失
使用以下命令安装

pip install fake_useragent

或者也可以不用fake_useragent这个模块
可以到浏览器页面按F12调出开发人员工具, 后按F5刷新一下会得到很多请求如下:

F12

然后选择一个鼠标单击下会出现如图所示这里以火狐浏览器为例:
在这里插入图片描述

直接复制User-Agent这一项也可以使用的

User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0

注意:复制的需改成字典形式使用

headers = {"User-Agent": " Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0"}

谷歌浏览器则如图所示:
google

调出开发人员工具选择Network后同火狐浏览器操作即可

正篇来了

look


  • 定义主要功能函数
    def get_html(self, url):
        '''处理页面'''
        html = requests.get(url=url,
                            headers=self.headers).content.decode('gbk')  # 一些网页需要指定下编码

        return html

编码获取方法:
右键点击网页 —>查看页面源代码
一般都在这个<meta charset="gbk" /> 标签中有声明
注:这里以本次爬取的为例

gbk

  • 推荐了解一下xpath
    ?

可以去谷歌商店下载xpath插件, 方便验证和获取xpath

    def send_next(self, url):
        '''获取下层页面的url'''
        html = self.get_html(url=url)
        # element对象是xpath语法的使用对象,element对象可由html字符串转化
        # 这里利用etree.HTML()将html字符串转化为element对象
        obj = etree.HTML(html)

        # 目标获取下一层的大图
        imgs_url = obj.xpath('/html/body/div[2]/div/div[3]/ul/li/a/@href')

    def crawl(self):
        '''执行函数'''

        self.send_next(url=self.url)
        # 这里我们只需从第二页开始抓取
        for i in range(2, 148):
            page_url = f'http://pic.netbian.com/4kdongman/index_{i}.html'

            self.send_next(url=page_url)
            # 注意控制抓取频率
            time.sleep(random.randint(1, 4))

  • 多页获取
    对比一下每页url的区别

http://pic.netbian.com/4kdongman/
http://pic.netbian.com/4kdongman/index_2.html
http://pic.netbian.com/4kdongman/index_3.html

http://pic.netbian.com/4kdongman/index_147.html
多次比较 经过… 发现第2页到最后一页
每一页区别在于页数改变后 index_页数.html 中同页数一致

赞

了解完啦!可以上手了

完整代码

# -*- coding: UTF-8 -*-
'''
PyCharm
@Project : 
@File    :
@Author  :
@Date    :2021/1/7
'''

### 以下本次所用到的模块
import requests
import time
import random
from lxml import etree
from fake_useragent import UserAgent  # 伪造 User-Agent的值

# requests + xpath 爬取图片
class Image:
    def __init__(self):
        self.url = 'http://pic.netbian.com/4kdongman/'
        self.headers = {'User-Agent': UserAgent().random}
        self.item_url = 'http://pic.netbian.com'

    def get_html(self, url):
        '''处理页面'''
        html = requests.get(url=url,
                            headers=self.headers).content.decode('gbk')  # 一些网页需要指定下编码

        return html

    def send_next(self, url):
        '''获取下层页面的url'''

        html = self.get_html(url=url)

        ### 重要:页面中xpath不能全信, 一切以响应内容为主
        obj = etree.HTML(html)
        # 这里我们不获取小图
        # 目标获取下一层的大图
        # 先获取通往下层的url
        imgs_url = obj.xpath('/html/body/div[2]/div/div[3]/ul/li/a/@href')

        # imgs_url 获取的数据为
        # ['/tupian/26687.html', '/tupian/26686.html', ... ,'/tupian/26685.html']

        self.send_img(imgs_url)

    def send_img(self, imgs_url):
        '''获取大图'''

        for index in imgs_url:
            items_url = self.item_url + index
            # 大图的url为           
            # http://pic.netbian.com/tupian/26681.html

            # 拿取每个后缀 拼接得到完整的大图url
            html = self.get_html(url=items_url)

            element = etree.HTML(html)
            images = element.xpath('/html/body/div[2]/div[1]/div[2]/div[1]/div[2]/a/img/@src')
            self.data(images)

    def data(self, images):
        '''数据处理 存储图片'''
        for img in images:
            # 由于这里的图片可以直接访问到 就方便许多了
            html = requests.get(url=self.item_url + img).content
            # 这里图片命名以/分割 /uploads/allimg/210103/232202-16096873226fa1.jpg
            # 取分割后的最后一个命名图片
            with open(f'./img/{img.split("/")[-1]}', 'wb') as file:
                file.write(html)

    def crawl(self):
        '''执行函数'''
        # 注: 第1页 url为
        # http://pic.netbian.com/4kdongman/

        self.send_next(url=self.url)
        # 这里我们只需从第二页开始抓取
        for i in range(2, 148):
            page_url = f'http://pic.netbian.com/4kdongman/index_{i}.html'

            self.send_next(url=page_url)
            print('已换下一页开始抓取')
            # 注意控制抓取频率防止限制IP访问
            time.sleep(random.randint(1, 4))

# 程序入口
if __name__ == '__main__':
    image = Image()
    image.crawl()


打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP