【Python爬蟲】01:網絡爬蟲--規則


Python網絡爬蟲與信息提取

 

目標:掌握定向網絡數據爬取和網頁解析的基本能力。

the website is the API

課程分為以下部分:

1、requsets庫(自動爬取HTML頁面、自動網絡請求提交)

2、robots.txt規則(網絡爬蟲排除標准)(合理合法的使用爬蟲)

3、beautiful soup庫(解析HTML頁面)(提取相關項目)

4、projects項目(實戰項目A/B)

5、re正則表達式庫(正則表達式詳解、提取頁面關鍵信息)

6、專業網絡爬蟲框架scrapy*(網絡爬蟲原理介紹、專業爬蟲框架介紹)

 

IDE:集成開發環境,編寫、調試、發布Python程序的工具。

常用的Python IDE工具有2大類:

一、文本工具類IDE

二、集成工具類IDE

IDLE:自帶、默認、常用、入門級。包含交互式和文件式兩種方式。

         使用:Python入門、功能簡單直接、300+代碼以內

sublime text:專為程序員開發的第三方專用編程工具、專業編程體驗(專業程序員都用這個)、多種編程風格、工具非注冊免費試用。

 Wing:公司維護,工具收費;調試功能豐富;版本控制,版本同步;適合多人共同開發

Visual Studio & PTVS:微軟公司維護;win環境為主;調試功能豐富。

PyCharm:社區版免費;簡單,集成度高;適合較復雜工程。

 

專門針對科學計算、數據分析的IDE

Canopy:公司維護,工具收費;支持近500個第三方庫;適合科學計算領域應用開發。

Anaconda:開源免費;支持近800個第三方庫。

 

Requests庫入門

requests庫安裝:

1、打開“cmd”;2、輸入:pip install requests;3、安裝完成

requests庫測試:  在IDLE操作

