我們如何使用requests模塊呢?
因為requests模塊不是Python的內置模塊,所以我們要通過包管理器pip進行下載。pip install requests
或者
pip3 install requests
安裝完成之後我們就可以在py文件中導入使用了
import requests
我們前面說過爬蟲的基本步驟是:
發送請求【可以使用urllib或者requests】發送請求的方式有:GET和POST,多數的請求是GET請求,比如在做數據查詢時,建議用GET請求方式。而在做數據添加、修改或刪除或者用戶登陸這些場景的時候就是POST請求,因為GET請求方式的安全性較POST方式要差些,包含機密信息的話,建議用POST數據提交方式。requests模塊官方文檔連結:https://docs.python-requests.org/zh_CN/latest/user/quickstart.html,如果有任何疑問大家也可以嘗試查看文檔,練習嘗試閱讀文檔對於大家學習其他模塊會有很大好處。本文分別從兩種請求方式介紹requests模塊的使用requests的作用就是發送網絡請求,返迴響應數據,那麼現在有一個簡單的需求:通過requests向百度首頁發送請求,獲取百度首頁的數據。
import requests
# url即百度首頁的連結
url = 'https://www.baidu.com'
# 通過get方法向目標url發送get請求,返迴響應的結果,是一個response對象
response = requests.get(url)
# 列印響應內容
print(response)列印結果大家看到:
<Response [200]>
但是我們如何像urllib一樣查看響應對象的狀態碼、響應體內容呢?因為返回的是Response對象,所以對象就可以訪問下面的屬性和方法。如下:response.text 讀取伺服器響應的內容,通常使用response.text會自動解碼來自伺服器的內容。因此大多數 unicode 字符集都能被無縫地解碼
response.encoding 獲取文本編碼,也可以使用該屬性修改編碼
response.content 獲取響應內容的二進位形式,一般圖片、音視頻等使用此方式獲取
response.status_code 獲取當前請求的響應碼
response.headers 獲取響應的響應頭
response.cookies 獲取響應的cookies內容
response.url 獲取請求的url
接下來我們以爬取百度,檢索的關鍵詞是【Python】為例,看一下響應內容。
import requests
url='https://www.baidu.com/'
response = requests.get(url=url)
# 獲取響應的狀態碼
print(response.status_code)
# 獲取編碼方式
print(response.encoding)
html_data = response.text
print(html_data)
# content獲取的是response對象中的二進位(byte)類型的頁面數據
print(response.content)
# 返回一個響應狀態碼
print(response.status_code)
# 返迴響應頭信息
print(response.headers)
# 獲取請求的url
print(response.url)結果:
而如果使用requests保存圖片,則需要結合文件保存完成。
import requests
# 圖片地址
image_url = 'https://anchorpost.msstatic.com/cdnimage/anchorpost/1082/bc/e60d649dd5fa645b575f73f9aef0bc_2168_1617694516.jpg?imageview/4/0/w/338/h/19'
# 發送請求獲取響應
response = requests.get(url)
with open('girl.png', 'wb')as f:
f.write(response.content)
獲取圖片就不能像獲取文本內容一樣使用response.text,而要使用response.content. 獲取的內容最後通過open()函數進行本地保存。上面的請求都沒有添加請求頭,比如我們要爬取豆瓣的內容就會得到418的響應狀態碼,因為發送的請求沒有請求頭。因為網站往往都會檢測請求頭的User-Agent,如果ua不合法,可能會獲取不到響應。所以加請求頭的目的就是模擬瀏覽器,欺騙伺服器,獲取和瀏覽器一致的內容。當然,有的時候甚至不止需要傳User-Agent一個參數,請求信息還需要其他的參數像Referer,Cookie等等。通過字典的形式。多個請求頭信息,使用多個鍵值對的形式。headers = {"User-Agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'}requests.get(url, headers=headers)
後面的headers就是字典
我們以豆瓣的信息檢索為例,比如我們在豆瓣上查詢【阿凡達】
import requests
import pprint
# 檢索阿凡達的信息
url = 'https://www.douban.com/search?q=%E9%98%BF%E5%87%A1%E8%BE%BE'
# 定義headers請求頭
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36"
}
# 在請求頭中帶上User-Agent,模擬瀏覽器發送請求
response = requests.get(url, headers=headers)
# 使用pprint進行格式化的輸出
pprint.pprint(response.text)結果:
大家發現在上面的豆瓣請求中是有參數的,就是【?】後面的內容部分。上面案例中將阿凡達直接進行了編碼。
那如果有參數requests主要如何使用呢?
方式一:直接跟在請求連結的後面,如https://www.baidu.com/s?wd=python。wd=python就是參數。多個參數之間使用符號【&】連結。
https://www.baidu.com/s?wd=Python&pn=10
https://www.baidu.com/s?wd=Python&pn=20
https://www.baidu.com/s?wd=Python&pn=30
在wd=Python和pn=10之間使用符號【&】
# 方式一:直接發送帶參數的url的請求
import requests
headers = {"User-Agent": "ozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36"}
url = 'https://www.baidu.com/s?wd=Python'
# url中包含了請求參數,即在請求連結處?位置後面就是攜帶的參數
response = requests.get(url, headers=headers)
print(response.text)
方式二:使用params實現,類似headers的使用。先定義一個字典params ={'wd':'Python','pn':10}requests.get(url, headers=headers,params=params)
後面的params就是攜帶的參數
import requests
headers = {"User-Agent": "ozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36"}
# 下面的url如果使用params可以省略?
url = 'https://www.baidu.com/s'
# 請求參數是一個字典 即wd=Python和pn=10
params = {'wd':'Python','pn':10}
# 在params上設置字典
response = requests.get(url, headers=headers, params=params)
# 獲取結果並列印
print(response.text)
但是還有檢索的內容是中文的情況怎麼處理?因為我們大多數使用百度搜索內容都是中文的內容。requests模塊好用之處就在此,如果檢索的內容是中文,直接寫成中文就可以了,我們無需自己轉碼的。方便吧?那麼哪些地方我們會用到POST請求?
需要傳輸大文本內容的時候( POST 請求對數據長度沒有要求)用法:
response = requests.post("請求地址", data = 字典類型的參數,headers=字典類型的請求頭)
本次案例我們使用http://httpbin.org/測試網址,在這個網站中你可以測試使用不同的請求方法。代碼:使用response對象下面的json()獲取。
import requests # 導入網絡請求模塊requests
# 字典類型的表單參數
data = {
'a': '好好學習,天天向上!',
'b': '強身健體,天天Happy'
}
#發送網絡請求
response = requests.post('http://httpbin.org/post', data=data)
print(response.json()) #列印轉換後的響應數據
返回的是一個json字符串結果。如果想將結果轉成字典形式就要使用json模塊的loads()完成import requests # 導入網絡請求模塊requests
import json # 導入json模塊
# 字典類型的表單參數
data = {
'a': '好好學習,天天向上!',
'b': '強身健體,天天Happy'
}
#發送網絡請求
response = requests.post('http://httpbin.org/post', data=data)
response_dict = json.loads(response.json())#將響應數據json轉換為字典類型
print(response_dict) #列印轉換後的響應數據為了讓伺服器認為不是同一個客戶端在請求,因為同一個客戶端的ip地址是固定不變的,使用ip代理就可以不斷的切換ip地址,這樣就可以防止我們的真實地址被洩露,甚至被追究。正向代理:給客戶端做代理,隱藏客戶端的ip地址,讓伺服器不知道客戶端的真實ip地址
反向代理:給伺服器做代理,隱藏伺服器的真實ip地址,同時可以實現負載均衡,處理靜態文件請求等作用,比如nginx
在使用過程中,從請求使用的協議可以分為3種,但是使用哪一種,要在使用的時候需要根據抓取網站的協議來選擇。http代理 https代理 socket代理等
找了一些代理網站,但是有些網站是要付費的,根據需求決定是否需要付費使用。
http://ip.kxdaili.com/ 開心代理https://proxy.mimvp.com/free.php 米撲代理http://www.xiladaili.com/ 西拉免費代理IPhttp://ip.jiangxianli.com/ 免費代理IP庫http://www.superfastip.com/ 極速代理https://proxy.mimvp.com/free.php 米撲代理http://www.shenjidaili.com/open/ 神雞代理IPhttp://31f.cn/http-proxy/ 三一代理http://www.feiyiproxy.com/?page_id=1457 飛蟻代理http://ip.zdaye.com/dayProxy/2019/4/1.html 站大爺http://www.66ip.cn 66免費代理網https://www.kuaidaili.com/free/inha 快代理https://www.xicidaili.com 西刺http://www.ip3366.net/free/?stype=1 雲代理http://www.iphai.com/free/ng IP海http://www.goubanjia.com/ 全網代理http://www.89ip.cn/index.html 89免費代理http://www.qydaili.com/free/?action=china&page=3 旗雲代理import requests
import random
# 代理的使用
url = "https://www.baidu.com"
# 獲取的代理ip地址,放在一個字典中,可以寫多個使用隨機數不斷變化選取
# 注意:免費代理的地址是有失效時間的,自己可以去上面網站找合適的
ips = ['221.222.84.131:9000','124.42.7.103:80','116.214.32.51:8080','222.73.68.144:8090','117.121.100.9:3128']
proxy = {
'http': random.choice(ips),
}
response = requests.get(url, proxies=proxy)
print(response.text)
如果爬取的內容是多頁,就可以每頁隨機的選擇ip地址使用了。代理IP使用的注意點:反反爬使用代理ip是非常必要的一種反反爬的方式,但是即使使用了代理ip,對方伺服器任然會有很多的方式來檢測我們是否是一個爬蟲,比如:一段時間內,檢測IP訪問的頻率,訪問太多頻繁會屏蔽;檢查Cookie,User-Agent,Referer等header參數,若沒有則屏蔽;服務方購買所有代理提供商,加入到反爬蟲資料庫裡,若檢測是代理則屏蔽等。所以更好的方式在使用代理ip的時候使用隨機的方式進行選擇使用,不要每次都用一個代理ip代理ip池的更新:購買的代理ip很多時候大部分(超過60%)可能都沒辦法使用,這個時候就需要通過程序去檢測哪些可用,把不能用的刪除掉。好嘍!對於這些內容大家還滿意嗎?如果還有不清楚的歡迎大家留言哦!系列文章