Python爬蟲:設置Cookie解決網站攔截並爬取螞蟻短租

前言

文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。html

做者: Eastmount瀏覽器

PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取cookie

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef網絡

咱們在編寫Python爬蟲時,有時會遇到網站拒絕訪問等反爬手段,好比這麼咱們想爬取螞蟻短租數據,它則會提示「當前訪問疑似黑客攻擊,已被網站管理員設置爲攔截」提示,以下圖所示。此時咱們須要採用設置Cookie來進行爬取,下面咱們進行詳細介紹。很是感謝個人學生承峯提供的思想,後浪推前浪啊!函數

一. 網站分析與爬蟲攔截

當咱們打開螞蟻短租搜索貴陽市,反饋以下圖所示結果。 在這裏插入圖片描述 咱們能夠看到短租房信息呈現必定規律分佈,以下圖所示,這也是咱們要爬取的信息。 在這裏插入圖片描述學習

經過瀏覽器審查元素,咱們能夠看到須要爬取每條租房信息都位於<dd></dd>節點下。 在這裏插入圖片描述 在定位房屋名稱,以下圖所示,位於<div class="room-detail clearfloat"></div>節點下。 在這裏插入圖片描述網站

接下來咱們寫個簡單的BeautifulSoup進行爬取。ui

 1 # -*- coding: utf-8 -*-
 2 import urllib
 3 import re 
 4 from bs4 import BeautifulSoup
 5 import codecs
 6  
 7 url = 'http://www.mayi.com/guiyang/?map=no'
 8 response=urllib.urlopen(url)
 9 contents = response.read()
10 soup = BeautifulSoup(contents, "html.parser")
11 print soup.title
12 print soup
13 #短租房名稱
14 for tag in soup.find_all('dd'):
15     for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):
16         fname = name.find('p').get_text()
17         print u'[短租房名稱]', fname.replace('\n','').strip()

 

但很遺憾,報錯了,說明螞蟻金服防範措施仍是挺到位的。 在這裏插入圖片描述url

二. 設置Cookie的BeautifulSoup爬蟲

添加消息頭的代碼以下所示,這裏先給出代碼和結果,再教你們如何獲取Cookie。spa

 1 # -*- coding: utf-8 -*-
 2 import urllib2
 3 import re 
 4 from bs4 import BeautifulSoup
 5  
 6  
 7 #爬蟲函數
 8 def gydzf(url):
 9     user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
10     headers={"User-Agent":user_agent}
11     request=urllib2.Request(url,headers=headers)
12     response=urllib2.urlopen(request)
13     contents = response.read() 
14     soup = BeautifulSoup(contents, "html.parser")
15     for tag in soup.find_all('dd'):
16         #短租房名稱
17         for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):
18             fname = name.find('p').get_text()
19             print u'[短租房名稱]', fname.replace('\n','').strip()
20         #短租房價格
21         for price in tag.find_all(attrs={"class":"moy-b"}):
22             string = price.find('p').get_text()
23             fprice = re.sub("[¥]+".decode("utf8"), "".decode("utf8"),string)
24             fprice = fprice[0:5]
25             print u'[短租房價格]', fprice.replace('\n','').strip()
26             #評分及評論人數
27             for score in name.find('ul'):
28                 fscore = name.find('ul').get_text()
29             print u'[短租房評分/評論/居住人數]', fscore.replace('\n','').strip()           
30             #網頁連接url           
31             url_dzf = tag.find(attrs={"target":"_blank"})
32             urls = url_dzf.attrs['href']
33             print u'[網頁連接]', urls.replace('\n','').strip()
34             urlss = 'http://www.mayi.com' + urls + ''
35             print urlss
36  
37 #主函數
38 if __name__ == '__main__':
39     i = 1
40     while i<10:
41         print u'頁碼', i
42         url = 'http://www.mayi.com/guiyang/' + str(i) + '/?map=no'
43         gydzf(url)
44         i = i+1
45     else:
46         print u"結束"

 

輸出結果以下圖所示:

 1 頁碼 1
 2 [短租房名稱] 大唐東原財富廣場--城市簡約複式民宿
 3 [短租房價格] 298
 4 [短租房評分/評論/居住人數] 5.0分·5條評論·二居·可住3人
 5 [網頁連接] /room/851634765
 6 http://www.mayi.com/room/851634765
 7 [短租房名稱] 大唐東原財富廣場--清新檸檬複式民宿
 8 [短租房價格] 568
 9 [短租房評分/評論/居住人數] 2條評論·三居·可住6人
10 [網頁連接] /room/851634467
11 http://www.mayi.com/room/851634467
12  
13 ...
14  
15 頁碼 9
16 [短租房名稱] 【高鐵北站公園旁】美式風情+超大溫馨安逸
17 [短租房價格] 366
18 [短租房評分/評論/居住人數] 3條評論·二居·可住5人
19 [網頁連接] /room/851018852
20 http://www.mayi.com/room/851018852
21 [短租房名稱] 大營坡(中大國際購物中心附近)北歐小清新三室
22 [短租房價格] 298
23 [短租房評分/評論/居住人數] 三居·可住6人
24 [網頁連接] /room/851647045
25 http://www.mayi.com/room/851647045

 


在這裏插入圖片描述

接下來咱們想獲取詳細信息 在這裏插入圖片描述

