python爬蟲cookie池 與ip綁定_Python爬蟲:設置Cookie解決網站攔截并爬取螞蟻短租

前言

文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。

作者: Eastmount

PS:如有需要Python學習資料的小伙伴可以加點擊下方鏈接自行獲取

我們在編寫Python爬蟲時,有時會遇到網站拒絕訪問等反爬手段,比如這么我們想爬取螞蟻短租數據,它則會提示“當前訪問疑似黑客攻擊,已被網站管理員設置為攔截”提示,如下圖所示。此時我們需要采用設置Cookie來進行爬取,下面我們進行詳細介紹。非常感謝我的學生承峰提供的思想,后浪推前浪啊!

一. 網站分析與爬蟲攔截

當我們打開螞蟻短租搜索貴陽市,反饋如下圖所示結果。

我們可以看到短租房信息呈現一定規律分布,如下圖所示,這也是我們要爬取的信息。

通過瀏覽器審查元素,我們可以看到需要爬取每條租房信息都位于

節點下。

在定位房屋名稱,如下圖所示,位于

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

# -*- coding: utf-8 -*-

import urllib

import re

from bs4 import BeautifulSoup

import codecs

url = 'http://www.mayi.com/guiyang/?map=no'

response=urllib.urlopen(url)

contents = response.read()

soup = BeautifulSoup(contents, "html.parser")

print soup.title

print soup

#短租房名稱

for tag in soup.find_all('dd'):

for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):

fname = name.find('p').get_text()

print u'[短租房名稱]', fname.replace('\n','').strip()

但很遺憾,報錯了,說明螞蟻金服防范措施還是挺到位的。

二. 設置Cookie的BeautifulSoup爬蟲

添加消息頭的代碼如下所示,這里先給出代碼和結果,再教大家如何獲取Cookie。

# -*- coding: utf-8 -*-

import urllib2

import re

from bs4 import BeautifulSoup

#爬蟲函數

def gydzf(url):

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"

headers={"User-Agent":user_agent}

request=urllib2.Request(url,headers=headers)

response=urllib2.urlopen(request)

contents = response.read()

soup = BeautifulSoup(contents, "html.parser")

for tag in soup.find_all('dd'):

#短租房名稱

for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):

fname = name.find('p').get_text()

print u'[短租房名稱]', fname.replace('\n','').strip()

#短租房價格

for price in tag.find_all(attrs={"class":"moy-b"}):

string = price.find('p').get_text()

fprice = re.sub("[¥]+".decode("utf8"), "".decode("utf8"),string)

fprice = fprice[0:5]

print u'[短租房價格]', fprice.replace('\n','').strip()

#評分及評論人數

for score in name.find('ul'):

fscore = name.find('ul').get_text()

print u'[短租房評分/評論/居住人數]', fscore.replace('\n','').strip()

#網頁鏈接url

url_dzf = tag.find(attrs={"target":"_blank"})

urls = url_dzf.attrs['href']

print u'[網頁鏈接]', urls.replace('\n','').strip()

urlss = 'http://www.mayi.com' + urls + ''

print urlss

#主函數

if __name__ == '__main__':

i = 1

while i<10:

print u'頁碼', i

url = 'http://www.mayi.com/guiyang/' + str(i) + '/?map=no'

gydzf(url)

i = i+1

else:

print u"結束"

輸出結果如下圖所示:

頁碼 1

[短租房名稱] 大唐東原財富廣場--城市簡約復式民宿

[短租房價格] 298

[短租房評分/評論/居住人數] 5.0分·5條評論·二居·可住3人

[網頁鏈接] /room/851634765

http://www.mayi.com/room/851634765

[短租房名稱] 大唐東原財富廣場--清新檸檬復式民宿

[短租房價格] 568

[短租房評分/評論/居住人數] 2條評論·三居·可住6人

[網頁鏈接] /room/851634467

http://www.mayi.com/room/851634467

...

頁碼 9

[短租房名稱] 【高鐵北站公園旁】美式風情+超大舒適安逸

[短租房價格] 366

[短租房評分/評論/居住人數] 3條評論·二居·可住5人

[網頁鏈接] /room/851018852

