前言
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
作者:程式員喧嘯
本文使用了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()
運行程式之后,我們發現了好多好看的小姐姐保存在了我創建的檔案夾里面,哇,沒想到一打開一張就是一個背影殺手呀,我這該死的運氣,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61875.html
標籤:Python
