-
模塊的安裝
-----------------------基礎用法---------------------
-
GET用法、POST用法
-----------------------進階用法--------------------
-
cookie處理、代理ip、session
一 模塊安裝:
1). 安裝requests包還是很方便的,電腦中有python環境,打開cmd,輸入pip install requests下載;
如果有同學使用pycharm的話,選擇file-->setting-->Project interpreter-->右邊"+"號點擊--->輸入模塊名---->選中下載。
2). requests的作用、特點、以及使用流程
-
作用:模擬用戶使用瀏覽器上網
-
特點:簡單、高效
-
使用流程:
-
指定url;
-
發起請求(requests.get/post);
-
獲取響應信息/數據(response);
-
持久化存儲(保存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
你可能看會了,但是你敲了嗎?
初學者