http://www.mayi.com/room/851018852

[短租房名稱] 大營坡(中大國際購物中心附近)北歐小清新三室

[短租房價格] 298

[短租房評分/評論/居住人數] 三居·可住6人

[網頁鏈接] /room/851647045

http://www.mayi.com/room/851647045

?

接下來我們想獲取詳細信息

這里作者主要是提供分析Cookie的方法,使用瀏覽器打開網頁,右鍵“檢查”,然后再刷新網頁。在“NetWork”中找到網頁并點擊,在彈出來的Headers中就隱藏這這些信息。

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

然后在Python代碼中設置這些參數,再調用Urllib2.Request()提交請求即可,核心代碼如下:

user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/61.0.3163.100 Safari/537.36"

cookie="mediav=%7B%22eid%22%3A%22387123...b3574ef2-21b9-11e8-b39c-1bc4029c43b8"

headers={"User-Agent":user_agent,"Cookie":cookie}

request=urllib2.Request(url,headers=headers)

response=urllib2.urlopen(request)

contents = response.read()

soup = BeautifulSoup(contents, "html.parser")

for tag1 in soup.find_all(attrs={"class":"main"}):

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

import urllib2

import re

from bs4 import BeautifulSoup

import codecs

import csv

c = open("ycf.csv","wb") #write 寫

c.write(codecs.BOM_UTF8)

writer = csv.writer(c)

writer.writerow(["短租房名稱","地址","價格","評分","可住人數","人均價格"])

#爬取詳細信息

def getInfo(url,fname,fprice,fscore,users):

#通過瀏覽器開發者模式查看訪問使用的user_agent及cookie設置訪問頭(headers)避免反爬蟲,且每隔一段時間運行要根據開發者中的cookie更改代碼中的cookie

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"

cookie="mediav=%7B%22eid%22%3A%22387123%22eb7; mayi_uuid=1582009990674274976491; sid=42200298656434922.85.130.130"

headers={"User-Agent":user_agent,"Cookie":cookie}

request=urllib2.Request(url,headers=headers)

response=urllib2.urlopen(request)

contents = response.read()

soup = BeautifulSoup(contents, "html.parser")

#短租房地址

for tag1 in soup.find_all(attrs={"class":"main"}):

print u'短租房地址:'

for tag2 in tag1.find_all(attrs={"class":"desWord"}):

address = tag2.find('p').get_text()

print address

#可住人數

print u'可住人數:'

for tag4 in tag1.find_all(attrs={"class":"w258"}):

yy = tag4.find('span').get_text()

print yy

fname = fname.encode("utf-8")

address = address.encode("utf-8")

fprice = fprice.encode("utf-8")

fscore = fscore.encode("utf-8")

fpeople = yy[2:3].encode("utf-8")

ones = int(float(fprice))/int(float(fpeople))

#存儲至本地

writer.writerow([fname,address,fprice,fscore,fpeople,ones])

#爬蟲函數

def gydzf(url):

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"

headers={"User-Agent":user_agent}

request=urllib2.Request(url,headers=headers)

response=urllib2.urlopen(request)

contents = response.read()

soup = BeautifulSoup(contents, "html.parser")

for tag in soup.find_all('dd'):

#短租房名稱

for name in tag.find_all(attrs={"class":"room-detail clearfloat"}):

fname = name.find('p').get_text()

print u'[短租房名稱]', fname.replace('\n','').strip()

#短租房價格

for price in tag.find_all(attrs={"class":"moy-b"}):

string = price.find('p').get_text()

fprice = re.sub("[¥]+".decode("utf8"), "".decode("utf8"),string)

fprice = fprice[0:5]

print u'[短租房價格]', fprice.replace('\n','').strip()

#評分及評論人數

for score in name.find('ul'):

fscore = name.find('ul').get_text()

print u'[短租房評分/評論/居住人數]', fscore.replace('\n','').strip()

#網頁鏈接url

url_dzf = tag.find(attrs={"target":"_blank"})

urls = url_dzf.attrs['href']

print u'[網頁鏈接]', urls.replace('\n','').strip()

urlss = 'http://www.mayi.com' + urls + ''

print urlss

