requests用法基礎-進階


本節內容

  1. 模塊的安裝

    -----------------------基礎用法---------------------

  2. GET用法、POST用法

    -----------------------進階用法--------------------

  3. cookie處理、代理ip、session

一 模塊安裝:

1). 安裝requests包還是很方便的,電腦中有python環境,打開cmd,輸入pip install requests下載;

如果有同學使用pycharm的話,選擇file-->setting-->Project interpreter-->右邊"+"號點擊--->輸入模塊名---->選中下載。

2). requests的作用、特點、以及使用流程

  • 作用:模擬用戶使用瀏覽器上網

  • 特點:簡單、高效

  • 使用流程:

    1. 指定url;

    2. 發起請求(requests.get/post);

    3. 獲取響應信息/數據(response);

    4. 持久化存儲(保存csv、MySQL、txt等);

 

二基本用法:

1). get(url,headers,params):各用法

獲取搜狗首頁的頁面數據:

 1 import requests #引包
 2 #1指定url
 3 url = 'https://www.sogou.com/'
 4 #2.發起請求
 5 response = requests.get(url=url)
 6 #3獲取響應數據
 7 page_text = response.text #text返回的是字符串類型的數據
 8 #持久化存儲
 9 with open('./sogou.html','w',encoding='utf-8') as fp:
10     fp.write(page_text)
11 print('over!')
12 #也可以直接打印
13 print(page_text)   #這就是服務器給我們返回的數據信息(response)

 

2). headers的使用:

如果沒有偽裝UA,你發送的請求中的UA是一個爬蟲標識;而且現在大部分網站都是有UA檢測(反爬機制),所以我們需要UA偽裝(反反爬策略)騙過網站,

  • 我們可以打開網站,F12,隨意點擊一個信息,找到Headers這個標簽,翻到最下面有一個 User-Agent ,在python中我們需要對他進行構造。

  • python中有一個隨機生成UserAgent的包----fake-useragent,它的安裝方法也很簡單,pip install fake-useragent。

3). 下面實現上面headers的構造:

1 #第一種方法
2 #user-agent放在字典中,不光useragent,后面我們講到的cookie等都需要放入
3 import requests
4 headers== {
5     'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
6 }
7 #調用方法,get(傳入了兩個參數,url,headers)
8 response = requests.get("http://www.baidu.com",headers=headers)

使用fake-useragent獲取並構造UA:

import requests
from fake_useragent import UserAgent
ua = UserAgent()
headers = {'User-Agent': ua.random}
url = '待爬網頁的url'
resp = requests.get(url, headers=headers)

 

4). params 參數

我們使用一個例子來融合headers與params,還是以搜狗為例:

 1 import requests
 2 wd = input('enter a word:')
 3 url = 'https://www.sogou.com/web'
 4 #參數的封裝
 5 param = {
 6     'query':wd
 7 }
 8 #UA偽裝
 9 headers = {
10     'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
11 }
12 response = requests.get(url=url,params=param,headers=headers)
13 #手動修改響應數據的編碼
14 response.encoding = 'utf-8'
15 page_text = response.text
16 fileName = wd + '.html'
17 with open(fileName,'w',encoding='utf-8') as fp:
18     fp.write(page_text)
19 print(fileName,'爬取成功!!!')

上面的例子可以看出,如果需要將參數放在url中傳遞,可以利用 params 參數 。

5)post用法:我們訪問網站的時候,有時候是需要提交數據給網頁的,如果提交的數據中沒有網站所認證的信息,那么網站將會返回給你錯誤或者其他信息。

最基本的POST請求:

1 response = requests.post("http://www.baidu.com/",data=data)

傳入數據的之后就不需要使用urlencode進行編碼了。

實例(實現百度翻譯):

 1 import requests
 2 #破解百度翻譯
 3 url = 'https://fanyi.baidu.com/sug'
 4 word = input('enter a English word:')
 5 #請求參數的封裝
 6 data = {
 7     'kw':word
 8 }
 9 #UA偽裝
10 headers = {
11     'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
12 }
13 response = requests.post(url=url,data=data,headers=headers)
14 #text:字符串  json():對象
15 json_dict = response.json()
16 17 print(json_dict)#返回是一個json列表,進行數據提取即可

 

現在大部分的網站都是通過動態加載(Ajax)該技術加載信息,有的網站防止數據的泄露或者用戶隱私安全,會設置js、css字體加密等等;后面有機會在介紹。再舉個例子如下,爬取肯德基餐廳位置:

 1 #爬取任意城市對應的肯德基餐廳的位置信息
 2 #動態加載的數據
 3 city = input('enter a cityName:')
 4 url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
 5 #數據封裝
 6 data = {
 7     "cname": "",
 8     "pid": "",
 9     "keyword": city,
10     "pageIndex": "2",
11     "pageSize": "10",
12 }
13 #UA偽裝
14 headers = {
15     'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
16 }
17 #返回的數據
18 response = requests.post(url=url,headers=headers,data=data).text
19 print(response)#打印

