04.Python網絡爬蟲之requests模塊(1)

引入

Requests 惟一的一個非轉基因的 Python HTTP 庫,人類能夠安全享用。html

警告:非專業使用其餘 HTTP 庫會致使危險的反作用,包括:安全缺陷症、冗餘代碼症、從新發明輪子症、啃文檔症、抑鬱、頭疼、甚至死亡。python

今日概要web

  • 基於requests的get請求
  • 基於requests模塊的post請求
  • 基於requests模塊ajax的get請求
  • 基於requests模塊ajax的post請求
  • 綜合項目練習:爬取國家藥品監督管理總局中基於中華人民共和國化妝品生產許可證相關數據

知識點回顧ajax

  • 常見的請求頭
  • 常見的相應頭
  • https協議的加密方式

今日詳情

- 基於以下5點展開requests模塊的學習

  • 什麼是requests模塊
    • requests模塊是python中原生的基於網絡請求的模塊,其主要做用是用來模擬瀏覽器發起請求。功能強大,用法簡潔高效。在爬蟲領域中佔據着半壁江山的地位。
  • 爲何要使用requests模塊
    • 由於在使用urllib模塊的時候,會有諸多不便之處,總結以下:
      • 手動處理url編碼
      • 手動處理post請求參數
      • 處理cookie和代理操做繁瑣
      • ......
    • 使用requests模塊:
      • 自動處理url編碼
      • 自動處理post請求參數
      • 簡化cookie和代理操做
      • ......
  • 如何使用requests模塊
    • 安裝:
      • pip install requests
    • 使用流程
      • 指定url
      • 基於requests模塊發起請求
      • 獲取響應對象中的數據值
      • 持久化存儲
  • 經過5個基於requests模塊的爬蟲項目對該模塊進行學習和鞏固
    • 基於requests模塊的get請求
      • 需求:爬取搜狗指定詞條搜索後的頁面數據
    • 基於requests模塊的post請求
      • 需求:登陸豆瓣電影,爬取登陸成功後的頁面數據
    • 基於requests模塊ajax的get請求
    • 基於requests模塊ajax的post請求
    • 綜合練習
      • 需求:爬取國家藥品監督管理總局中基於中華人民共和國化妝品生產許可證相關數據http://125.35.6.84:81/xk/

- 代碼展現

1. 需求:爬取搜狗指定詞條搜索後的頁面數據

 

import requests url = "https://www.sogou.com/web" headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36' } param = { 'query': '人民幣' } response = requests.get(url=url,headers=headers,params=param) page_text = response.content with open("./人民幣.html","wb")as fp: fp.write(page_text)
ls

 

 

import requests import os #指定搜索關鍵字
word = input('enter a word you want to search:') #自定義請求頭信息
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':word, 'ie':'utf-8' } #發起請求
response = requests.get(url=url,params=param) #獲取響應數據
page_text = response.text with open('./sougou.html','w',encoding='utf-8') as fp: fp.write(page_text)
  • 請求載體身份標識的假裝:json

    • User-Agent:請求載體身份標識,經過瀏覽器發起的請求,請求載體爲瀏覽器,則該請求的User-Agent爲瀏覽器的身份標識,使用爬蟲程序發起的請求,則該請求的載體爲爬蟲程序,則該請求的User-Agent爲爬蟲程序的身份標識。能夠經過判斷該值來獲知該請求的載體到底是基於哪款瀏覽器仍是基於爬蟲程序。瀏覽器

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

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

2. 需求:登陸豆瓣電影,爬取登陸成功後的頁面數據網絡

 

import requests import os url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20181111632271 " headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" } data={ "email":"309684098@qq.com", "icode":"", "origURL":"http://www.renren.com/home", "domain":"renren.com", "key_id":"1", "captcha_type":"web_login", "password":"3456395b1409f12bf95c3686eb2307f9fdf648a16887f8c2e180f1fc8ca98ed2", "rkey":"df74aecc67127f57c5b8176c84274297" } response = requests.post(url=url,data=data,headers=headers) page_text = response.text with open("./renren.html","w",encoding="utf-8")as fp: fp.write(page_text)
ls

 

