爬虫实战学习笔记_6 网络请求request模块:基本请求方式+设置请求头+获取cookies+模拟登陆+会话请求+验证请求+上传文件+超时异常
1 requests
requests是Python中實現HTTP請求的一種方式,requests是第三方模塊,該模塊在實現HTTP請求時要比urlib、urllib3模塊簡化很多,操作更加人性化。
2 基本請求方式
由于requests模塊為第三方模塊,所以在使用requests模塊時需要通過執行“pipinstallrequests”代碼進行該模塊的安裝。
如果使用了Anaconda,則不需要單獨安裝requests模塊。
2.1 requests發送GET請求+獲取網站頁面時,設置編碼防止亂碼
import requests # 導入網絡請求模塊requests# 發送網絡請求 response = requests.get('https://www.baidu.com') print('響應狀態碼:',response.status_code) # 響應狀態碼: 200 print('請求網絡地址',response.url) # 請求網絡地址 https://www.baidu.com/ print('頭部信息',response.headers) # 頭部信息 {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Mon, 28 Mar 2022 13:01:40 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:23:55 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'} print('cookie信息',response.cookies) # cookie信息 <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>response.encoding = 'utf-8' # 設置編碼 防止亂碼 print(response.text) # 文本的形式打印2.2 requests模塊獲取圖片信息并保存
import requests # 導入網絡請求模塊requests# 發送網絡請求,下載百度logo response = requests.get('https://www.baidu.com/img/bd_logo1.png') print(response.content) # 打印二進制數據 with open('百度logo.png','wb')as f: # 通過open函數將二進制數據寫入本地文件f.write(response.content) # 寫入2.3 requests模塊的POST請求
import requests # 導入網絡請求模塊requests import json # 導入json模塊# 字典類型的表單參數 data = {'1':'好運常伴','2':'平安喜樂'} # 發送網絡請求 response = requests.post('http://httpbin.org/post',data=data) response_dict = json.loads(response.text) # 將響應數據轉換為字典類型 print(response_dict) # 打印轉換后的響應數據3 高級請求方式
requests模塊將復雜的請求頭、Cookie以及網絡超時請求方式進行了簡化,只要在發送請求時設置對應的參數即可實現復雜的網絡請求。
3.1 設置請求頭
請求一個網頁內容時,發現通過GET或者POST以及其他請求方式,都會出現403錯誤。原因在于服務器拒絕了用戶的訪問,因為通過檢測頭部信息的方式防止惡意采集。解決方案:模擬瀏覽器的頭部信息來進行訪問。
3.1.1 代碼實現:requests模塊設置請求頭
import requests # 導入網絡請求模塊requestsurl = 'https://www.baidu.com/' # 創建需要爬取網頁的地址 # 創建頭部信息 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0'} response = requests.get(url, headers=headers) # 發送網絡請求 print(response.status_code) # 打印響應狀態碼 2003.2 獲取cookies
在爬取某些數據時,需要進行網頁的登錄,才可以進行數據的抓取工作。Cookie登錄就像很多網頁中的自動登錄功能一樣,可以讓用戶在第二次登錄時不需要驗證賬號和密碼直接登錄。
在使用requests模塊實現Cookie登錄時,首先在瀏覽器的開發者工具頁面中找到可以實現登錄的Cookie信息,然后將Cookie信息處理并添加至RequestsCookieJar的對象中,最后將RequestsCookieJar對象作為網絡請求的Cookie參數,發送網絡請求即可。
3.2.1 代碼實現:requests模塊獲取cookies
import requests # 導入網絡請求模塊 from lxml import etree # 導入lxml模塊cookies = '此處填寫登錄后網頁中的cookie信息' headers = {'Host': 'www.XXXXX.com','Referer': 'https://www.baidu.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ''AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/72.0.3626.121 Safari/537.36'} # 創建RequestsCookieJar對象,用于設置cookies信息 cookies_jar = requests.cookies.RequestsCookieJar() for cookie in cookies.split(';'):key, value = cookie.split('=', 1)cookies_jar.set(key, value) # 將cookies保存RequestsCookieJar當中 # 發送網絡請求 response = requests.get('https://www.douban.com/',headers=headers, cookies=cookies_jar) if response.status_code == 200: # 請求成功時html = etree.HTML(response.text) # 解析html代碼# 獲取用戶名name = html.xpath('//*[@id="db-global-nav"]/div/div[1]/ul/li[2]/a/span[1]/text()')print(name[0]) # 打印用戶名3.3?會話請求
設置Cookie的方式先實現模擬登錄,然后再獲取錄后頁面的信息內容,比較繁瑣。
3.3.1 會話請求功能
requests模塊中的Session對象實現在同一會話內發送多次網絡請求。即創建一個登陸好的對象,在該對象的屬性中進行登陸操作,登陸完成后該對象就是已登陸成功的模擬用戶,可以隨意發送請求進行數據的收集。
3.3.1 代碼實現:requests模塊會話請求
import requests # 導入requests模塊 # 原理:使用同一個對象獲取,分別從這個對象讀取不同的頁面信息 s = requests.Session() # 創建會話對象 data={'username': 'LiBiGor', 'password': '123456'} # 創建用戶名、密碼的表單數據 # 發送登錄請求 response_1 = s.post('http://site.XXXX.com:8001/index/checklogin.html',data=data) response_2 = s.get('http://site.XXXX.com:8001') # 發送登錄后頁面請求 print('登錄信息:',response_1.text) # 打印登錄信息 print('登錄后頁面信息如下:\n',response_2.text) # 打印登錄后的頁面信息3.4 驗證請求頁面
3.4.1 驗證請求簡述
在查看文章時,會突然彈出要求登陸賬號密碼的情況,防止惡意爬取。
requests模塊自帶了驗證功能,只需要在請求方法中填寫auth參數,該參數的值是一個帶有驗證參數(用戶名與密碼)的HTTPBasicAuth對象。
3.4.2?代碼實現:requests模塊解決驗證請求
import requests # 導入requests模塊 from requests.auth import HTTPBasicAuth # 導入HTTPBasicAuth類url = 'http://sck.XXX.com:8001/spider/auth/' # 定義請求地址 ah = HTTPBasicAuth( 'LiBiGor', '123456') #創建HTTPBasicAuth對象,參數為用戶名與密碼 response = requests.get(url=url,auth=ah) # 發送網絡請求 if response.status_code==200: # 如果請求成功print(response.text) # 打印驗證后的HTML代碼3.5 網絡超時與異常
在訪問一個網頁時,如果該網頁長時間未響應,系統就會判斷該網頁超時,所以無法打開網頁。
3.5.1 代碼實現:requests模塊模擬超時異常
import requests # 導入網絡請求模塊 # 循環發送請求50次 for a in range(0, 50):try: # 捕獲異常# 設置超時為0.5秒response = requests.get('https://www.baidu999.com/', timeout=0.1)print(response.status_code) # 打印狀態碼except Exception as e: # 捕獲異常print('異常'+str(e)) # 打印異常信息3.5.2 代碼實現:requests模塊判斷網絡異常
import requests # 導入網絡請求模塊 # 導入requests.exceptions模塊中的三種異常類 from requests.exceptions import ReadTimeout,HTTPError,RequestException # 循環發送請求50次 for a in range(0, 50):try: # 捕獲異常# 設置超時為0.1秒response = requests.get('https://www.baidu999.com/', timeout=0.1)print(response.status_code) # 打印狀態碼except ReadTimeout: # 超時異常print('timeout')except HTTPError: # HTTP異常print('httperror')except RequestException: # 請求異常print('reqerror')3.6 上傳文件
3.6.1 上傳圖片文件
使用requests模塊實現向服務器上傳文件也是非常簡單的,只需要指定post()函數中的files參數可以指定一個BufferedReader對象,該對象可以使用內置的open()函數返回。
3.6.2?代碼實現:requests模塊上傳圖片文件
import requests # 導入網絡請求模塊 bd = open('百度logo.png','rb') # 讀取指定文件 file = {'file':bd} # 定義需要上傳的圖片文件 # 發送上傳文件的網絡請求 response = requests.post('http://httpbin.org/post',files = file) print(response.text) # 打印響應結果3.7 設置IP代理
在爬取網頁的過程中,IP被爬取網站的服務器所屏蔽經常導致失敗。此時代理服務可以解決這一麻煩。設置代理時,首先需要找到代理地址,
例如,1788.176.38對應的端口號為3000,完整的格式為117.88.176.38:3000
3.7.1??代碼實現:requests模塊設置IP代理
import requests # 導入網絡請求模塊 # 頭部信息 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ''AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/72.0.3626.121 Safari/537.36'} proxy = {'http': 'http://117.88.176.38:3000','https': 'https://117.88.176.38:3000'} # 設置代理ip與對應的端口號 try:# 對需要爬取的網頁發送請求response = requests.get('http://baidu.com', headers= headers,proxies=proxy,verify=False,timeout=3)print(response.status_code) # 打印響應狀態碼 except Exception as e:print('錯誤異常信息為:',e) # 打印異常信息
?
總結
以上是生活随笔為你收集整理的爬虫实战学习笔记_6 网络请求request模块:基本请求方式+设置请求头+获取cookies+模拟登陆+会话请求+验证请求+上传文件+超时异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql导入10g数据库_oracle
- 下一篇: 【Pytorch神经网络实战案例】25