有人會問怎么看我們需要傳輸什么參數呢?我們打開網站幣乎網站,點擊登錄,打開開發者模式(谷歌瀏覽器),輸入賬號密碼后,在標簽為Network中的Headers中最下面的Request payload中。如圖所示:

我們可以使用模擬參數進行登錄(大部分網站進行加密);在后面會講解谷歌的一些操作以及加密的數據的解決方式,這里暫時略過。

三 cookie、代理ip、session

(1). cookie的介紹:

學習之前簡單的了解一下cookie是做什么的,有什么作用;我們在百度上搜索一下,會出來很多的關於cookie的介紹,我截取了一段:

Cookie的作用:

cookie的用途是存儲用戶在特定網站上的密碼和 ID。另外,也用於存儲起始頁的首選項。在提供個人化查看的網站上,將利用計算機硬驅上的少量空間來儲存這些首選項。這樣,每次登錄該網站時,瀏覽器將檢查是否有cookie。如果有,瀏覽器將此 cookie 隨網頁的請求一起發送給服務器 ,有一個基礎的概念就行;

接下來我們獲取一下cookies:

 1 import requests
 2 #網址
 3 url ="http:///www.baidu。com”
 4 #返回響應
 5 response = requests.get(url)
 6 #獲取請求網頁的cookies
 7 #打印出cookies
 8 print(response.cookies)##RequestCookieJar類型,我們使用items方法將其轉換成元組,遍歷美每個cookie的的名稱跟值。
 9 #第一種方法
10 for k,v in response.cookies.items():
11     print(k +"="+ v)
12 #第二種方法
13 print(resp.cookies.get_dict())

我們也可以使用cookie來維持我們在網站上的登錄狀態,以我學校的網站為例(可以自行找登錄網站),首先登錄網站,打開F12,進入network面板----headers中,將cookies復制下來放進我們構造的headers中;

 1 import requests
 2  3 headers = {
 4     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3941.4 Safari/537.36",
 5     "Cookie": "JSESSIONID=加密字符串"
 6 }
 7  8 r = requests.get(url,headers=headers)
 9 10 print(r.text)

運行以后就會發現返回來的信息中有登陸后的結果,證明登錄成功。

(2)session(會話維持):

多個請求之間是可以共享cookie的。那么如果使用requests,也要達到共享cookie的目的,那么可以使用requests庫給我們提供的session對象。注意,這里的session不是web開發中的那個session,這個地方只是一個會話的對象而已。

上面的解釋可能有些抽象,打個比方你在爬取一個網站,第一次請求利用post登錄了網站,第二次想獲取登錄成功后的信息,你再使用get方法請求個人信息頁面,你發現請求不到,實際上上面的兩個操作是打開了兩個瀏覽器,是完全不同的。

所以有需求就有解決方案,這樣我們就引出session對象,它可以維持同一個會話,也就是打開一個瀏覽器的新標簽頁;這樣就防止我們登陸后獲取不到信息的煩惱。

以登錄人人網為例,使用requests來實現。示例代碼如下:

 1 import requests
 2  3 url = "http://www.renren.com/PLogin.do"
 4 data = {"email":"email",'password':"password"}
 5 headers = {
 6     'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
 7 }
 8  9 # 登錄
10 session = requests.session()
11 #提交參數信息
12 session.post(url,data=data,headers=headers)
13 14 # 訪問大鵬個人中心
15 resp = session.get('http://www.renren.com/880151247/profile')
16 17 print(resp.text)

注:session通常用於模擬登錄成功后進行下一步操作。

(3).代理ip的使用

代理ip的使用場合:對於某些網站,我們測試的時候請求幾次可以獲取網頁內容,但是當大規模且頻繁的請求,網站可能出現驗證碼、或者跳到登錄認證頁面,更有的會直接封掉客戶端IP,導致一定的時間內無法訪問。

為了防止這種情況的發生,我們需要進行代理操作,代理其實就是代理服務器,代理網站的話自行百度一下。

代理的詳情:https://www.kuaidaili.com/doc/wiki/

代理分為下面幾種類型:

-匿名度:
   - 透明:對方服務器可以知道你使用了代理,並且也知道你的真實IP
   - 匿名:對方服務器可以知道你使用了代理,但不知道你的真實IP
   - 高匿:對方服務器不知道你使用了代理,更不知道你的真實IP。
- 類型:
   - http:該類型的代理ip只可以發起http協議頭對應的請求
   - https:該類型的代理ip只可以發起https協議頭對應的請求

設置代理的方式:

1 import requests
2 proxies = {
3     "http":"ip:端口"4     "https":"ip:端口"5 }
6 requests.get(url,proxies=proxies)

總結:

requests的get和post方法常用的參數:

  • url

  • headers

  • data/params

  • proxies

你可能看會了,但是你敲了嗎?

初學者

分享及成功


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM