Python爬取斗图啦,妈妈再也不会担心我无图可刷了

本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新。

一、概况

我们终于把Request网络请求库和Xpath解析库的基本用法学的差不多了,终于可以爬一些自己想爬的网站了。那我们拿什么网站做入门案例呢?好像刷图表情挺火的,那么从爬取表情的网站入手,爬取我们自己想要的表情,做一个刷图达人。我想让我的硬盘这样:


image

因为我太想进步了。


在这里插入图片描述

二、分析

我们爬取一个叫斗图啦(https://www.doutula.com/photo/list/)的网站,来爬取他们的最新表情。

网站描述

  • URL分析
    因为表情有很多,网站都会做分页处理,首先我们先分析出URL地址的变化,就是下面这个样子:
    第一页:https://www.doutula.com/photo/list/?page=1
    第二页:https://www.doutula.com/photo/list/?page=2
    第三页:https://www.doutula.com/photo/list/?page=3

  • 表情图片地址提取分析

    通过查看浏览器源代码,我们大概发现了图片所在的标签以及图片的地址。
    注意:有的图片是GIF类型,而有的图片是JPG类型。

    在这里插入图片描述

    通过在浏览器Xpath插件分析,提取了下面图片地址:
    在这里插入图片描述

    但是我们发现里面有些是静态图片资源,我们在上面也看到图片地址有三个,那么我们在来看看其他属性是否能提取出网络图片地址。
    在这里插入图片描述

    通过用data-original属性提取,这次我们发现里面没了静态资源,都是网络图片地址,这个好像可以用。

三、实现

下面是大概逻辑实现:

import requests
from lxml import etree


class DouTuLaSpider():

    def __init__(self):
        # 默认第一页开始
        self.pn = 1
        # 默认URL
        self.url = 'https://www.doutula.com/photo/list/?page='

        # 添加请求头,模拟浏览器
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
        }

    # 发起请求
    def loadpage(self):
        # 拼接请求地址
        req_url = self.url + str(self.pn)  # https://www.doutula.com/photo/list/?page=1

        # 发起请求
        reponse = requests.get(url=req_url, headers=self.headers)

        # 用UTF-8进行编码
        content = reponse.content.decode('utf-8')

        # 构造xpath解析对象
        html = etree.HTML(content)

        # 先取出这个div下面的所有a标签
        a_list = html.xpath('//div[@class="page-content text-center"]//a')

        for a in a_list:
            # 在从当前的a标签取下面的img标签的data-original属性,取返回列表的第一个值。注意前面有个.
            img_url = a.xpath('./img/@data-original')[0]

            print(img_url)


if __name__ == "__main__":
    dtls = DouTuLaSpider()
    dtls.loadpage()

#打印
https://ws4.sinaimg.cn/bmiddle/9150e4e5gy1g0sad0axupj204t0410sj.jpg
https://ws4.sinaimg.cn/bmiddle/9150e4e5gy1g0sad1qossg206o06ca9x.gif
https://ws4.sinaimg.cn/bmiddle/9150e4e5gy1g0sacyw5wwj207806mmxc.jpg
https://ws1.sinaimg.cn/bmiddle/9150e4e5gy1g0sacxbehoj205d05dq2w.jpg
https://ws4.sinaimg.cn/bmiddle/9150e4e5gy1g0sacu8fy7j20b40b40sv.jpg
https://ws1.sinaimg.cn/bmiddle/9150e4e5gy1g0sacqc75fj205i058aaz.jpg
https://ws3.sinaimg.cn/bmiddle/9150e4e5gy1g0sacso1lbj20u00tamyx.jpg
https://ws1.sinaimg.cn/bmiddle/9150e4e5gy1g0sacod9zzg206o06o40v.gif
https://ws4.sinaimg.cn/bmiddle/9150e4e5gy1g0sachx559j20zk0k0wgo.jpg
......

第一页所有的表情图片地址,我们已经全部爬取下来了,接下来就是把爬取图片地址通过发送网络请求下载到本地,这个时候我们需要考虑两个问题:

  • 图片的名字怎么命名?
    在这里插入图片描述

    我们在去看了一下源代码,发现alt属性的值可以当做图片的名字,所以在爬取图片地址的时候也需要把alt属性的值提取出来。
  • 图片的后缀是什么?
    因为我们有图片的网络地址,我们可以通过字符串截取,把图片地址的后缀截取下来。

两个问题实现:

import requests
from lxml import etree
import os


class DouTuLaSpider():

    def __init__(self):
        # 默认第一页开始
        self.pn = 1
        # 默认URL
        self.url = 'https://www.doutula.com/photo/list/?page='

        # 添加请求头,模拟浏览器
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
        }

    # 发起请求
    def loadpage(self):
        # 拼接请求地址
        req_url = self.url + str(self.pn)  # https://www.doutula.com/photo/list/?page=1

        # 发起请求
        reponse = requests.get(url=req_url, headers=self.headers)

        # 用UTF-8进行编码
        content = reponse.content.decode('utf-8')

        # 构造xpath解析对象
        html = etree.HTML(content)

        # 先取出这个div下面的所有a标签
        a_list = html.xpath('//div[@class="page-content text-center"]//a')

        for a in a_list:
            # 在从当前的a标签取下面的img标签的data-original属性,取返回列表的第一个值。注意前面有个.
            img_url = a.xpath('./img/@data-original')[0]
            # 图片名字
            img_name = a.xpath('./img/@alt')[0]

            print(img_url)

            #下载图片
            self.loadimg(img_url, img_name)

    #发起图片请求
    def loadimg(self, img_url, img_name):
        folder = 'doutu'#本地文件夹名字
        if not os.path.exists(folder):#如果文件夹不存在
            os.mkdir(folder)#创建文件夹

        # 拼接本地图片路径
        path = folder + "/" + img_name + img_url[-4::]

        # 发起图片请求
        reponse = requests.get(url=img_url, headers=self.headers)

        # 图片二进制数据
        content = reponse.content

        #保存图片
        self.saveimg(path,content)

    #保存图片
    def saveimg(self,path,content):
        with open(path,'wb') as f:
            f.write(content)


if __name__ == "__main__":
    dtls = DouTuLaSpider()
    dtls.loadpage()

最终的我的本地文件夹,装了许多我日思夜想的表情。这只是第一页,我们需要硬盘被装红的那种感觉,我们要实现多页爬取,先用循环代替吧~


在这里插入图片描述

我们在代码最下面加了一个循环,把每次的数值赋值给页码。这样就会不停的发送请求了。

if __name__ == "__main__":
    dtls = DouTuLaSpider()
    for i in range(1,100):#1-100页
        print('爬取第%d页'%i)
        dtls.pn = i #把每页赋值给pn
        dtls.loadpage()

不爬了,不爬了,图片太多。我的硬盘好像有点装不下了,最终我们让妈妈不用担心了。

四、总结

我们用一个简单的例子,入门了爬虫。爬虫入门相对比较简单,但是在爬取的时候也许我们需要考虑的几个点:

  • URL地址怎么变化?(动态网站先不考虑)
  • 提取内容在哪里?(先用xpath大概获取位置)
  • 请求的网站源代码跟浏览器里面的源代码是否有区别(以请求下来的源码为准)

欢迎关注我的公众号,我们一起学习。


欢迎关注我
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342