小白學爬蟲(三)– requests庫之Cookie

小白學爬蟲(三)– requests庫之Cookie
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

前言

上一篇文章介紹瞭如何用requests模擬瀏覽器傳送一個get/post請求獲取response響應,response物件的常見屬性方法,以及對返回資料是亂碼如何處理。這篇文章主要介紹Cookie相關的請求,但是在此之前會先說一下請求超時的問題。

使用超時引數

平時在瀏覽器裡面訪問頁面的時候經常會出現 “正在載入中…” 或者 一個小圓圈不停的轉 這樣的情況,這種情況可能是由於網路波動引起的。那麼在程式裡面會不會出現這中情況呢?肯定是會的。如果出現這種情況程式就會卡死在這裡,直到網路穩定之後才會繼續執行。那有沒有什麼解決方法呢?有的,就是使用timeout引數,比如:

import requests
url = "http://www.baidu.com"
response = requests.get(url,timeout=0.01)
print(response.content.decode())

主要注意這一句

response = requests.get(url,timeout=0.01)

這句話的意思是:如果在0.01s之內可以得到響應就沒事,如果得不到響應就報錯。如下圖:
這裡寫圖片描述
另外也可以利用retry模組進行多次請求,如果全部都失敗才報錯。當然使用retry庫之前也需要先安裝。

import requests
from retrying import retry
# 這裡的headers使用的是手機版的
m_headers = {
"User-Agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
}
@ retry(stop_max_attempt_number = 10)  #讓被裝飾的函式反覆執行10次,10次全部報錯才會報錯, 中間有一次正常就繼續往下走
def parse_url1(url):
response = requests.get(url, headers=m_headers, timeout=5)
return response.content.decode()
# 真正的url請求函式
def parse_url(url):
try:
html_str = parse_url1(url)
except:
html_str = None
return html_str
if __name__ == '__main__': 
url = "http://www.baidu.com"
print(parse_url(url))

在requests新增Cookie引數

啥是cookie

當使用者通過瀏覽器首次訪問一個域名時,訪問的web伺服器會給客戶端傳送資料,以保持web伺服器與客戶端之間的狀態保持,這些資料就是cookie,它是Internet站點建立的,為了辨別使用者身份而儲存在使用者本地終端上的資料,cookie大部分都是加密的,cookie存在與快取中或者硬碟中,在硬碟中的是一些文字檔案,當你訪問該網站時,就會讀取對應的網站的cookie資訊,cookie有效地提升了使用者體驗,一般來說,一旦將cookie儲存在計算機上,則只有建立該cookie的網站才能讀取它

上面這段話來自於:Python的Cookie詳解

看懂了嗎? 我反正沒看懂。簡單說cookie就是客戶端向伺服器端保持狀態的,它可以辨別使用者的身份,大部分是加密的。我們可以用的就是模擬登陸,在需要輸入登陸賬號和密碼的網站就可以利用Cookie來獲取資料,比如csdn。

一般攜帶Cookie請求有三種方式:

三種Cookie請求方式

第一種:cookie放在headers中

這裡以請求我自己的部落格首頁為例:
這裡寫圖片描述
首先找到登陸之後的Cookie和User-Agent,然後將User-Agent和Cookie複製到程式裡面,如下:

import requests
url = "https://blog.csdn.net/williamgavin"
headers = {"User_Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
"Cookie" : "這個還是算了吧,用你們自己的部落格試 ^-^ "
}
response = requests.get(url, headers = headers )
with open("csdn.html", "w", encoding="utf-8") as f:
f.write(response.content.decode());

這樣就將這個頁面的資料返回到了csdn.html這個檔案裡面,開啟看一下,如下圖:
這裡寫圖片描述
和我自己的部落格主頁是一樣的,而且超連結都保留了。

第二種:cookie字典傳給cookies引數

這裡以請求人人網為例:
這裡寫圖片描述

找到對應的cookie和User-Agent

這裡寫圖片描述

import requests
url = "http://www.renren.com/967272361/profile"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
}
# 不帶上Cookie就訪問不了這個頁面
cookie = "anonymid=jk63khrk-y97r4p; _r01_=1; [email protected]; ln_hurl=http://hdn.xnimg.cn/photos/hdn421/20180720/1740/main_JAWQ_0aa000000ceb195a.jpg; _ga=GA1.2.273332130.1532825428; depovince=HUN; JSESSIONID=abcE5k0CiAJDc9ESVEcuw; ick_login=026ba348-e4e9-4871-9ce3-5868b95cfdd3; first_login_flag=1; loginfrom=syshome; wp_fold=0; BAIDU_SSP_lcr=https://www.baidu.com/link?url=VRx_HKUd53I5rYWZHvrQ9VVLotqST6-jtaZDlscFYCO&wd=&eqid=e957aec400037928000000065b64fcab; ick=64518f30-9a22-47df-b3c3-4114f185c3c6; t=8fcf47068763c279eea2620b51b7a3311; societyguester=8fcf47068763c279eea2620b51b7a3311; id=967272361; xnsid=fd736c63; jebecookies=3f9a3853-3371-4857-8268-308d663ca146|||||; jebe_key=19041c4e-4d38-4dc1-bfb9-124b81afae61%7C33b1d8f602cf6dd5a9834fe6f2bf97f2%7C1533346094265%7C1%7C1533346099750"
# 將上面哪個cookie轉化成字典型別
cookie_dict = {i.split("=")[0]:i.split("=")[-1] for i in cookie.split("; ")}
response = requests.get(url, headers = headers, cookies = cookie_dict)
with open("renren2.html", "w", encoding="utf-8") as f:
f.write(response.content.decode())

結果如下:
這裡寫圖片描述

第三種 先傳送post請求,獲取cookie,帶上cookie請求登陸之後的頁面

這裡要用到一個seesion類,seesion 例項具有的方法和requests一樣,但是 seesion具有保持功能, 就類似瀏覽器輸入一次密碼之後,會自動保留cookie

  • seesion = requests.seesion()
  • seesion.post(url, data, headers) # 伺服器設定在本地的cookie會儲存在本地
  • seesion.get(url) # 會帶上之前儲存在seesion中的cookie,能夠請求成功

這種方法要先提交自己的賬號密碼,並且要找到提交的地址。那麼如何找到提交地址呢?
第一種方式:找form表單的action屬性
這裡寫圖片描述

import requests
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"}
seesion = requests.session()
# 因為人人網有from表單,所以可以直接找地址:http://www.renren.com/PLogin.do
# 如果沒有的就要抓包了
post_url = "http://www.renren.com/PLogin.do"    # form表單裡面直接找到的
#post_url = "http://www.renren.com/ajaxLogin/login?
# 使用者名稱作為鍵, 真正的密碼作為值  模擬登陸
post_data = {"email":"xxxx", "password":"xxxx"}
seesion.post(post_url, headers = headers, data = post_data)
url = "再次請求登陸的url"
response = seesion.get(url, headers = headers)
with open("renren3.html", "w", encoding="utf-8") as f:
f.write(response.content.decode())

第二種方式抓包獲取url
這裡寫圖片描述

相關文章

程式語言 最新文章