爬蟲入門(三)——動態網頁爬取:爬取pexel上的圖片

Pexel上有大量精美的圖片,沒事總想看看有什麼好看的自己保存到電腦裏可能會很有用

但是一個一個保存當然太麻煩了

所以不如我們寫個爬蟲吧(๑•̀ㅂ•́)و✧

一開始學習爬蟲的時候希望爬取pexel上的壁紙,然而自己當時不會

上週好不容易搞出來了,週末現在認真地總結一下上週所學的內容

也希望自己寫的東西可以幫到爬蟲入門滴朋友!


 

Before

同樣的,我們在寫一個爬蟲前要明確自己想要爬取的東西是什麼,明確下載目標數據在瀏覽器的操作如何

對於動態網頁的爬取,在網頁地址不變的情況下,我們首先要明確如何獲取AJAX請求

首先我們看看這個網站pexel

打開頁面後再Chrome瀏覽器中選擇“更多工具”→“開發者工具”→“Network”→XHR

1、看到Name那一欄中,找到每一次鼠標下滑瀏覽器發出的請求,任意點開一個請求;

2、在右側的Headers下拉

3、找到Query String Parameter這一欄,記住這裏的數據

等下用於構造請求

 

接下來,在腦海裏明確一下下載圖片的步驟

我們首先點開一張圖(要獲得這個圖的地址)→選擇下載圖片→獲得一個.jpeg結尾或者.png結尾的網頁,最後保存圖片

查看網頁源代碼可以發現在每一次動態生成的頁面中我們就可以直接獲取圖的下載地址

找到它,發現前綴是"https://images.pexels.com/photos/"+jpeg或者png




這時候我們可以考慮到,首先我們先獲得頁面的代碼
然後通過正則表達式去搜索符合條件的圖片
但是後面可能會有重複的地方,在獲取的list中最後再用set篩選一下即可。
明確上述思路後,接下來我們開始構建爬蟲


①初始化Headers☆
這一步非常重要,不構造headers會被禁止訪問= =
headers初始化代碼如下,用於將爬蟲僞裝成瀏覽器請求,而請求用於出發特定的AJAX內容
1 headers = {
2     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
3 
4 }
5 url="https://www.pexels.com/"

②構造動態AJAX請求
根據上述截圖中保存的Query String Parameter參數,我們構造request請求的時候捎上Params內容
把獲取的下載圖片的link保存到一個list中
 1 def get_next_page ():
 2     # ulist = []
 3     pic_data_list = []
 4     for i in range(1,100): # 構造動態訪問請求,注意那個seed最好就是和當下時間相近的時間,可以直接打開網頁copy一個來
 5         try:
 6             r=requests.get(url,params={'format': 'js','seed':'2019-04-20+07:55:52++0000','dark': 'true','page': i,'type':''},headers=headers,timeout = 0.5)
 7 
 8             print('the %s page is analyzing' % i)
 9 
10             pattern = re.compile(r'.*?https://images.pexels.com/photos/(.*?).jpeg.*?')
11             pic_list = re.findall(pattern,r.text)
12             pic_data_list.extend(pic_list)
13 
14         except:
15             pass
16 
17     return pic_data_list

③元素的篩選
一開始調試程序的時候發現獲取的link中還有以png形式結尾的link,這裏需要再對list進行二次篩選,保留可以下載圖片的link
最後還別忘了使用set把list中重複的元素刪去哦
 1 list_content=get_next_page()
 2 list_content=list(set(list_content))
 3 pattern = re.compile(r'.*?/pexels-photo-(.*?).png.*?')
 4 
 5 for i in range(len(list_content)):
 6     if(re.search(pattern,list_content[i])):
 7         list_content[i]=re.search(pattern,list_content[i]).group()
 8     else:
 9         list_content[i]=list_content[i]+'.jpeg'
10 
11 list_content=list(set(list_content))


④最後對於保存了每一張圖片的下載地址的list使用urllib.request.urlretrieve把圖片保存到指定路徑就可以啦
*pexel一開始還對每個圖片的下載地址整了反爬蟲機制,所以下載也要再構造一次headers模擬瀏覽器^_^
這一步可以單獨寫成一個函數,不過我貪方便就沒這麼寫
 1 x=1
 2 for i in list_content:
 3 
 4     try:
 5         url1 = "https://images.pexels.com/photos/"+i
 6         opener = urllib.request.build_opener()
 7         opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36')]
 8         urllib.request.install_opener(opener)
 9         request.urlretrieve(url1,"E://walkingbug/PAGE2/%r.jpg" % x)
10         print("the %s is downloaded." % url1)
11         x+=1
12     except error.HTTPError as e:
13         print(e.reason)
14     except error.URLError as e:
15         print(e.reason)
16     except:
17         pass

 



 

最後貼兩張運行結果圖

控制檯的輸出:

下載到本地的壁紙


完整代碼如下:
①爲了調試程序中間加了一些輸出語句
②如果要粘去直接用,記得通過打開頁面查看query string parameter修改23行代碼的seed內容!不然可能會爬不到東西
 1 import lxml.html
 2 import requests
 3 from urllib import request,error
 4 import urllib
 5 import re
 6 
 7 import time #用於爬取計時,後面不用也可以
 8 
 9 headers = {
10     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
11 
12 }
13 url="https://www.pexels.com/"
14 
15 searched_url=[]
16 start_time = time.time()
17 
18 def get_next_page ():
19     # ulist = []
20     pic_data_list = []
21     for i in range(1,100): # 構造動態訪問請求,注意那個seed最好就是和當下時間相近的時間,可以直接打開網頁copy一個來
22         try:
23             r=requests.get(url,params={'format': 'js','seed':'2019-04-20+07:55:52++0000','dark': 'true','page': i,'type':''},headers=headers,timeout = 0.5)
24 
25             print('the %s page is analyzing' % i)
26 
27             pattern = re.compile(r'.*?https://images.pexels.com/photos/(.*?).jpeg.*?')
28             pic_list = re.findall(pattern,r.text)
29             pic_data_list.extend(pic_list)
30 
31         except:
32             pass
33 
34     return pic_data_list
35 
36 list_content=get_next_page()
37 list_content=list(set(list_content))
38 pattern = re.compile(r'.*?/pexels-photo-(.*?).png.*?')
39 
40 for i in range(len(list_content)):
41     if(re.search(pattern,list_content[i])):
42         list_content[i]=re.search(pattern,list_content[i]).group()
43     else:
44         list_content[i]=list_content[i]+'.jpeg'
45 
46 list_content=list(set(list_content))
47 for i in list_content:
48     print(i)
49 print(len(list_content))
50 
51 x=1
52 for i in list_content:
53 
54     try:
55         url1 = "https://images.pexels.com/photos/"+i
56         opener = urllib.request.build_opener()
57         opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36')]
58         urllib.request.install_opener(opener)
59         request.urlretrieve(url1,"E://walkingbug/PAGE2/%r.jpg" % x)
60         print("the %s is downloaded." % url1)
61         x+=1
62     except error.HTTPError as e:
63         print(e.reason)
64     except error.URLError as e:
65         print(e.reason)
66     except:
67         pass

 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章