>>> import requests
>>> r = requests.get("http://www.baidu.com")
>>> r.status_code   # 查看r的狀態碼
200                 # 狀態碼為200表示爬取成功,不是200則訪問失敗
>>> r.encoding = "utf-8"
>>> r.text   # 下面內容表示成功爬取百度首頁內容
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新聞</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地圖</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>視頻</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>貼吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登錄</a> </noscript> <script>document.write(\'<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=\'+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ \'" name="tj_login" class="lb">登錄</a>\');\r\n                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多產品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>關於百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必讀</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意見反饋</a>&nbsp;京ICP證030173號&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'

requests庫的7個主要方法

方法 說明
requests.request() 構造一個請求,是支撐一下各種方法的基礎方法
requests.get() 獲取HTML網頁的主要方法,對應於HTTP的GET
requsets.head() 獲取HTML網頁頭信息的方法,對應於HTTP的HEAD
requests.post() 向HTML網頁提交POST請求的方法,對應於HTTP的POST
requests.put() 向HTML網頁提交PUT請求的方法,對應於HTTP的PUT
requests.patch() 向HTML網頁提交局部修改請求,對應於HTTP的PATCH
requests.delete() 向HTML網頁提交刪除請求,對應於HTTP的DELETE

 

 

 

 

 

 

 

 

requests.get()方法介紹

 r = requests.get(url)   # 獲得一個網頁

Response對象返回所有網頁內容

1 requests.get(url, params=None, **kwargs)
2 
3 # url: 擬獲取頁面的url鏈接
4 # params:url中的額外參數,字典或字節流格式,可選
5 # **kwargs:12個控制訪問的參數

 

Response對象的屬性

屬性 說明
r.status_code HTTP請求的返回狀態,200表示鏈接成功,404表示失敗(只要不是200就是失敗)
r.text HTTP響應內容的字符串形式,即,url對應的頁面內容
r.encoding 從HTTP header中猜測的響應內容編碼方式
r.apparent_encoding 從內容中分析出的響應內容編碼方式(備選編碼方式)(更准確)推薦
r.content HTTP響應內容的二進制形式

 

 

 

 

 

r.encoding:根據HTTP中header中charset分析編碼方式,如果header中不存在charset,則認為編碼為ISO-8859-1

r.apparent_encoding:跟准確,根據HTTP內容分析可能的編碼方式,

 

requests.get()方法獲取網上資源的流程

1、用r.status_code方法檢查返回的Response對象的狀態。

 

 

爬取網頁的通用代碼框架

 網絡爬取有風險,異常處理很重要

理解requests庫的異常

異常 說明
requests.ConnectionError 網絡連接錯誤異常,如DNS查詢失敗、防火牆拒絕連接等
requests.HTTPError HTTP錯誤異常
requests.URLReuired URL缺失異常
requests.TooManyRedirects 超過最大重定向次數,產生重定向異常
requests.ConnectTimeout 連接遠程服務器超時異常(僅指與遠程服務器連接過程超時)
requests.Timeout 請求URL超時,產生超時異常(發出URL請求到收到內容整個過程超時)

 

 

 

 

 

 

 

異常 說明
r.raise_for_status() 如果是200,則表示正確;如果不是200,則產生異常requests.HTTPError

 

 

爬取網頁的通用代碼框架

 1 import requests
 2 
 3 def getHTMLText(url):
 4     try:
 5         r = requests.get(url, timeout=30)
 6         r.raise_for_status()  # 如果狀態不是200,引發HTTPError異常
 7         r.encoding = r.apparent_encoding
 8         return r.text
 9       except:
10         return "產生異常"
1 if __name__ == "__main__":
2     url = "http://www.baidu.com"
3     print(getHTTPText(url))

 

網絡爬蟲的盜亦有道--robots協議介紹

HTTP協議

HTTP,hypertext transfer protocol,超文本傳輸協議。

HTTP是一個基於“請求與響應”模式的、無狀態的應用層協議

  • 請求與響應模式:用戶發出請求,服務器做出響應。
  • 無狀態:第一次請求和第二次請求之間沒有相關關聯

HTTP協議采用URL作為定位網絡資源的標識

  • URL格式: http://host[:port][path] 

           host:合法的Internet主機域名或IP地址

           port:端口號,缺省端口為80(默認80)

           path:請求資源的路徑

  • HTTP URL的理解:URL是通過HTTP協議存取資源的Internet路徑,一個URL對應一個數據資源

 

HTTP協議對資源的操作

方法 說明
GET 請求獲取URL位置的資源
HEAD 請求獲取URL位置資源的響應信息報告,即獲得該資源的頭部信息
POST 請求向URL位置的資源后附加新的資源
PUT 請求向URL位置存儲一個資源,即覆蓋原URL位置的資源
PATCH 請求局部更新URL位置的資源,即改變該處資源的部分內容
DELETE 請求刪除URL位置存儲的資源

 

 

 

 

 

 

理解PATCH和PUT的區別

假設URL位置有一組數據UserInfo,包括UserIDUserName20個字段

需求:用戶修改了UserName,其他不變
采用PATCH,僅向URL提交UserName的局部更新請求
采用PUT,必須將所有20個字段一並提交到URL,未提交字段被刪除
PATCH
的最主要好處:節省網絡帶寬

 

HTTP協議與Requests庫

 

Requests庫的head()方法:可以通過很少的流量,獲得資源的概要信息

Requests庫的post()方法:向服務器提交新增數據

Requests庫的post()方法:與post方法類似,只是會將原有的數據覆蓋

 

 Requests庫主要方法解析:

 Requests庫的7個主要方法

1 requests.request(method,url,**kwargs)
2 method: 請求方式,對應get/put/post等7種
3 url: 擬獲取頁面的url連接
4 **kwargs: 控制訪問的參數,共13個

method : 請求方式
r = requests.request('GET', url, **kwargs)
r = requests.request('HEAD', url, **kwargs)
r = requests.request('POST', url, **kwargs)
r = requests.request('PUT', url, **kwargs)
r = requests.request('PATCH', url, **kwargs)
r = requests.request('delete', url, **kwargs)
r = requests.request('OPTIONS', url, **kwargs

 

requests.request(method, url, **kwargs)   **kwargs參數介紹

---**kwargs:控制訪問的參數,均為可選項

     1、params:字典或字節序列,作為參數增加到url中

1 >>> kv = {'key1':'value1','key2':'value2'}
2 >>> r = requests.request('GET','http://python123.io/ws',params=kv)
3 >>> print(r.url)
4 https://python123.io/ws?key1=value1&key2=value2

     2、data:字典、字節序列或文件對象,作為request的內容

1 >>> kv = {'key1':'value1','key2':'value2'}
2 >>> r = requests.request('POST','http://python123.io/ws',data=kv)
3 >>> body = '主題內容'
4 >>> r = requests.request('POST','http://pyhton123.io/ws',data=body)

     3、json:JSON格式的數據,作為request的內容

1 >>> kv ={'key1':'value1'}
2 >>> r = requests.request('POST','http://python123.io/ws',json=kv)

     4、headers:字典,HTTP定制頭(模擬任何瀏覽器,向瀏覽器發起訪問)

>>> hd = {'user-agent':'Chrome/10'}   # Chrome/10  Chrome瀏覽器第10個版本
>>> r = requests.request('POST','http://python123.io/ws',headers=hd)

 

 

 

 

 

Requests庫爬取實例

 

 

 

 

 

學習資料:中國大學MOOC-Python網絡爬蟲與信息提取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM