1. 程式人生 > >爬蟲requests高階用法

爬蟲requests高階用法

一 檔案上傳

1 程式碼

import requests
#favicon.ico需要和當前指令碼在同一目錄下。
files = {'file': open('favicon.ico', 'rb')}
r = requests.post("http://httpbin.org/post", files=files)
print(r.text)

2 執行結果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_2_2.py
{
  "args": {},
  "data": "",
  "files": {
    "file": "data:application/octet-stream;base64,AAABAAIAEBAAAAEAIAAoBQAAJgAAACAgAAABACAAKBQAAE4
  },
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "close",
    "Content-Length": "6665",
    "Content-Type": "multipart/form-data; boundary=ea9414f1b8ae442f768c08b6a62b8082",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.21.0"
  },
  "json": null,
  "origin": "106.36.218.77",
  "url": "http://httpbin.org/post"
}

Process finished with exit code 0

3 說明

這個網站會返回響應,裡面包含files這個欄位,而form欄位是空的,這證明檔案上傳部分會單獨有一個files欄位來標識。

二 Cookies

1 程式碼

import requests

r = requests.get("https://www.baidu.com")
print(r.cookies)
for key, value in r.cookies.items():
    print(key + '=' + value)

2 執行結果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_2_2.py
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ=27315

3 說明

首先呼叫cookies屬性即可成功得到Cookies,可以發現它是RequestCookieJar型別。然後用items()方法將其轉化為元組組成的列表,遍歷輸出每一個Cookie的名稱和值,實現Cookie的遍歷解析。

三 Cookie來維持登入狀態

1 首先登入知乎,將Headers中的Cookie內容複製下來。

2 程式碼

import requests

headers = {
    'Cookie': '_zap=5278893c-f810-4c54-bab7-8a41270bc214; d_c0="APDmmdY8Cg6PTudPGBNFoxdsxayIFBmmnPc=|1533985205"; q_c1=cbbdfe655e4c42b0bbb6bd5b98669e82|1533985206000|1533985206000; tgw_l7_route=e5fff8427ab0da864ad8c176457be0a7; _xsrf=9FMv1Gt6dC9h7xdayPvNCyaiVcwri6GK; capsion_ticket="2|1:0|10:1547258019|14:capsion_ticket|44:YzIwN2Y1ZTM2MDU1NGRiN2I3MGYzYzk2NDRlNWM4N2Y=|caf585e4ea653247735804c0a1457db785cee1269503caee2a240ba56c22ef62"; z_c0="2|1:0|10:1547258039|4:z_c0|92:Mi4xa0EwN0JnQUFBQUFBOE9hWjFqd0tEaVlBQUFCZ0FsVk50cFltWFFCaHp1NnY4Tm5pdHlzc2pWMXNKdUwzOUVnM1VB|0f317c974b531bb5bc0fc809108c496c3cc193d290555234949ee2eebd7ee059"',
    'Host': 'www.zhihu.com',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
}
r = requests.get('https://www.zhihu.com', headers=headers)
print(r.text)

3 結果

我們發現,結果中包含了登入後的結果,如圖3-7所示,這證明登入成功。

四 會話維持

1 點睛

在requests中,如果直接利用get()或post()等方法的確可以做到模擬網頁的請求,但是這實際上是相當於不同的會話,也就是說相當於你用了兩個瀏覽器打開了不同的頁面。

設想這樣一個場景,第一個請求利用post()方法登入了某個網站,第二次想獲取成功登入後的自己的個人資訊,你又用了一次get()方法去請求個人資訊頁面。實際上,這相當於打開了兩個瀏覽器,是兩個完全不相關的會話,能成功獲取個人資訊嗎?那當然不能。

有小夥伴可能說,我在兩次請求時設定一樣的cookies不就行了?可以,但這樣做起來顯得很煩瑣,我們有更簡單的解決方法。

其實解決這個問題的主要方法就是維持同一個會話,也就是相當於開啟一個新的瀏覽器選項卡而不是新開一個瀏覽器。但是我又不想每次設定cookies,那該怎麼辦呢?這時候就有了新的利器——Session物件。

2 程式碼

import requests

requests.get('http://httpbin.org/cookies/set/number/123456789')
r = requests.get('http://httpbin.org/cookies')
print(r.text)

s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)

3 說明

所以,利用Session,可以做到模擬同一個會話而不用擔心Cookies的問題。它通常用於模擬登入成功之後再進行下一步的操作。

Session在平常用得非常廣泛,可以用於模擬在一個瀏覽器中開啟同一站點的不同頁面