在進入正題之前,我們先復習一個關於requests模塊的相關知識點:
requests中解決編碼的三種方法:
①response.content
類型:bytes
解碼類型:沒有指定
如何修改編碼方式:response.content.decode()
②response.content.decode()
類型:str
解碼類型:解碼成python文本的字符串類型
如何修改編碼方式:respsonse.content.decode(encoding="utf-8")
③response.txt
類型:str
解碼類型:根據HTTP頭部對響應的編碼作出有根據的推測,推測的文本編碼。
如何修改編碼方式:response.encoding="gbk"
所以,綜上所述,最好的方式就是使用response.content.decode()來獲取響應的html頁面。
那么現在,回到正題:
我們做爬蟲的時候,一定要學會偽裝自己。
因為一旦有一天,你不采取措施,但是你需求的量多,頻率也快,是很容易被識別為爬蟲的,從而對你攔截處理。
思路很簡單,就是我一個人模擬多個人,那么從人的屬性分析:
瀏覽器名稱,ip地址,cookie和session信息。
所以我們寫爬蟲的時候,要准備一堆User-Agent,一堆ip地址和一堆cookie信息。
①使用代理ip
ip參數是proxies,依舊是字典的形式
{"http":"http://www.baidu.com"}
ip的選擇
-准備一堆的ip地址,組成ip池,使用代理時隨機選擇一個ip使用。
-{"ip":"times":0}
-[{},{},{},{}],對這個ip地址的列表進行排序,按照使用次數進行那個排序。
-選擇使用次數較少的10個ip,從中隨機選擇一個。
檢查ip的可用性
-可以使用requests添加超時參數,判斷ip地址的質量
-在線代理ip質量檢測的網站
import requests
proxies={"http":"http://132.232.52.79:80"} #選擇代理IP地址的時候,要選對跟自己網絡符合的端口哦,否則就是407
headers={"User-Agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1"}
url="http://www.baidu.com"
response=requests.get(url,proxies=proxies,headers=headers)
print(response.status_code)
②使用cookie和session
cookie存放在客戶的瀏覽器上,session數據放在服務器上。
一組cookie和session的信息對應於一個用戶的信息。
使用過快過多會被識別會爬蟲。
但是要獲取登陸之后的頁面,必須發送帶有cookies的請求。
攜帶cookie請求
跟ip池一樣的是,這次需要攜帶一堆cookie進行請求,把cookie組成cookie池。
使用requests提供的session類來請求登陸之后的網站的思路
實例化sessin,
先使用session發送post請求,登錄到正確的網站,把cookie保存在session中,
再使用session請求get登陸之后才能訪問的網站,session能夠自動地攜帶登錄成功時保存在其中的cookie,進行請求。
import requests
session=requests.session()
url="http://www.renren.com/SysHome.do"
data={"email":"177********","password":"***123456789"}
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6814.400 QQBrowser/10.3.3005.400"}
#使用session發送post請求,cookie保存在其中
session.post(url,data=data,headers=headers)
#使用session進行登陸之后才能訪問的地址
response=session.get("http://www.renren.com/969398979/profile",headers=headers)
#保存頁面
with open("renrenwang.html","w",encoding="utf-8") as f:
f.write(response.content.decode())
cookie和session的使用思路,我再復述一遍:
首先實例化一個session,然后准備好post請求的表單內容,里面包含賬號密碼等登陸信息。
然后用session發送post請求,登陸上網站,這個時候已經完成cookie和session的自動保存。
於是就再用session直接發送get請求,登陸上一個需要登陸賬號密碼的網頁,這個時候,依舊能訪問成功。
值得一提的是,這個過程可以簡化,當遇到一下三種情況的時候:
1.cookie過期時間很長的網站
2.在cookie過期之前能夠拿到所有的數據,比較麻煩
3.配合其他程序一起使用,其他程序專門獲取cookie,當前程序專門請求頁面
我們可以直接加入cookie信息,直接登陸上去。方法是和headrs字典一樣的,創造一個cookie字典放進去,然后get請求里面放一個cookies參數。
具體過程我就不放代碼了,結合headers類似的方法應該都懂。
總結一下今后的爬蟲之路,就是准備一堆瀏覽器名稱,一堆IP地址和一堆cookie信息,做到對自己的完美偽裝。