最近剛學了python的爬蟲,那今天就寫個簡單的,一目瞭然
前言
最近剛學了python的爬蟲,剛好可以用來爬取漂亮的圖片作為桌布,網上美圖網站有很多,比如:花瓣,堆糖。它們請求圖片資料的方式差不多類似,都是通過使用者不斷下滑載入新的圖片,這種請求技術就叫做Ajax,全稱為 Asynchronous JavaScript and XML,即非同步載入資料、資源。
PS:如有需要Python學習資料的小夥伴可以加下方的群去找免費管理員領取
可以免費領取原始碼、專案實戰視訊、PDF檔案等
所以今天就來寫個簡答的python小爬蟲來練練手,抓取堆糖上的圖片。
開啟堆糖網站
https://www.duitang.com
接著在輸入框輸入咱們感興趣的內容,進行搜尋,咱們的目標就是將搜尋結果裡的圖片爬取到本地硬碟上。
廢話不說,立即寫個程式碼來跑一跑。不過在寫程式碼前,咱們還是得先分析一下抓取資料的步驟。
首先,可以檢視上瀏覽器上的位址列,可以看出這個搜尋結果的網址構成還是挺有規律的,前面是堆糖的首頁網址,?後面是咱們的請求資料,請求資料裡面最關鍵的就是(kw="搜尋關鍵詞"),這是會根據咱們搜尋內容不同而改變的。
接著按鍵盤上的f12調出開發者工具,點選Network,再按f5重新整理下網頁進行資料重新請求,可以看到在Name的下拉框下有許多的請求檔案,咱們可以點選一個檔案進行檢視下里面請求頭資料,這是待會寫爬蟲非常重要的請求頭構造資料來源。
由於網站是通過非同步載入資料的方式來獲取圖片的,所以咱們要找到網站請求的json資料,關注到上邊的資源過濾器,當前選擇的是All,即所有的資原始檔。但是這麼多的資原始檔不是咱們都需要的,咱們只關注的是json資料,所以點選上面的XHR可以看到裡面是空白的,這時你可能會疑惑,咱們要的資料在哪呢?別急,前面說到網頁資料是非同步載入的,所以咱們只要不斷向下滾動滑鼠來載入新的圖片,這時就會發現Name下拉框下多了很多資原始檔,隨便選擇一個進行檢視,將滑鼠停留在資原始檔上時,會浮出一個url地址。咱們分析下這個url地址,這和前面的url地址有點像,但是複雜了很多。
看不出規律可以單擊下資原始檔,右邊視窗的Request URL行也有這個url,咱們多點選幾個檔案進行檢視,並將裡面url地址複製到文字上檢視。
可以看出這些url前面是都是相同的,唯一不同的是後面start和_不同。咱們待會寫程式碼時就構造這個url。
雙擊可以開啟這個url地址,裡面會是大段的json資料,裡面就有咱們要爬的的資料,不過密集恐懼症患者看後表示有點頭暈。當然還有另一個地方可以檢視這些資料。
單擊一個資原始檔,再點選右邊Preview,可以看到這裡面有許多資料,而咱們要的資料就是前面的json資料,黑色三角形是可以點選的,點選後會展開詳細的資料資訊。
通過檢視分析,這裡photo下面的path行應該就是咱們的圖片的url地址,也就是說只要將這個地址拿到,就可以進行圖片的爬取。
分析到這裡,就可以來寫咱們的程式碼,開啟pycharm,先匯入必要的庫。
from urllib.parse import urlencode
import requests
import time
import os
接著構造咱們的請求頭和每一頁的url。
base_url='https://www.duitang.com/napi/blog/list/by_search/?'
headers = {
'Host':'www.duitang.com',
'Referer':'https://www.duitang.com/search/?kw=%e7%be%8e%e5%a5%b3&type=feed',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'X-Requested-With':'XMLHttpRequest'
}
def get_page(start,count):
params={
'kw':'小姐姐',
'type':'feed',
'include_fields':'top_comments,is_root,source_link,item,buyable,root_id,status,like_count,like_id,sender,album,reply_count,favorite_blog_id',
'_type':'',
'start':start,
'_':count
}
url = base_url + urlencode(params)
try:
response = requests.get(url,headers=headers)
if response.status_code == 200:
return response.json()
else:
print("error")
except requests.ConnectionError as e:
print('Error',e.args)
獲取到圖片url就可以進行讀寫操作了。
def parse_page(json):
if json:
items = json.get('data').get('object_list')
for item in items:
data = {}
data['favorite_count'] = item.get('favorite_count');
item = item.get('photo')
data['path']=item.get('path'); ## 獲取圖片url地址
file_path = '{0}/{1}'.format('./'+download_dir, data['path'].split('/')[-1]) ## 將圖片寫入到本地硬碟上
with open(file_path, 'wb') as f:
img = requests.get(data['path'])
print(img)
f.write(img.content)
yield data
再寫個主函式,完成
start_page = 0 ## 從第幾頁開始爬
page_size = 5 ## 要爬多少頁
count = 1597729530322 ## 第1頁請求資料中下劃線的取值
download_dir = "downlode_img" ## 存放圖片資料夾名稱
if __name__ == '__main__':
count = 1597729530322 + start_page;
if not os.path.exists('./' + download_dir) :
os.mkdir('./' + download_dir); ## 建立資料夾
for start in range(start_page,page_size*24+1,24):
json = get_page(start,count)
results = parse_page(json)
for result in results:
print(result)
count += 1;
time.sleep(2) ## 每爬完一頁暫停2秒,減輕伺服器壓力
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。
作者:it新猿