這裏做者主要是提供分析Cookie的方法,使用瀏覽器打開網頁,右鍵「檢查」,而後再刷新網頁。在「NetWork」中找到網頁並點擊,在彈出來的Headers中就隱藏這這些信息。 在這裏插入圖片描述

最多見的兩個參數是Cookie和User-Agent,以下圖所示:

在這裏插入圖片描述

而後在Python代碼中設置這些參數,再調用Urllib2.Request()提交請求便可,核心代碼以下:

1   user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/61.0.3163.100 Safari/537.36"
2   cookie="mediav=%7B%22eid%22%3A%22387123...b3574ef2-21b9-11e8-b39c-1bc4029c43b8"
3   headers={"User-Agent":user_agent,"Cookie":cookie}
4   request=urllib2.Request(url,headers=headers)
5   response=urllib2.urlopen(request)
6   contents = response.read() 
7   soup = BeautifulSoup(contents, "html.parser")
8   for tag1 in soup.find_all(attrs={"class":"main"}):    

 

注意,每小時Cookie會更新一次,咱們須要手動修改Cookie值便可,就是上面代碼的cookie變量和user_agent變量。完整代碼以下所示:

 1 import urllib2 
 2 import re 
 3 from bs4 import BeautifulSoup
 4 import codecs
 5 import csv
 6  
 7  
 8 c = open("ycf.csv","wb") #write 寫
 9 c.write(codecs.BOM_UTF8)
10 writer = csv.writer(c)
11 writer.writerow(["短租房名稱","地址","價格","評分","可住人數","人均價格"])
12  
13  
14 #爬取詳細信息
15 def getInfo(url,fname,fprice,fscore,users):
16     #經過瀏覽器開發者模式查看訪問使用的user_agent及cookie設置訪問頭(headers)避免反爬蟲,且每隔一段時間運行要根據開發者中的cookie更改代碼中的cookie
17     user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
18     cookie="mediav=%7B%22eid%22%3A%22387123%22eb7; mayi_uuid=1582009990674274976491; sid=42200298656434922.85.130.130"
19     headers={"User-Agent":user_agent,"Cookie":cookie}
20     request=urllib2.Request(url,headers=headers)
21     response=urllib2.urlopen(request)
22     contents = response.read() 
23     soup = BeautifulSoup(contents, "html.parser")
24     #短租房地址
25     for tag1 in soup.find_all(attrs={"class":"main"}):    
26         print u'短租房地址:'
27         for tag2 in tag1.find_all(attrs={"class":"desWord"}):
28             address = tag2.find('p').get_text()
29             print address
30     #可住人數     
31         print u'可住人數:'
32         for tag4 in tag1.find_all(attrs={"class":"w258"}):
33             yy = tag4.find('span').get_text()
34             print yy
35         fname = fname.encode("utf-8")
36         address = address.encode("utf-8")
37         fprice = fprice.encode("utf-8")
38         fscore = fscore.encode("utf-8")
39         fpeople = yy[2:3].encode("utf-8")
40         ones = int(float(fprice))/int(float(fpeople))
41         #存儲至本地
42         writer.writerow([fname,address,fprice,fscore,fpeople,ones])
43     
44  
45 #爬蟲函數
46 def gydzf(url):
47     user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
48     headers={"User-Agent":user_agent}
49     request=urllib2.Request(url,headers=headers)
50     response=urllib2.urlopen(request)
51     contents = response.read() 
52     soup = BeautifulSoup(contents, "html.parser")
53     for tag in soup.find_all('dd'):
54     #短租房名稱
55         for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):
56             fname = name.find('p').get_text()
57             print u'[短租房名稱]', fname.replace('\n','').strip()
58     #短租房價格
59         for price in tag.find_all(attrs={"class":"moy-b"}):
60             string = price.find('p').get_text()
61             fprice = re.sub("[¥]+".decode("utf8"), "".decode("utf8"),string)
62             fprice = fprice[0:5]
63             print u'[短租房價格]', fprice.replace('\n','').strip()
64     #評分及評論人數
65             for score in name.find('ul'):
66                 fscore = name.find('ul').get_text()
67             print u'[短租房評分/評論/居住人數]', fscore.replace('\n','').strip()           
68    #網頁連接url           
69             url_dzf = tag.find(attrs={"target":"_blank"})
70             urls = url_dzf.attrs['href']
71             print u'[網頁連接]', urls.replace('\n','').strip()
72             urlss = 'http://www.mayi.com' + urls + ''
73             print urlss
74             getInfo(urlss,fname,fprice,fscore,user_agent)
75       
76 #主函數
77 if __name__ == '__main__':    
78     i = 0
79     while i<33:
80         print u'頁碼', (i+1)
81         if(i==0):
82             url = 'http://www.mayi.com/guiyang/?map=no'
83         if(i>0):
84             num = i+2 #除了第一頁是空的,第二頁開始按2順序遞增
85             url = 'http://www.mayi.com/guiyang/' + str(num) + '/?map=no'
86         gydzf(url)
87         i=i+1
88  
89 c.close()

 

輸出結果以下,存儲本地CSV文件:

在這裏插入圖片描述

同時,你們能夠嘗試Selenium爬取螞蟻短租,應該也是可行的方法。最後但願文章對您有所幫助,若是存在不足之處,請海涵~

相關文章
相關標籤/搜索