- requests庫的使用
pip快速安裝
pip install requests
請求方法
每一個請求方法都有一個對應的API,比如GET請求就可以使用get()方法:
import requests # 發送請求 res = requests.get('https://www.baidu.com/') # encoding設置編碼 res.encoding ='utf-8' # text 接收返回內容 print(res.text)
而POST請求就可以使用post()方法,並且將需要提交的數據傳遞給data參數即可:
import requests # 發送請求 res = requests.post('http://www.httpbin.org/post',data={'username':'q123','password':123}) # encoding設置編碼 res.encoding ='utf-8' # text 接收返回內容 print(res.text)
傳遞URL參數
傳遞URL參數也不用再像urllib中那樣需要去拼接URL,而是簡單的,構造一個字典,並在請求時將其傳遞給params參數:
import requests # 設置參數 params = {'kay1':32324242, 'kay2':'fwewefewf232'} # url拼接 res = requests.get(url='http://httpbin.org/get',params=params) # 打印url print(res.url)
自定義Headers
如果想自定義請求的Headers,同樣的將字典數據傳遞給headers參數
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'} res = requests.get(url='https://www.baidu.com/', headers=headers) print(res.headers)
自定義Cookies
Requests中自定義Cookies也不用再去構造CookieJar對象,直接將字典遞給cookies參數。
import requests cookies = {'cookies_are':'working'} res = requests.get(url='http://httpbin.org/cookies', cookies=cookies) print(res.text)
設置代理(proxite)
當我們需要使用代理時,同樣構造代理字典,傳遞給proxies參數。
import requests proxite = { 'http':'http://172.0.0.1:3128', 'https':'http://172.0.0.1:3128' } requests.get('https://www.baidu.com/',proxite=proxite)
重定向(allow_redirects)
在網絡請求中,我們常常會遇到狀態碼是3開頭的重定向問題,在Requests中是默認開啟允許重定向的,即遇到重定向時,會自動繼續訪問。
import requests # 重定向(False=關閉重定向,True=開戶重定向) requests.get('https://www.baidu.com/', allow_redirects=False)
禁止證書驗證(verify)
有時候我們使用了抓包工具,這個時候由於抓包工具提供的證書並不是由受信任的數字證書頒發機構頒發的,所以證書的驗證會失敗,所以我們就需要關閉證書驗證。 在請求的時候把verify參數設置為False就可以關閉證書驗證了。
import requests # 證書驗證(False=關閉驗證,True=開戶驗證) requests.get('https://www.baidu.com/', verify=False)
設置超時(timeout)
設置訪問超時,設置timeout參數即可。
import requests # 設置超時 requests.get('https://www.baidu.com/', timeout=0.1)
- 接收響應
響應內容(text)
通過Requests發起請求獲取到的,是一個requests.models.Response對象。通過這個對象我們可以很方便的獲取響應的內容。
之前通過urllib獲取的響應,讀取的內容都是bytes的二進制格式,需要我們自己去將結果decode()一次轉換成字符串數據。
而Requests通過text屬性,就可以獲得字符串格式的響應內容。
import requests # 接收響應內容 res = requests.get('https://www.baidu.com/') print(res.text)
字符編碼(encoding)
Requests會自動的根據響應的報頭來猜測網頁的編碼是什么,然后根據猜測的編碼來解碼網頁內容,基本上大部分的網頁都能夠正確的被解碼。而如果發現text解碼不正確的時候,就需要我們自己手動的去指定解碼的編碼格式。
import requests # 字符編碼 res = requests.get('https://www.baidu.com/') res.encoding = 'utf-8' print(res.text)
二進制數據(content)
而如果你需要獲得原始的二進制數據,那么使用content屬性即可。
import requests # 二進制數據 res = requests.get('https://www.baidu.com/') print(res.content)
json數據(json)
如果我們訪問之后獲得的數據是JSON格式的,那么我們可以使用json()方法,直接獲取轉換成字典格式的數據。
import requests res = requests.get('https://api.github.com/events') # 轉換為json數據 res.json() print(res.text)
狀態碼(status_code)
通過status_code屬性獲取響應的狀態碼
import requests res = requests.get('https://api.github.com/events') print(res.status_code)
響應報頭(headers)
通過headers屬性獲取響應的報頭
import requests res = requests.get('https://api.github.com/events') print(res.headers)
服務器返回的cookies(cookies)
通過cookies屬性獲取服務器返回的cookies
import requests res = requests.get('https://api.github.com/events') print(res.cookies)
url
還可以使用url屬性查看訪問的url。
import requests res = requests.get('https://api.github.com/events') print(res.url)
- Session對象
在Requests中,實現了Session(會話)功能,當我們使用Session時,能夠像瀏覽器一樣,在沒有關閉關閉瀏覽器時,能夠保持住訪問的狀態。 這個功能常常被我們用於登陸之后的數據獲取,使我們不用再一次又一次的傳遞cookies。
首先我們需要去生成一個Session對象,然后用這個Session對象來發起訪問,發起訪問的方法與正常的請求是一摸一樣的。 同時,需要注意的是,如果是我們在get()方法中傳入headers和cookies等數據,那么這些數據只在當前這一次請求中有效。如果你想要讓一個headers在Session的整個生命周期內都有效的話,需要用以下的方式來進行設置:
import requests # 發送請求 res = requests.get('https://api.github.com/events') # 創建session實例 session = requests.Session() # 用session發送請求 resp = session.get('https://api.github.com/events') print(resp.text)
- 爬蟲例子
爬取鈴聲:
import requests from lxml import etree # 用戶輸入要爬取的頁碼 load =input('請輸入您需要下載的頁碼:') # 發送請求並以二進制讀取數據 mp3_url =requests.get('http://ring.itools.cn/index.php?m=applist&gid=zuire&page=%s'%load).content.decode() # 解析下載的數據(轉換為html) html = etree.HTML(mp3_url) # 用xpath獲得鈴聲的鏈接 html_data = mp3_url.xpath('//div/a/@lurl') # 循環取列表中的鏈接 for url in html_data: # 發送鈴聲的鏈接以二是制獲取鈴聲的內容 url_go = requests.get(url).content # 分割鏈接,用以命名 name = url.split('/')[-1] # 打開文件 with open('mp3/%s'%name,'wb') as f: f.write(url_go) print('下載完成:',name) print('已經全部下載完成')
豆瓣登錄案例:
import requests # 登錄頁面 img_url='https://accounts.douban.com/j/mobile/login/basic' # 添加請求頭 headers ={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36', } # 發送登錄信息,登錄信息在瀏覽器F12中查找或在抓包工具中獲得 data ={ 'ck': '5oo_', 'name': '1598959****', 'password': 'q12322333', 'remember': 'false' } # 發送登錄信息到服務器 imges=requests.post(img_url,data=data,verify=False,headers=headers) # 接收服務器返回的cookies cookies =imges.cookies # 發送請求 idex =requests.get('https://www.douban.com/',headers=headers,cookies=cookies) print(idex.text)
糗事百科信息提取案例:
import re import requests # 用戶輸入采集頁面 page = input('輸入收集的頁面:') # 設置請求頭 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36', 'Referer': 'https://www.qiushibaike.com/hot/page/1/' } # 發送請求並讀取返回的內容 res =requests.get('https://www.qiushibaike.com/hot/page/%s/'%page,headers=headers,verify=False).text # 用re模塊提取想要的信息 user = re.findall(r"id='qiushi_tag_1(.*?)'>",res,re.S) # 拼接鏈接 url =['https://www.qiushibaike.com/article/'+url for url in user] for i in url: # 發送請求 user_url =requests.get(i,headers=headers).text # 用re模塊提取想要的信息 name= re.findall(r'<h1 class="article-title">\n(.*?)的糗事:',user_url,re.S)[0] tim = re.findall(r'<span class="stats-time">\n(.*?)\n</span>',user_url,re.S)[0] content =re.findall(r'<div class="content">(.*?)</div>',user_url,re.S)[0] print('用戶:',name.strip()) print('發布時間:',tim) print(content,'\n') 3