import requests import os url = 'https://accounts.douban.com/login'
#封裝請求參數
data = { "source": "movie", "redir": "https://movie.douban.com/", "form_email": "15027900535", "form_password": "bobo@15027900535", "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', } response = requests.post(url=url,data=data) page_text = response.text with open('./douban111.html','w',encoding='utf-8') as fp: fp.write(page_text) 

3.  需求:爬取豆瓣電影分類排行榜 https://movie.douban.com/中的電影詳情數據app

 

import requests url="https://movie.douban.com/j/new_search_subjects" param={ "sort":" U", "range": "0,10", "tags":"" , "start":"0", "genres": "喜劇" } headers = { "User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" } response = requests.get(url=url,headers=headers,params=param) json_text = response.json() json_text
ls

 

import requests import urllib.request if __name__ == "__main__": #指定ajax-get請求的url(經過抓包進行獲取)
    url = 'https://movie.douban.com/j/chart/top_list?'

    #定製請求頭信息,相關的頭信息必須封裝在字典結構中
    headers = { #定製請求頭中的User-Agent參數,固然也能夠定製請求頭中其餘的參數
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36', } #定製get請求攜帶的參數(從抓包工具中獲取)
    param = { 'type':'5', 'interval_id':'100:90', 'action':'', 'start':'0', 'limit':'20' } #發起get請求,獲取響應對象
    response = requests.get(url=url,headers=headers,params=param) #獲取響應內容:響應內容爲json串
    print(response.text)

4.  需求:爬取肯德基餐廳查詢http://www.kfc.com.cn/kfccda/index.aspx中指定地點的餐廳數據

 

import requests url="http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword" headres = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" } data={ "cname": "", "pid":"" , "keyword": "昌平", "pageIndex":"1" , "pageSize": "10", } response = requests.post(url=url,headers=headers,data=data,) json_text = response.json() json_text
ls

 

import requests import urllib.request if __name__ == "__main__": #指定ajax-post請求的url(經過抓包進行獲取)
    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'

    #定製請求頭信息,相關的頭信息必須封裝在字典結構中
    headers = { #定製請求頭中的User-Agent參數,固然也能夠定製請求頭中其餘的參數
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36', } #定製post請求攜帶的參數(從抓包工具中獲取)
    data = { 'cname':'', 'pid':'', 'keyword':'北京', 'pageIndex': '1', 'pageSize': '10' } #發起post請求,獲取響應對象
    response = requests.get(url=url,headers=headers,data=data) #獲取響應內容:響應內容爲json串
    print(response.text)

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

 

import requests url = " http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" } data={ "on": "true", "page": "3", "pageSize": "15", "productName": "", "conditionType": "1", "applyname":"", "applysn": "", } response = requests.post(url=url,headers=headers,data=data,) company_list = response.json()["list"] # company_list
company_info_list=[] for i in company_list: url_com="http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById" data_com = {"id": "9bd95640495845e5be0f252366b81a0c"} if i["XC_DATE"]: data_com["id"] = i["ID"] res = requests.post(url=url,headers=headers,data=data,) # res.json()
 company_info_list.append(res.json()) company_info_list
ls

 

import requests from fake_useragent import UserAgent ua = UserAgent(use_cache_server=False,verify_ssl=False).random headers = { 'User-Agent':ua } url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' pageNum = 3
for page in range(3,5): data = { 'on': 'true', 'page': str(page), 'pageSize': '15', 'productName':'', 'conditionType': '1', 'applyname':'', 'applysn':'' } json_text = requests.post(url=url,data=data,headers=headers).json() all_id_list = [] for dict in json_text['list']: id = dict['ID']#用於二級頁面數據獲取
        #下列詳情信息能夠在二級頁面中獲取
        # name = dict['EPS_NAME']
        # product = dict['PRODUCT_SN']
        # man_name = dict['QF_MANAGER_NAME']
        # d1 = dict['XC_DATE']
        # d2 = dict['XK_DATE']
 all_id_list.append(id) #該url是一個ajax的post請求
    post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
    for id in all_id_list: post_data = { 'id':id } response = requests.post(url=post_url,data=post_data,headers=headers) #該請求響應回來的數據有兩個,一個是基於text,一個是基於json的,因此能夠根據content-type,來獲取指定的響應數據
        if response.headers['Content-Type'] == 'application/json;charset=UTF-8': #print(response.json())
            #進行json解析
            json_text = response.json() print(json_text['businessPerson'])

今日做業

  • 爬取網絡上的任意圖片數據
  • 爬取百度翻譯的翻譯結果數據值
  • 爬取百度貼吧指定頁碼下的數據值
相關文章
相關標籤/搜索