getInfo(urlss,fname,fprice,fscore,user_agent)

#主函數

if __name__ == '__main__':

i = 0

while i<33:

print u'頁碼', (i+1)

if(i==0):

url = 'http://www.mayi.com/guiyang/?map=no'

if(i>0):

num = i+2 #除了第一頁是空的,第二頁開始按2順序遞增

url = 'http://www.mayi.com/guiyang/' + str(num) + '/?map=no'

gydzf(url)

i=i+1

c.close()

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

同時,大家可以嘗試Selenium爬取螞蟻短租,應該也是可行的方法。最后希望文章對您有所幫助,如果存在不足之處,請海涵~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374018.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374018.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374018.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java Secret:加載和卸載靜態字段

總覽 首先&#xff0c;很自然地假設靜態字段具有特殊的生命周期&#xff0c;并且在應用程序的生命周期中一直存在。 您可以假設它們存在于內存中的特殊位置&#xff0c;例如C或類元信息的perm gen中的內存開始。 但是&#xff0c;得知靜態字段駐留在堆上&#xff0c;可以具有任…

HTTP協議詳解(真的很經典)

轉自&#xff1a;http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一個屬于應用層的面向對象的協議&#xff0c;由于其簡捷、快速的方式&#xff0c;適用于分布式超媒體信息系統。它于1990年…

NYOJ 63 小猴子下落

小猴子下落 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;3描述 有一顆二叉樹&#xff0c;最大深度為D,且所有葉子的深度都相同。所有結點從左到右從上到下的編號為1,2,3&#xff0c;&#xff0c;2的D次方減1。在結點1處放一個小猴子&#xff0…

python科學計算與圖形渲染_寧哥Python科學計算與圖形渲染庫課程

50dccd474759c0ffd343efcac14f8ab2.png (259.41 KB, 下載次數: 0)2019-4-9 12:23 上傳課程目錄章節1: NumPy基礎知識課時1NumPy簡介14:05課時2搭建NumPy開發環境&#xff0c;驗證NumPy開發環境17:08課時3源代碼和數據下載章節2: NumPy數組課時4創建多維數組09:20課時5獲取單個數…

http協議說明

今天公司有同事讓我給他講一講http..然后自己寫了一個示例代碼,這如果都看不懂.那我也沒辦法了.... 1 <?php2 3 //這里服務器以apache舉例.nginx.iis.他們實際上處理方式的都是同理4 //申明http鏈接的數據包 注意最后面有兩個換號.這是告訴apache.數據包的結束,如果后面沒…

JBoss模塊示例–模塊化Web應用程序

最近&#xff0c;我讀了為什么沒有標準來開發真正的模塊化Web應用程序&#xff1f; 由Patroklos Papapetrou撰寫&#xff08; 在Java Code Geeks中也有介紹 &#xff09;。 受本文的啟發&#xff0c;我決定檢查實際使用的JBoss模塊 。 這篇文章逐步描述了我的實驗。 我首先想到…

由MySql漏洞導致電腦被入侵(特征為新增加名為piress的帳戶)

今天開機&#xff0c;突然發現新增了一個名為piress的賬戶&#xff0c;突然間就意識到我的電腦可能被入侵了。后來發現網上很多人都遇到這樣的問題。經過一步步的查證&#xff0c;原來最近MySQL爆出一個安全漏洞&#xff0c;遠程登錄mysql&#xff0c;嘗試225次后就可以繞過身份…

multiprocessing.manager管理的對象需要加鎖嗎_Go: 內存管理和分配

本文基于Go1.13當不再使用內存時&#xff0c;標準庫會自動執行Go的內存管理即從分配到回收。盡管開發者不需要處理它&#xff0c;但是Go的底層管理進行了很好的優化并且充滿了有趣的概念。堆上的分配內存管理被設計可以在并發環境快速執行并且集成了gc。讓我們從一個例子開始&a…

NYOJ 35表達式求值

表達式求值 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;4描述 ACM隊的mdd想做一個計算器&#xff0c;但是&#xff0c;他要做的不僅僅是一計算一個AB的計算器&#xff0c;他想實現隨便輸入一個表達式都能求出它的值的計算器&#xff0c;現在請…

