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&tpl=mn&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>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必讀</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意見反饋</a> 京ICP證030173號 <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,包括UserID、 UserName等20個字段
需求:用戶修改了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網絡爬蟲與信息提取
