Python爬蟲 | requests模擬瀏覽器發送請求

1、什麼是requests 模塊

  requests模塊是python中原生的基於網絡請求的模塊,功能強大,用法簡潔高效。在爬蟲領域中佔據着半壁江山的地位。requests模塊做用:模擬瀏覽器發請求。html

 

2、爲何要使用requests 模塊

 由於在使用urllib模塊的時候,會有諸多不便之處,總結以下: python

  • 手動處理url編碼
  • 手動處理post請求參數
  • 處理cookie和代理操做繁瑣
  • ......

 

  而使用requests模塊的優點: web

  • 自動處理url編碼
  • 自動處理post請求參數
  • 簡化cookie和代理操做
  • ......

3、如何使用requests模塊

 安裝: pip install requestsajax

 使用流程redis

  • 指定url
  • 基於requests模塊發起請求
  • 獲取響應對象中的數據值
  • 持久化存儲

 

requests 模塊的各類請求方式數據庫

   

最經常使用的請求方式就是 post 和 get 請求。params 在 get 請求中使用,data、json在post請求中使用。自動和url進行拼接,發請求。json

response = requests.get(url, params={'key':'value'}) response = requests.post(url, data={'key':'value'})

 

請求參數

一般請求參數有如下幾個瀏覽器

  • url :須要抓取的URL地址
  • headers : 請求頭
  • timeout : 超時時間,超過期間會拋出異常

 

下面,再分享2個其餘可能會遇到的參數,關於很是重要的IP參數,在後面進行講解。服務器

(1)authWeb客戶端驗證參數cookie

res = requests.get(url, headers=headers, auth=('username','password'))

針對於須要web客戶端用戶名密碼認證的網站

例如:

import requests from lxml import etree import random import os class CodeSpider(object): def __init__(self): self.url = 'http://code.tarena.com.cn/AIDCode/aid1904/14-redis/' self.auth = ('tarenacode', 'code_2013') self.ua_list = [ 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .\ NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)', ] def parse_html(self): # 獲取響應內容
        html = requests.get(url=self.url, headers={'User-Agent': random.choice(self.ua_list)}, auth=self.auth) html = html.content.decode('utf-8', 'ignore') parse_html = etree.HTML(html) r_list = parse_html.xpath('//a/@href')      # # r_list : ['../','day01','day02','redis_day01.zip']
        for r in r_list: if r.endswith('.zip') or r.endswith('.rar'): self.save_files(r) def save_files(self, r): directory = '/home/tarena/AID/redis/'
        if not os.path.exists(directory): os.makedirs(directory) # 拼接地址,把zip文件保存到指定目錄
        url = self.url + r # filename: /home/tarena/AID/redis/xxx.zip
        filename = directory + r html = requests.get(url=url, headers={'User-Agent': random.choice(self.ua_list)}, auth=self.auth).content with open(filename, 'wb') as f: f.write(html) print('%s下載成功' % r) if __name__ == '__main__': spider = CodeSpider() spider.parse_html()

(2)SSL證書認證參數-verify

SSL證書認證參適用於沒有通過證書認證機構認證的https類型網站,若是網站拋出 SSLError 異常,則考慮使用此參數。

response = requests.get(url=url,params=params,headers=headers,verify=False) 

verify:

  • True   ( 默認 ) 檢查證書認證;
  • False(經常使用)忽略證書認證;

 

響應對象response的屬性

  • text :返回的是Unicode型的數據;取html源碼;
  • content :返回的是bytes型也就是二進制的數據。取圖片,文件;
  • json() : 返回的是json格式數據;
  • status_code :HTTP響應碼;
  • encoding :響應字符編碼 response.encoding = 'utf-8';

 

非結構化數據的保存方式。如壓縮文件zip、圖片文件等均可以使用非結構化數據的保存方式

with open('xxx.jpg','wb') as f: f.write(response.content)

 

4、User-Agent  *****

  經過自定義請求對象,用於假裝爬蟲程序請求的身份。

   User-Agent參數,簡稱爲UA,該參數的做用是用於代表本次請求載體的身份標識。若是咱們經過瀏覽器發起的請求,則該請求的載體爲當前瀏覽器,則UA參數的值代表的是當前瀏覽器的身份標識表示的一串數據。若是咱們使用爬蟲程序發起的一個請求,則該請求的載體爲爬蟲程序,那麼該請求的UA爲爬蟲程序的身份標識表示的一串數據。有些網站會經過辨別請求的UA來判別該請求的載體是否爲爬蟲程序若是爲爬蟲程序,則不會給該請求返回響應,那麼咱們的爬蟲程序則也沒法經過請求爬取到該網站中的數據值,這也是反爬蟲的一種初級技術手段。爲了防止該問題的出現,則咱們能夠給爬蟲程序的UA進行假裝,假裝成某款瀏覽器的身份標識。

 

 

UA檢測:網站服務器會檢測請求的載體身份標識,若是檢測到是基於爬蟲程序的,則阻止該次請求。

 

UA假裝(反爬機制):

 

反爬機制:某些門戶網站會對訪問該網站的請求中的User-Agent進行捕獲和判斷,若是該請求的UA爲爬蟲程序,則拒絕向該請求提供數據。

 

反反爬策略:將爬蟲程序的UA假裝成某一款瀏覽器的身份標識。

 

import requests url = 'http://www.baidu.com/' headers={  'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'  } request =request.get(url=url,headers=headers)

 

 

找到User-Agent,複製下來。

 

 5、requests 模塊使用實例

1 基於requests模塊的get請求

示例:爬取搜狗指定詞條搜索後的頁面數據 (網頁採集器, 動態獲取)

 1 import requests  2 word = input('enter a word:')  3 url = 'https://www.sogou.com/web'  4  5 headers = {  6 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'  7 }  8  9 param = { 10 'query':word 11 } 12 13 response = requests.get(url=url,params=param) 14 page_text = response.text 15 16 fileName = word+'.html' 17 with open(fileName,'w',encoding='utf-8') as fp: 18  fp.write(page_text) 19 20 print(fileName,'爬取成功!')
View Code

 

基於requests模塊的post請求

示例:登陸豆瓣電影,爬取登陸成功後的頁面數據

 1 import requests  2 import os  3  4 url = 'https://accounts.douban.com/login'  5  6 data = {  7 "source": "movie",  8 "redir": "https://movie.douban.com/",  9 "form_email": "131XXXXXXXX", 10 "form_password": "***", 11 "login": "登陸", 12 } 13 14 headers={ 15 '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', 16 } 17 18 response = requests.post(url=url,data=data) 19 page_text = response.text 20 with open('./douban111.html','w',encoding='utf-8') as fp: 21 fp.write(page_text)
View Code

 

基於requests模塊ajax的get請求 

示例:爬取豆瓣電影分類排行榜中的電影詳情數據

 1 import requests  2 headers = {  3 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'  4 }  5 url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20'  6  7 movie_list = requests.get(url=url,headers=headers).json()  8  9 all_names = [] 10 for dic in movie_list: 11 name = dic['title'] 12  all_names.append(name) 13 14 print(all_names)
View Code

 

基於requests模塊ajax的post請求

示例:破解百度翻譯

 1 import requests  2  3 url = 'https://fanyi.baidu.com/sug'  4 wd = input('enter something of English:')  5 data = {  6 'kw':wd  7 }  8  9 10 headers = { 11 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' 12 } 13 14 response = requests.post(url=url,data=data,headers=headers) 15 16 obj_json = response.json() 17 print(obj_json)
View Code

 

綜合練習:爬取國家藥品監督管理總局中基於中華人民共和國化妝品生產許可證相關數據

 1 import requests  2 from fake_useragent import UserAgent  3  4 ua = UserAgent(use_cache_server=False,verify_ssl=False).random  5 headers = {  6 'User-Agent':ua  7 }  8  9 url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' 10 11 all_id_list = [] 12 13 for page in range(1,11): 14 data = { 15 'on': 'true', 16 'page': str(page), 17 'pageSize': '15', 18 'productName':'', 19 'conditionType': '1', 20 'applyname':'', 21 'applysn':'' 22 } 23 24 json_text = requests.post(url=url,data=data,headers=headers).json() 25 for dict in json_text['list']: 26 id = dict['ID'] 27  all_id_list.append(id) 28 29 30 post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' 31 for id in all_id_list: 32 post_data = { 33 'id': id 34  } 35 response = requests.post(url=post_url, data=post_data, headers=headers) 36 37 if response.headers['Content-Type'] == 'application/json;charset=UTF-8': 38 json_text = response.json() 39 print(json_text['businessPerson'])
View Code

 

查看是否是動態加載頁面,就在開發者工具中的response中搜索。不能搜到就證實是動態加載出來的。

 

其餘概念:

 

  • 結構化數據:即行數據,存儲在數據庫裏,能夠用二維表結構來邏輯表達實現的數據。
  • 非結構化數據:包括全部格式的辦公文檔、文本、圖片、XML、HTML、各種報表、圖像和音頻/視頻信息等等。

 

原文出處:https://www.cnblogs.com/Summer-skr--blog/p/11396904.html

相關文章
相關標籤/搜索