Java EE6 CDI,命名組件和限定符

Java EE6的最大承諾之一就是簡化了依賴注入的使用。 他們做到了&#xff0c;使用CDI 。 CDI代表Java EE的上下文和依賴注入&#xff0c;它提供了一個基礎集&#xff0c;用于在企業應用程序中應用依賴注入。 在CDI之前&#xff0c;EJB 3還引入了依賴注入&#xff0c;但這有點基礎…

c#獲取當前目錄的一些方法

【內容來源地址】&#xff1a;http://www.cnblogs.com/marcozh/archive/2008/10/19/1314667.html Assembly myAssembly Assembly.GetEntryAssembly(); string path myAssembly.Location; DirectoryInfo dr new DirectoryInfo(path); pathd…

linux里的進程簡介

/sbin/init 內核啟動的第一個用戶級進程,引導用戶空間服務 [kthreadd] 內核線程管理[migration/0] 用于進程在不同的CPU間遷移[ksoftirqd/0] 內核調度/管理第0個CPU軟中斷的守護進程[migration/1] 管理多核心[ksoftirqd/1] 內核調度/管…

python畫畫bup_Python中的高效Vector / Point類

實現高效的Vector / Point類的最佳方法是什么(甚至更好&#xff1a;是否有一個),可以在Python 2.7和3.x中使用&#xff1f;我找到了the blender-mathutils,但它們似乎只支持Python 3.x.然后是this Vector class,使用numpy,但它只是一個3D矢量.使用具有靜態屬性(x和y)的像kivy’…

CSDN 編程挑戰——《coder的計算器》

coder的計算器 題目詳情: coder現在已經上初中&#xff0c;也會用計算器實現 ,-,*,/和冪運算^了&#xff0c;但他覺得市場那些計算器太繁瑣了&#xff0c;有很多他不認識的符號&#xff0c;所以他現在很想要能計算帶括號的 ,-,*,/和冪運算^的混合表達式就可以了&#xff0c;你…

OpenShift Express:部署Java EE應用程序(支持AS7)

在過去的幾年中&#xff0c;我越來越聽到有關“云”服務的信息。 最初&#xff0c;我并不是很想嘗試一下。 但是幾個月后&#xff08;一年&#xff1f;&#xff09;&#xff0c;我決定看看這是怎么回事。 我從事Java EE開發已經超過7年了&#xff0c;所以我決定看看將Java EE應…

07 總結ProgressDialog 異步任務

1,ProgressDialog> //使用對象 設置標題 progressDialog.setTitle("標題"); //設置圖標 progressDialog.setIcon(R.drawable.ic_launcher); //設置展示的內容 progressDialog.setMessage(&q…

python函數封裝計算n運算_在Python里面怎么可以運算出999999999**999999999,求思路?...

>>> 999999999 * math.log(999999999, 2) / 8 / 1024 ** 33.480509950621777所以這個數字本身就差不多需要3.5GB內存&#xff0c;考慮到計算過程中需要存儲臨時結果&#xff0c;還需要翻個兩三倍吧而Python中的long可以到多少呢&#xff1a;#define MAX_LONG_DIGITS \…

C++中const關鍵字的使用總結

const是不變的意思&#xff0c;在C程序中&#xff0c;經常用const來限制對一個對象的操作: 1.1 const變量 例如&#xff1a; const int n3; 則這個變量的值不能改變&#xff0c;即不能對變量賦值。 1.2 const參數 出現在函數參數中的const表示在函數體中不能對這個參數做修改…

php封裝redis負載均衡類

$array array( master > array( "redis://127.0.0.1:6379?timeout1", ), slave > array( "redis://127.0.0.1:6479?timeout1", "redis://127.0.0.1:6579?timeout1", ) ); $redis R…

我今天對JavaFX的了解

如果您沒有聽說過&#xff0c;JavaFX 2是Java的新Desktop / web / client框架。 自JavaFX 1以來&#xff0c;它已經進行了相當大的改動&#xff08;坦率地說&#xff0c;效果并不那么令人印象深刻&#xff09;。 自定義腳本語言已經淘汰了&#xff0c;您可以使用標準Java和基于…