爬虫 404 try_Python爬虫MOOC笔记
最近在學(xué)習(xí)Python爬蟲內(nèi)容,其實(shí)很多知識在網(wǎng)上搜索一下都能查到,但是作為自己的一種學(xué)習(xí)記錄,也是回顧與復(fù)習(xí)呀。
這種東西真的變化超級快,以前可以直接爬取的內(nèi)容,現(xiàn)在很多網(wǎng)站都增加了反爬機(jī)制,報(bào)錯家常便飯TAT,常常覺得自己是bug生產(chǎn)機(jī),不過畢竟前人栽樹后人乘涼,大多數(shù)問題都可以通過檢索得到解決,能成功解決問題也是成就感的來源之一呢~
總結(jié)來說爬蟲是從網(wǎng)絡(luò)獲取信息、解析信息并最終輸出為需要格式的過程。
說起來也挺有意思的,用公眾號順帶掌握了一波公共號排版和插入代碼的小技巧哈哈。好啦,那我們一起開始叭!
以下內(nèi)容主要來源于中國大學(xué)MOOC--Python網(wǎng)絡(luò)爬蟲與信息提取--北京理工大學(xué)。僅供個人學(xué)習(xí)使用。(代碼部分可右滑閱讀全部內(nèi)容)
需要有Python基礎(chǔ)知識才能看懂哦~不然就跟第一次接觸的我一樣,全程聽天書QAQ
思維導(dǎo)圖
第一周 網(wǎng)絡(luò)爬蟲規(guī)則
1.1Request庫入門
Request庫的安裝
需要安裝request庫,判斷安裝情況:code返回200說明成功
?import?requestsr?=?requests.get("https://www.baidu.com")
print(r.status_code)
r.encoding?=?'utf-8'
print(r.text)
request庫7個主要方法
| 方法 | 說明 |
| requests.request() | 構(gòu)造一個請求,支撐以下個方法的基礎(chǔ)方法 |
| requests.get() | 獲取HTML網(wǎng)頁的主要方法,對應(yīng)于HTTP的GET |
| requests.head() | 獲取HTML網(wǎng)頁頭信息的方法,對應(yīng)于HTTP的HEAD |
| requests.post() | 向HTML網(wǎng)頁提交POST請求的方法,對應(yīng)于HTTP的POST |
| requests.put() | 向HTML網(wǎng)頁提交PUT請求的方法,對應(yīng)于HTTP的PUT |
| requests.patch() | 向HTML網(wǎng)頁提交局部修改請求,對應(yīng)于HTTP的PATCH |
| requests.delete() | 向HTML網(wǎng)頁提交局部刪除請求,對應(yīng)于HTTP的PDELETE |
Request庫的get()方法
r = request.get(url) 通過get(url)構(gòu)造一個向服務(wù)器請求資源的Request對象?request.get是返回一個包含服務(wù)器資源的Response對象
完整形式
?r = request.get(url,params=None,**kwargs)?
url:擬獲取頁面的url鏈接?
(個人理解url是網(wǎng)頁訪問地址https://developer.mozilla.org/zh-CN/docs/Learn/Common_questions/What_is_a_URL)
params:url中的額外參數(shù),字典或字節(jié)流格式,可選
**kwargs:12個控制訪問的參數(shù)
response對象的屬性| 屬性 | 說明 |
| r.status_code | HTTP請求的返回狀態(tài),200表示連接成功,404失敗 |
| r.text | HTTP相應(yīng)內(nèi)容的字符串形式,即url對應(yīng)的頁面內(nèi)容 |
| r.encoding | 從HTTP header中猜測的響應(yīng)內(nèi)容編碼方式 |
| r.apparent_encoding | 從內(nèi)容中分析的響應(yīng)內(nèi)容編碼方式(備選編碼方式) |
| r.content | HTTP響應(yīng)內(nèi)容的二進(jìn)制方式 |
r.status_code(200)→r.encoding/r.apparent_encoding/r.content
r.encoding: 若header中不存在charset,則認(rèn)為編碼為ISO-8859-1
個人理解,encoding是從head中charset部分提取得到的編碼方式,而apparent_encoding是根據(jù)整體內(nèi)容分析得到的編碼方式,因此更為準(zhǔn)確,但同時速度可能慢一些
爬取網(wǎng)頁的通用代碼框架
request庫異常| 異常 | 說明 |
| requests.ConnectionError | 網(wǎng)絡(luò)連接錯誤異常,如DNS查詢失敗、拒絕連接等(僅限連接時的異常) |
| requests.HTTPError | HTTP錯誤異常 |
| requests.URLRequired | URL缺失異常 |
| requests.TooManyRedirects | 超過最大重定向次數(shù),產(chǎn)生重定向異常 |
| requests.ConnectTimeout | 連接遠(yuǎn)程服務(wù)器超時異常 |
| requests.Timeout | 請求URL超時,產(chǎn)生超時異常(整個過程) |
?r.raise_for_status()?判斷返回的類型是否是200,是的話說明返回內(nèi)容正常,否則產(chǎn)生異常requests.HTTPError
通用代碼框架:
import?requestsdef?getHTMLTEXT(url):
????try:
????????r?=?requests.get(url,timeout=30)
????????r.raise_for_status()
????????r.encoding?=?r.apparent_encoding
????????return?r.text
????except:
????????return?"產(chǎn)生異常"
url?=?"https://www.baidu.com"
print(getHTMLTEXT(url))
使得爬取網(wǎng)頁更加穩(wěn)定、有效、可靠
HTTP協(xié)議及Request庫方法
HTTP,Hypertext Transfer Protocol,超文本傳輸協(xié)議。
HTTP是一個基于“請求與響應(yīng)”模式的、無狀態(tài)的應(yīng)用層協(xié)議。用戶發(fā)起請求,服務(wù)器做出響應(yīng)。無狀態(tài)指不同次數(shù)之間的訪問沒有相互關(guān)聯(lián)。HTTP協(xié)議采用URL作為定位網(wǎng)絡(luò)資源的標(biāo)識。
URL格式:http://host[:port][path]
host:合法的Internet主機(jī)域名或IP地址
port:端口號,默認(rèn)端口為80
path:內(nèi)部路徑
url是通過HTTP協(xié)議存取資源的一個路徑(類似電腦中對應(yīng)的文件夾路徑,但此路徑再Internet上),每一個url對應(yīng)一個數(shù)據(jù)資源
(URL定義參考? ? ? ? ? ? ? ? ? ??https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_a_URL)
| 方法 | 說明 |
| GET | 請求獲取URL位置的資源 |
| HEAD | 請求獲取URL位置資源的頭部信息 |
| POST | 請求向URL位置的資源后附加新的數(shù)據(jù) |
| PUT | 請求向URL位置存儲一個資源,覆蓋原URL位置的資源 |
| PATCH | 請求局部更新URL位置的資源,即改變該處資源的部分內(nèi)容 |
| DELETE | 請求刪除URL位置存儲的資源 |
云端上的所有資源通過URL進(jìn)行標(biāo)識,通過GET\HEAD獲得資源,通過PUT\POST\PATCH\DELETE對云端資源進(jìn)行修改(每一次操作獨(dú)立無狀態(tài)的)
PATCH\PUT區(qū)別:?用PATCH只需要改變一個地方的內(nèi)容,PUT要將改變的內(nèi)容及其他未改變內(nèi)容一并提交。PATCH優(yōu)點(diǎn)是節(jié)省網(wǎng)絡(luò)帶寬。HTTP協(xié)議與request庫方法是一致的。
POST方法 提交列表,會默認(rèn)進(jìn)入form中;提交字符串,默認(rèn)編碼為data PUT類似
request庫主要方法解析
向URL POST一個字典,自動編碼為表單(form),POST一個字符串,自動編碼為data
requests.request(method,url,**kwargs)
method:請求方式,對應(yīng)get等7種
url:擬獲取頁面的URL鏈接
**kwargs:控制訪問的參數(shù),共13個
可選參數(shù):params:字典或字節(jié)序列,作為參數(shù)增加到url中 相當(dāng)于篩選資源
data:字典、字節(jié)序列或文件對象,作為request的內(nèi)容 理解是把內(nèi)容存儲到對應(yīng)的url中
json:JSON格式的數(shù)據(jù),作為內(nèi)容部分可以向服務(wù)器提交
headers:字典,HTTP定制頭 訪問時的頭字段 可以模擬瀏覽器向服務(wù)器中發(fā)起訪問
cookies:字典或CookieJar,request中的cookie
auth:元組,支持HTTP認(rèn)證功能
files:字典類型,傳輸文件 向鏈接提交文件
timeout:設(shè)定超時時間,以秒為單位
proxies:字典類型,設(shè)定訪問相關(guān)的代理服務(wù)器,可以增加登錄認(rèn)證 例如訪問百度時可以采用代理服務(wù)器的地址,隱藏源地址(感覺有點(diǎn)像VPN的道理)
allow_redirects:True/False,默認(rèn)為T,重定向開關(guān) 是否允許重定向
stream:True/False,默認(rèn)為T,獲取內(nèi)容立即下載開關(guān)
verify:True/False,默認(rèn)為T,認(rèn)證SSL證書開關(guān)
cert:保存本地SSL證書路徑的字段(不詳細(xì)介紹)
小結(jié):對網(wǎng)絡(luò)爬取,主要關(guān)注get和head即可。
課后練習(xí)1:成功爬取網(wǎng)頁100次并測試時間
import?requests?as?rqimport?time
def?gethtml(url):
????try:
????????r?=?rq.get(url)
????????r.raise_for_status()
????????r.encoding?=?r.apparent_encoding
????????return?r
????except:
????????return?'爬取失敗'
if?__name__?==?'__main__':?#?如果模塊是被直接運(yùn)行的,則代碼塊被運(yùn)行,如果模塊是被導(dǎo)入的,則代碼塊不被運(yùn)行。
????start?=?time.perf_counter()
????url?=?'http://baidu.com'
????for?i?in?range(100):
????????gethtml(url)
????????end?=?time.perf_counter()
????print('一百次爬取時間為{:.2f}秒'.format(end-start))?#保留兩位小數(shù)
time.perf_counter() # 調(diào)用一次 perf_counter(),從計(jì)算機(jī)系統(tǒng)里隨機(jī)選一個時間點(diǎn)A,
計(jì)算其距離當(dāng)前時間點(diǎn)B1有多少秒。當(dāng)?shù)诙握{(diào)用該函數(shù)時,默認(rèn)從第一次調(diào)用的時間點(diǎn)A算起,
課后練習(xí)2:獲得GitHub的小圖標(biāo)
import?requests?as?rqr=?rq.get("https://github.com/favicon.ico")
with?open('favicon.ico','wb')?as?f:?#favicon.ico,文件名稱?wb?讀寫方式
????f.write(r.content)
wb以二進(jìn)制格式打開一個文件只用于寫入。open函數(shù)介紹https://www.runoob.com/python/python-func-open.html
用Session可以模擬同一個對話而維持cookies,常用于模擬登陸成功后的下一步操作。對顯示證書錯誤的頁面,可以通過設(shè)置verify參數(shù)為false,并用disable_warnings等方法屏蔽證書錯誤警告。可用proxies參數(shù)設(shè)置代理。
參考資料
作業(yè)代碼參考https://developer.aliyun.com/article/637534
對time.perf_counter()理解https://www.runoob.com/note/35499
對if __name__ == '__main__'理解https://blog.konghy.cn/2017/04/24/python-entry-program/?spm=a2c6h.12873639.0.0.7928184dD8jlCj
對format函數(shù)的理解https://www.runoob.com/python/att-string-format.html
排版 135編輯器
代碼在線編輯網(wǎng)站:http://md.aclickall.com/
總結(jié)
以上是生活随笔為你收集整理的爬虫 404 try_Python爬虫MOOC笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php7 str split,PHP7.
- 下一篇: python读取usb扫码枪数据_vue