不會哄女朋友?來,教你爬搞笑圖片

河北一枝花發表於2020-11-17

今日雞湯

美麗的藍圖落在懶漢手裡,也不過是一頁廢紙。

今天我們要爬取糗事百科中的圖片,網站

案例分析

我們做爬蟲首先需要找規律,在這其中最喜歡的就是分頁欄了。有分頁欄就代表當你按下一個頁碼的時候,HTML 頁面會發起請求。有請求就肯定有資料,有資料就一定能抓到。

好,接下來回歸正題~

我們開啟這個網站,快速的將滾動條拖動到最下面,看到了我們最喜歡的分頁欄
在這裡插入圖片描述
接下來我們開啟瀏覽器抓包工具,觀察瀏覽器位址列,分析是否為非同步請求。
在這裡插入圖片描述

簡簡單單同步請求,肯定用了 get 方法,既然為同步請求,我們就需要解析 HTML 頁面,獲取每個 img標籤中的 src 屬性。

接下來繼續觀察瀏覽器位址列中的規律,當我們在第一頁的時候為
https://www.qiushibaike.com/imgrank/ 這個地址。
我們切換至第二頁為 https://www.qiushibaike.com/imgrank/page/2/ 這個地址。
這其中有些規律。那將最後的數字改為 3 訪問到的頁面就是第三頁。

好啦,html 跳轉的規律和 HTML 請求方式,我們都已經知曉。

接下來解析 HTML 頁面,在瀏覽器中右擊檢視桌面原始碼。

然後使用開發者工具中的元素定位,定位一張圖片。
在這裡插入圖片描述
在這裡插入圖片描述
上圖中紅框框出的部分為圖片的 url 地址,綠框中為圖片預覽。可以將 url 複製下來到頁面原始碼中分析。
在這裡插入圖片描述
在原始碼中的位置我們知道了,接下來只需要使用一種技術獲取到就可以啦。
可選的技術有:

  • xpath
  • bs4
  • 正則

這裡我選擇正則,因為每個 img 標籤的相似度極高,可以批量使用。
如下圖所示:
在這裡插入圖片描述
圖中紅框的部分為相同部分,綠框部分為不同部分,橙底為背景的為我們要取出的部分。

這裡需要注意,獲取的 src 屬性需要新增 https: 字首。

好啦,分析完畢啦,接下來 Let’s Coding~

開碼

  • 第一步:匯入所需模組
  • 第二步:使用者輸入爬取第幾頁的內容,或者定義爬取多少圖片
  • 第三步,設定 url
  • 第四步:發請求
  • 第五步:解析返回資料
  • 第六步:儲存圖片

引入 requestsreos

標題中的三個模組分別為:請求模組,正規表示式模組,系統模組

import requests, re, os

建立資料夾

# 判斷存圖片的資料夾是否存在
if not os.path.exists('./imgs'):
	os.mkdir('./imgs')

使用者動態指定爬取圖片

headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63'
}
url = 'https://www.qiushibaike.com/imgrank/'
# 由使用者控制爬取第幾頁的內容
url = url+'page/'+input('想爬取第幾頁?')

發請求並解析資料

respones = requests.get(url = url, headers= headers).text
# 正則規則,.*?為任意內容,(.*?) 為取出的內容,其中可以為任意內容
ex = '<div class="thumb">.*?<img src="(.*?)" alt="'
# 資料清洗,獲取圖片的地址,陣列形式
urls = re.findall(ex,respones,re.S)

為獲取的圖片連結發請求並儲存圖片

for i in range(0,len(urls)):
	#為每個圖片新增https字首
	urls[i] = 'https:'+urls[i]
	#發請求
	img = requests.get(url = urls[i],headers=headers).content
	# 解析圖片名稱
	img_name = str(urls[i]).split('/')[-1]
	with open('./imgs/'+img_name,'wb') as fp:
		fp.write(img)
	print(img_name+'儲存成功!')

完整程式碼

import requests,re,os
#引入 os 模組方便資料夾操作

if __name__ == '__main__':

    # 判斷存圖片的資料夾是否存在
    if not os.path.exists('./imgs'):
        os.mkdir('./imgs')

    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63'
    }
    url = 'https://www.qiushibaike.com/imgrank/'

    # 由使用者控制爬取第幾頁的內容
    url = url+'page/'+input('想爬取第幾頁?')

    # response中為網頁原始碼
    respones = requests.get(url = url, headers= headers).text

    # 正則規則
    ex = '<div class="thumb">.*?<img src="(.*?)" alt="'
    # 資料清洗,獲取圖片的地址
    urls = re.findall(ex,respones,re.S)

    for i in range(0,len(urls)):
		#為每個圖片新增https字首
        urls[i] = 'https:'+urls[i]
		#發請求
        img = requests.get(url = urls[i],headers=headers).content
        # 解析圖片名稱
        img_name = str(urls[i]).split('/')[-1]
        with open('./imgs/'+img_name,'wb') as fp:
            fp.write(img)
        print(img_name+'儲存成功!')

相關文章