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