1. 程式人生 > >[學習筆記]Python網絡爬蟲與信息提取

[學習筆記]Python網絡爬蟲與信息提取

聲音 pil 錯誤 來源 匹配中文 api with text log

來源:MOOC
講師:北理工 嵩天

學習目的:
掌握定向網絡數據爬取和網頁解析的基本能力
the Website is the API...

1.python ide

文本ide:IDLE,Sublime Text
集成ide:Pycharm,Anaconda&Spyder,Wing,Visual Studio & PTVS,Eclipse & PyDev,Canopy

默認源太慢:
阿裏雲 http://mirrors.aliyun.com/pypi/simple/
中國科技大學 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) https://pypi.douban.com/simple/
清華大學 https://pypi.tuna.tsinghua.edu.cn/simple/
中國科學技術大學 https://pypi.mirrors.ustc.edu.cn/simple/

2.網絡爬蟲規則

2.1 Requests庫 自動爬取html頁面

#安裝方法 管理員權限啟動cmd安裝
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

#測試下
技術分享圖片

#requests庫7個主要方法:
a、requests.request() 構造一個請求,支撐以下各方法的基礎方法
b、requests.get() 獲取HTML網頁的主要方法,對應於HTTP的GET
c、requests.head() 獲取HTML網頁頭信息的方法,對應於HTTP的HEAD
d、requests.post() 向HTML網頁提交POST請求的方法,對應於HTTP的POST
e、requests.put() 向HTML網頁提交PUT請求的方法,對應於HTTP的PUT
f、requests.patch() 向HTML網頁提交局部修改請求,對應於HTTP的PATCH
g、requests.delete() 向HTML頁面提交刪除請求,對應於HTTP的DELETE

r = requests.get(url)
r是返回一個包含服務器資源的Response對象,右邊是構造一個向服務器請求資源的Request對象

requests.get(url,params=None,**kwargs) 完整格式
params:url中的額外參數,字典或者字節流格式可選
**kwargs:12個控制訪問參數可選
打開源碼可知,get方法是調用requests方法封裝的,實際上7個方法中,其余6個都是由request方法封裝

Response對象常用5個屬性
r.status_code HTTP請求的返回狀態,200表示連接成功,404表示失敗
r.text HTTP響應內容的字符串形式,即,url對應的頁面內容
r.encoding 從HTTP header中猜測的響應內容編碼方式,如果header中不存在charset,則認為編碼為ISO-8859-1
r.apparent_encoding 從內容中分析出的響應內容編碼方式(備選編碼方式)
r.content HTTP響應內容的二進制形式

requests庫異常
requests.ConnectionError 網絡連接錯誤異常,如DNS查詢失敗、拒絕連接等
requests.HTTPError HTTP錯誤異常
requests.URLRequired URL缺失異常
requests.TooManyRedirects 超過最大重定向次數,產生重定向異常
requests.ConnectTimeout 連接遠程服務器超時異常
requests.Timeout 請求URL超時,產生超時異常

爬取網頁的通用代碼框架
import requests
def getHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "產生異常"
if __name__ == "__main__":
url = "http://www.baidu.com"
print(getHTMLText(url))

http協議對資源的6中操作:
GET 請求獲取URL位置的資源
HEAD 請求獲取URL位置資源的響應消息報告,即獲得該資源的頭部信息
POST 請求向URL位置的資源後附加新的數據
PUT 請求向URL位置存儲一個資源,覆蓋原URL位置的資源
PATCH 請求局部更新URL位置的資源,即改變該處資源的部分內容
DELETE 請求刪除URL位置存儲的資源

通過URL和命令管理資源,操作獨立無狀態,網絡通道及服務器成為了黑盒子

理解PATCH和PUT的區別:
假設URL位置有一組數據UserInfo,包括UserID、UserName等20個字段
需求:用戶修改了UserName,其他不變
. 采用PATCH,僅向URL提交UserName的局部更新請求
. 采用PUT,必須將所有20個字段一並提交到URL,未提交字段被刪除
PATCH的最主要好處:節省網絡帶寬

http協議與requests庫功能是一致的

requests.request()
requests.request(method, url, **kwargs)
method : 請求方式,對應get/put/post等7種
? url : 擬獲取頁面的url鏈接
? **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)

**kwargs: 控制訪問的參數,均為可選項
params : 字典或字節序列,作為參數增加到url中
data : 字典、字節序列或文件對象,作為Request的內容
json : JSON格式的數據,作為Request的內容
headers : 字典,HTTP定制頭
cookies : 字典或CookieJar,Request中的cookie
auth : 元組,支持HTTP認證功能
files : 字典類型,傳輸文件
timeout : 設定超時時間,秒為單位
proxies : 字典類型,設定訪問代理服務器,可以增加登錄認證
allow_redirects : True/False,默認為True,重定向開關
stream : True/False,默認為True,獲取內容立即下載開關
verify : True/False,默認為True,認證SSL證書開關
cert : 本地SSL證書路徑

2.2 robots.txt 網絡爬蟲排除標準

小規模,數據量小,爬取速度不敏感,Requests庫 , 90%以上 , 爬取網頁 玩轉網頁
中規模,數據規模較大,爬取速度敏感,Scrapy庫 ,爬取網站 爬取系列網站
大規模,搜索引擎爬取,速度關鍵 ,定制開發,爬取全網

限制網絡爬蟲:1.來源審查 2.robots協議

2.3 實戰項目

a.爬取京東某網頁

技術分享圖片

b、爬取亞馬遜某網頁 有來源審查防爬蟲

技術分享圖片

c.爬取百度搜索關鍵詞

技術分享圖片

d.網絡圖片的爬取和存儲

技術分享圖片

import requests
import os
url = "http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg"
root = "D://pics//"
path = root + url.split(‘/‘)[-1]
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r = requests.get(url)
with open(path,‘wb‘) as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("爬取失敗")

3.網絡爬蟲規則之提取

3.1 Beautiful Soup庫入門

#安裝

pip install beautifulsoup4

技術分享圖片

#測試下

技術分享圖片

html文檔 等價於 標簽樹 等價於 BeautifulSoup類

技術分享圖片

Beautiful Soup庫,也叫beautifulsoup4 或bs4
約定引用方式如下,即主要是用BeautifulSoup類
import bs4 from
import bs4 from BeautifulSoup

4種解析器:
soup = BeautifulSoup(‘<html>data</html>‘,‘html.parser‘)
bs4的HTML解析器 BeautifulSoup(mk,‘html.parser‘) 安裝bs4庫
lxml的HTML解析器 BeautifulSoup(mk,‘lxml‘) pip install lxml
lxml的XML解析器 BeautifulSoup(mk,‘xml‘) pip install lxml
html5lib的解析器 BeautifulSoup(mk,‘html5lib‘) pip install html5lib

BeautifulSoup類5種基本元素:
Tag 標簽,最基本的信息組織單元,分別用<>和</>標明開頭和結尾
Name 標簽的名字,<p>…</p>的名字是‘p‘,格式:<tag>.name
Attributes 標簽的屬性,字典形式組織,格式:<tag>.attrs
NavigableString 標簽內非屬性字符串,<>…</>中字符串,格式:<tag>.string
Comment 標簽內字符串的註釋部分,一種特殊的Comment類型

Tag 標簽:
任何存在於HTML語法中的標簽都可以用soup.<tag>訪問獲得
當HTML文檔中存在多個相同<tag>對應內容時,soup.<tag>返回第一個

技術分享圖片

Tag的name(名字):每個<tag>都有自己的名字,通過<tag>.name獲取,字符串類型

技術分享圖片
Tag的attrs(屬性):一個<tag>可以有0或多個屬性,字典類型

技術分享圖片
Tag的NavigableString:NavigableString可以跨越多個層次
技術分享圖片

Tag的Comment:Comment是一種特殊類型

技術分享圖片

html或者xml都是樹形結構

三種遍歷方式:下行遍歷、下行遍歷、平行遍歷

BeautifulSoup類型是標簽樹的根節點
下行遍歷:
.contents 子節點的列表,將<tag>所有兒子節點存入列表
.children 子節點的叠代類型,與.contents類似,用於循環遍歷兒子節點
.descendants 子孫節點的叠代類型,包含所有子孫節點,用於循環遍歷
遍歷兒子節點
for child in soup.body.children:
print(child)
遍歷子孫節點
for child in soup.body.descendants:
print(child)

技術分享圖片