python來爬取煎蛋網隨手拍小姐姐圖片
前言
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。
作者:程式設計師喧嘯
本文使用了requests模組進行傳送請求,使用了BeautifulSoup模組對網頁進行解析,在使用之前首先安裝這兩個第三方庫;方法如下:
1.安裝requests庫
pip install requests
2. 安裝bs4庫
pip install bs4
PS:如有需要Python學習資料的小夥伴可以加下方的群去找免費管理員領取
可以免費領取原始碼、專案實戰視訊、PDF檔案等
首先
我們開啟煎蛋網,看到了首頁上面有資訊---隨手拍,而我們的主要任務就是爬取隨手拍的圖片將其進行儲存。
忘了說,網址是這個
http://jandan.net/ooxx/MjAyMDA4MDctMTMz#comments
接下來
開始分析網頁原始碼,提取相關資訊。那我們以什麼樣的思路來進行爬蟲的設計呢?稍加思考,聰明的你立即有了想法,我們首先爬取整張網頁的資訊,之後在該網頁中提取原圖的儲存地址,最後通過請求圖片的地址,將圖片進行儲存。我們大體上有了一個思路,開始最有趣並且好玩的程式碼編寫吧。
- 首先右擊頁面選擇審查元素(快捷鍵為Fn+F12),之後再點選左上角的定位符號來定點陣圖片被存在哪一個標籤裡面。
- 其次我們要將該頁面的原始碼爬取下來,以便於下一步解析網頁,直接上程式碼來分析。
對以下程式碼的註釋:
- 我們可以看到定義了一個函式get_totle_page(url),說的高大上一點,我們採用了模組化的程式設計思想;
- 此處我們說另外一個高大上的名詞,即UA偽裝,現在好多網站都建立了反爬蟲機制,UA偽裝便是為了告訴瀏覽器我們的身份是一個瀏覽器,而不是一個爬蟲,防止被限制訪問。
- global headers 由於接下來我們需要訪問圖片的地址,傳送請求資訊將其儲存下來,所以我們將headers定義為全域性變數,方便請求圖片的時候使用。
- 很明顯,程式中我們還加入了異常處理機制,可以這麼理解,當程式連線失敗的時候進行異常處理,返回值為None。
def get_totle_page(url):global headers headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36' } try: response = requests.get(url ,headers =headers) if response.status_code == 200: return response.text except requests.ConnectionError: print("請求資料失敗!!!") return None
通過以上的操作,我們發現圖片儲存在<div id = "comments">裡面的<ol class= "commentlist">下的每個<li>標籤裡面。其原圖的地址儲存在<li>裡面的<div class = "text">下的<p>標籤中的<a class = "view_img_list">標籤的屬性值"href"中。
這一步是將圖片的地址連結解析出,我的想法是建立一個空列表totle_list = []進行儲存圖片的地址連結。還是一樣的風格,簡單粗暴,直接上程式碼。
我們使用的是BeautifulSoup來解析網頁,先來“煲一鍋湯”
soup = BeautifulSoup(html,"lxml")
前面我們分析了圖片的具體儲存的標籤位置,下面進行解析:
div = soup.find('div',attrs = {'id':'comments'}) ol_list = div.find(name = 'ol') for ol in ol_list.find_all(name = 'li'): try: text_list = ol.find('div',attrs = {'class':'text'}) #print(text_list) global a_list a_list = 'http:' + text_list.p.a['href'] #print(a_list) totle_list.append(a_list) except: pass #print(totle_list) return totle_list
需要特別說明的一點,在煎蛋網隨手拍的網頁上面有廣告資訊,然而廣告資訊也儲存在<li>標籤裡面,所以在解析的過程我們需要跳過儲存廣告的<li>標籤進行解析圖片,所以我們加入了異常處理機制,若<li>標籤裡面沒有<div class = "text">,直接跳過該標籤,解析下一個<Li>標籤。
最後,我們將儲存著圖片地址的連線都儲存在了列表totle_list裡面。
再下來
我們就需要將解析的圖片地址連結進行二進位制資料的本地儲存了,為了保持我們一貫的整潔作風,咳咳咳,此處需要來一張圖修飾一下······
我們建立一個資料夾來存放所有的照片。
有意無意的插上一句,os庫是python的內建庫,在使用之前不需要特殊進行安裝,呼叫即可。
if not os.path.exists('./picture_Libs'): os.mkdir('./picture_Libs')
接下來進行請求圖片的地址連結,將圖片進行本地的儲存。
- 迴圈遍歷請求totle_list裡面儲存的圖片的地址連結,圖片是二進位制檔案,所以使用了response.content。
- img_path = './picture_Libs/' + totle.split('/')[-1]
對於該語句是說明了圖片的本地儲存地址,我們選的是新建的資料夾下面,用split()語句以“/”對地址連線進行分割,選擇分割之後的最後一部分作為圖片的名字來進行儲存。
for totle in totle_list: try: response = requests.get(url=totle, headers=headers) if response.status_code == 200: response.encoding = response.apparent_encoding img_data = response.content except TimeoutError: print('請求超時!!!') img_path = './picture_Libs/' + totle.split('/')[-1] #print(img_path) with open(img_path,'wb') as fp: fp.write(img_data)
最後
我們通過主函式將我們的各個功能模組串聯起來,話不多說,上完整程式碼啦。
- 我爬取的url是"http://jandan.net/ooxx/MjAyMDA4MDctMTI" +str(i) + "#comments"
- 在爬取煎蛋網隨手拍的時候,可自行去觀察url的不同,來尋找規律,來構建url進行爬取。
import requests from bs4 import BeautifulSoup import lxml import os def get_totle_page(url): global headers headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36' } try: response = requests.get(url ,headers =headers) if response.status_code == 200: return response.text except requests.ConnectionError: print("請求資料失敗!!!") return None def get_content_page(html): soup = BeautifulSoup(html,"lxml") totle_list = [] div = soup.find('div',attrs = {'id':'comments'}) ol_list = div.find(name = 'ol') for ol in ol_list.find_all(name = 'li'): try: text_list = ol.find('div',attrs = {'class':'text'}) #print(text_list) global a_list a_list = 'http:' + text_list.p.a['href'] #print(a_list) totle_list.append(a_list) except: pass #print(totle_list) return totle_list def save_img_list(message): if not os.path.exists('./picture_Libs'): os.mkdir('./picture_Libs') for totle in message: try: response = requests.get(url=totle, headers=headers) if response.status_code == 200: response.encoding = response.apparent_encoding img_data = response.content except TimeoutError: print('請求超時!!!') img_path = './picture_Libs/' + totle.split('/')[-1] #print(img_path) with open(img_path,'wb') as fp: fp.write(img_data) def main(): for i in range(6): url = "http://jandan.net/ooxx/MjAyMDA4MDctMTI" +str(i) + "#comments" html = get_totle_page(url) message = get_content_page(html) #print(html) save_img_list(message) if __name__ == "__main__": main()
執行程式之後,我們發現了好多好看的小姐姐儲存在了我建立的資料夾裡面,哇,沒想到一開啟一張就是一個背影殺手呀,我這該死的運氣。