爬蟲(1):requests模組
阿新 • • 發佈:2018-12-22
requests介紹:
reqeusts模組:python原生一個基於網路請求的模組,模擬瀏覽器發起請求。
requests模組的優點:
- 1.自動處理url編碼 - 2.自動處理post請求的引數 - 3.簡化cookie的代理的操作: cookie操作: - 建立一個cookiejar物件 - 建立一個handler物件 - 建立一個operner 代理操作: - 建立handler物件,代理ip和埠封裝到該物件 - 建立openner物件
reqeusts的使用流程:
- 安裝:pip install requests- 使用流程: - 1.指定url - 2.使用requests模組發起請求 - 3.獲取響應資料 - 4.進行持久化儲存
requests的使用:
一、 requests基礎用法:
1. 基於requests模組發起get請求
需求:爬取搜狗首頁的頁面資料
import requests #指定url url = 'https://www.sogou.com/' #發起get請求:get方法會返回請求成功的相應物件 response = requests.get(url=url) #獲取響應中的資料值: page_data = response.text #text可以獲取響應物件中 字串 形式的頁面資料 print(page_data) #持久化操作 with open('./sougou.html','w',encoding='utf-8') as fp: fp.write(page_data)
response物件其他的屬性:
#response物件中其他重要的屬性 import requests #指定url url = 'https://www.sogou.com/' # requests.get() :發起get請求:get方法會返回請求成功的相應物件 response = requests.get(url=url)# response.content 獲取的是response物件中二進位制(byte)型別的頁面資料 #print(response.content) # response.status_code :返回一個響應狀態碼 #print(response.status_code) # response.headers :返回響應頭資訊 #print(response.headers) # response.url :獲取請求的url #print(response.url)
requests 傳送攜帶 引數 的 get 請求:
需求:指定一個詞條,獲取搜狗搜尋結果所對應的頁面資料
方式一:
import requests url = 'https://www.sogou.com/web?query=周杰倫&ie=utf-8' # 引數直接放到 url 中 response = requests.get(url=url) page_text = response.text with open('./zhou.html','w',encoding='utf-8') as fp: fp.write(page_text)
方式二:
import requests #自定義請求頭資訊 headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #指定url url = 'https://www.sogou.com/web' #封裝get請求引數;放到一個字典中 prams = { 'query':'周杰倫', 'ie':'utf-8' } #發起請求 response = requests.get(url=url,params=param) # 設定 params=param response.status_code
自定義請求頭資訊:
import requests url = 'https://www.sogou.com/web' #將引數封裝到字典中 params = { 'query':'周杰倫', 'ie':'utf-8' } #自定義請求頭資訊 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } response = requests.get(url=url,params=params,headers=headers) # 設定 headers=headers 請求頭 response.status_code
2. 基於requests模組發起的post請求:
需求:登入豆瓣網,獲取登入成功後的頁面資料
import requests #1.指定post請求的url url = 'https://accounts.douban.com/login' #封裝post請求的引數;POST請求的請求體資訊要放在一個字典中 data = { "source": "movie", "redir": "https://movie.douban.com/", "form_email": "15027900535", "form_password": "[email protected]", "login": "登入", } #自定義請求頭資訊 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #2.發起post請求 response = requests.post(url=url,data=data,headers=headers) # data=data 設定請求體資訊 #3.獲取響應物件中的頁面資料 page_text = response.text #4.持久化操作 with open('./douban.html','w',encoding='utf-8') as fp: fp.write(page_text)
3.基於 Ajax的GET請求:
需求:抓取豆瓣電影上電影詳情的資料
import requests url = 'https://movie.douban.com/j/chart/top_list?' #封裝ajax的get請求中攜帶的引數;字典的形式 params = { 'type':'5', 'interval_id':'100:90', 'action':'', 'start':'100', 'limit':'20' } #自定義請求頭資訊 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } response = requests.get(url=url,params=params,headers=headers) # params=params 設定 ajax 請求中攜帶的引數 print(response.text)
4. 基於 ajax的POST請求:
需求:爬去肯德基城市餐廳位置資料
import requests #1指定url post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' #處理post請求的引數;字典的形式 data = { "cname": "", "pid": "", "keyword": "上海", "pageIndex": "1", "pageSize": "10", } #自定義請求頭資訊 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #2發起基於ajax的post請求 response = requests.post(url=post_url,headers=headers,data=data) # data=data 設定 ajax 請求體中的引數 response.text
5. 綜合使用:
需求:爬取搜狗知乎某一個詞條對應一定範圍頁碼錶示的頁面資料
import requests import os #建立一個資料夾 if not os.path.exists('./pages'): os.mkdir('./pages') word = input('enter a word:') # 動態傳入要爬取的詞條 #動態指定頁碼的範圍 start_pageNum = int(input('enter a start pageNum:')) end_pageNum = int(input('enter a end pageNum:')) #自定義請求頭資訊 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #1.指定url:設計成一個具有通用的url url = 'https://zhihu.sogou.com/zhihu' for page in range(start_pageNum,end_pageNum+1): param = { 'query':word, 'page':page, 'ie':'utf-8' } response = requests.get(url=url,params=param,headers=headers) #獲取響應中的頁面資料(指定頁碼(page)) page_text = response.text #進行持久化儲存 fileName = word+str(page)+'.html' filePath = 'pages/'+fileName with open(filePath,'w',encoding='utf-8') as fp: fp.write(page_text) print('第%d頁資料寫入成功'%page)
二、requests模組的高階用法:
1. reqeusts模組的cookie操作:
- cookie: 基於使用者的使用者資料 - 需求:爬取張三使用者的豆瓣網的個人主頁頁面資料 - cookie作用:伺服器端使用cookie來記錄客戶端的狀態資訊。 實現流程: 1.執行登入操作(獲取cookie) 2.在發起個人主頁請求時,需要將cookie攜帶到該請求中 注意:reqeusts模組的session物件:傳送請求(會將cookie物件進行自動儲存)
示例:
import requests session = requests.session() # 利用 requests.session() 去獲取到一個 session 物件;該 session 物件能夠儲存伺服器返回給客戶端的cookie #1.發起登入請求:將cookie獲取,切儲存到session物件中 login_url = 'https://accounts.douban.com/login' data = { "source": "None", "redir": "https://www.douban.com/people/185687620/", "form_email": "15027900535", "form_password": "[email protected]", "login": "登入", } headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #使用session發起post請求 login_response = session.post(url=login_url,data=data,headers=headers) # 利用 requests 的 session物件 傳送 POST請求;通過伺服器的校驗後該 session物件會儲存 cookie #2.對個人主頁發起請求(session(cookie)),獲取響應頁面資料 url = 'https://www.douban.com/people/185687620/' response = session.get(url=url,headers=headers) # 利用 session物件 傳送 GET請求(攜帶著cookie) page_text = response.text with open('./douban110.html','w',encoding='utf-8') as fp: fp.write(page_text) # 注意: 爬蟲程式應該嚴格遵從瀏覽器的請求流程
2. requests模組的代理操作:
- 1.代理:第三方代理本體執行相關的事物。生活:代購,微商,中介 - 2.為什麼要使用代理? - 很多網站有反爬操作; - IP代理是一種反反爬手段 - 3.分類: - 正向代理:代替客戶端獲取資料 (我們的爬蟲用的是 正向代理) - 反向代理:代理伺服器端提供資料 - 4.免費代理ip的網站提供商: - www.goubanjia.com (推薦用這個) - 快代理 - 西祠代理
示例:
import requests url = 'http://www.baidu.com/s?ie=utf-8&wd=ip' headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #將代理ip封裝到字典;代理的協議應該和 url 中的協議一致,如:都是 http proxy = { 'http':'77.73.69.120:3128' } #更換網路IP response = requests.get(url=url,proxies=proxy,headers=headers) # proxies=proxy 設定代理 with open('./daili.html','w',encoding='utf-8') as fp: fp.write(response.text)