Python爬取鬥圖啦,媽媽不再會擔憂我無圖可刷了

本文同步發表於個人微信公衆號,掃一掃文章底部的二維碼或在微信搜索 極客導航 便可關注,每一個工做日都有文章更新。html

1、概況

咱們終於把Request網絡請求庫和Xpath解析庫的基本用法學的差很少了,終於能夠爬一些本身想爬的網站了。那咱們拿什麼網站作入門案例呢?好像刷圖表情挺火的,那麼從爬取表情的網站入手,爬取咱們本身想要的表情,作一個刷圖達人。我想讓個人硬盤這樣: python

由於我太想進步了。
在這裏插入圖片描述

2、分析

咱們爬取一個叫鬥圖啦(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類型。 ide

    在這裏插入圖片描述
    經過在瀏覽器Xpath插件分析,提取了下面圖片地址:
    在這裏插入圖片描述
    可是咱們發現裏面有些是靜態圖片資源,咱們在上面也看到圖片地址有三個,那麼咱們在來看看其餘屬性是否能提取出網絡圖片地址。
    在這裏插入圖片描述
    經過用data-original屬性提取,此次咱們發現裏面沒了靜態資源,都是網絡圖片地址,這個好像能夠用。

3、實現

下面是大概邏輯實現:學習

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()

複製代碼

最終的個人本地文件夾,裝了許多我日思夜想的表情。這只是第一頁,咱們須要硬盤被裝紅的那種感受,咱們要實現多頁爬取,先用循環代替吧~ url

在這裏插入圖片描述
咱們在代碼最下面加了一個循環,把每次的數值賦值給頁碼。這樣就會不停的發送請求了。

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

複製代碼

不爬了,不爬了,圖片太多。個人硬盤好像有點裝不下了,最終咱們讓媽媽不用擔憂了。

4、總結

咱們用一個簡單的例子,入門了爬蟲。爬蟲入門相對比較簡單,可是在爬取的時候也許咱們須要考慮的幾個點:

  • URL地址怎麼變化?(動態網站先不考慮)
  • 提取內容在哪裏?(先用xpath大概獲取位置)
  • 請求的網站源代碼跟瀏覽器裏面的源代碼是否有區別(以請求下來的源碼爲準)

歡迎關注個人公衆號,咱們一塊兒學習。

在這裏插入圖片描述