第一章 初識爬蟲html
1、爬蟲簡介c++
2、http與https協議算法
3、requests模塊json
1、爬蟲簡介瀏覽器
什麼是爬蟲(what):安全
經過編寫程序,模擬瀏覽器上網,而後讓其去互聯網上抓取數據的過程。服務器
哪些主流語言能夠實現爬蟲:多線程
(1)Php:對多線程和多進程支持的很差框架
(2)Java:代碼臃腫,重構成本較大ide
(3)C/c++:是一個很是不明智的選擇,是一個很好裝13的選擇
(4)Python:沒有!!!代碼優雅,學習成本低,具備很是多的模塊。具備框架的支持。
爬蟲分類:
(1)通用爬蟲:是搜索引擎中「抓取系統」的重要組成部分。(爬取的是整張頁面)
①門戶主動將本身的url提交給搜索引擎公司
②搜索引擎公司會和DNS服務商進行合做
③掛靠知名網站的友情連接
(2)聚焦爬蟲:根據指定的需求去網上爬去指定的內容。
robots.txt協議
指定的是門戶中哪些數據能夠供爬蟲程序進行爬取和非爬取。
反爬蟲與反反爬蟲:
反爬蟲:門戶網站能夠經過某些技術手段或者策略阻止爬蟲程序對其數據的爬取。
反反爬蟲:爬蟲程序經過某些技術手段或者策略破解門戶網站的反扒策略。
2、http協議與https協議(能夠參閱《圖解HTTP》加深理解)
1.HTTP協議
什麼是HTTP協議(what):
HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議。
工做原理:
四大特性:
URL組成:
request請求:
response響應:
2.HTTPS協議
什麼是HTTPS協議(what):
HTTPS (Secure Hypertext Transfer Protocol)安全超文本傳輸協議,HTTPS是在HTTP上創建SSL加密層,並對傳輸數據進行加密,是HTTP協議的安全版。
HTTPS採用的加密技術:
①SSL加密技術
SSL採用的加密技術叫作「共享密鑰加密」,也叫做「對稱密鑰加密」,這種加密方法是這樣的,好比客戶端向服務器發送一條信息,首先客戶端會採用已知的算法對信息進行加密,好比MD5或者Base64加密,接收端對加密的信息進行解密的時候須要用到密鑰,中間會傳遞密鑰,(加密和解密的密鑰是同一個),密鑰在傳輸中間是被加密的。這種方式看起來安全,可是仍有潛在的危險,一旦被竊聽,或者信息被挾持,就有可能破解密鑰,而破解其中的信息。所以「共享密鑰加密」這種方式存在安全隱患:
②非對稱祕鑰加密技術
「非對稱加密」使用的時候有兩把鎖,一把叫作「私有密鑰」,一把是「公開密鑰」,使用非對象加密的加密方式的時候,服務器首先告訴客戶端按照本身給定的公開密鑰進行加密處理,客戶端按照公開密鑰加密之後,服務器接受到信息再經過本身的私有密鑰進行解密,這樣作的好處就是解密的鑰匙根本就不會進行傳輸,所以也就避免了被挾持的風險。就算公開密鑰被竊聽者拿到了,它也很難進行解密,由於解密過程是對離散對數求值,這可不是垂手可得就能作到的事。如下是非對稱加密的原理圖:
可是非對稱祕鑰加密技術也存在以下缺點:
a)如何保證接收端向發送端發出公開祕鑰的時候,發送端確保收到的是預先要發送的,而不會被挾持。只要是發送密鑰,就有可能有被挾持的風險。
b)非對稱加密的方式效率比較低,它處理起來更爲複雜,通訊過程當中使用就有必定的效率問題而影響通訊速度。
https的證書機制
服務器的開發者攜帶公開密鑰,向數字證書認證機構提出公開密鑰的申請,數字證書認證機構在認清申請者的身份,審覈經過之後,會對開發者申請的公開密鑰作數字簽名,而後分配這個已簽名的公開密鑰,並將密鑰放在證書裏面,綁定在一塊兒。服務器將這份數字證書發送給客戶端,由於客戶端也承認證書機構,客戶端能夠經過數字證書中的數字簽名來驗證公鑰的真僞,來確保服務器傳過來的公開密鑰是真實的。通常狀況下,證書的數字簽名是很難被僞造的,這取決於認證機構的公信力。一旦確認信息無誤以後,客戶端就會經過公鑰對報文進行加密發送,服務器接收到之後用本身的私鑰進行解密。
3、requests模塊
簡單爬取數據四要素:
(1)指定url
(2)發請求
(3)數據解析
(4)持久化存儲
安裝模塊:
pip3 install requests
演示一個簡單的requests使用:
import requests # 指定url url = 'https://www.taobao.com' # 經過requests模塊發起請求:get請求返回響應對象 response = requests.get(url=url) # 獲取響應對象中json格式的數據 # response.json() # 獲取響應數據的編碼格式(可被修改) # response.encoding # 響應狀態碼 # response.status_code # 獲取響應頭信息 # response.headers # 獲取響應內容(爬取淘寶頁面數據) # content獲取的是二進制數據 # data = response.content # text獲取的是字符串類型的數據 # data = response.text print(response.headers)
需求:根據指定的url進行網頁數據的爬取,且進行持久化操做(一個最簡單的爬蟲演示)
# 根據指定的url進行網頁數據的爬取,且進行持久化操做 import requests # 指定url url = 'https://www.taobao.com' # 發起請求 response = requests.get(url) data = response.text # 進行文件操做 with open('./taobao.html','w',encoding='utf-8')as f : f.write(data) print('over')
知識儲備
抓包工具Fiddler 4的簡單配置
①點擊tools下的options
②禁用https抓取限制(勾選紅框部分)
③點擊yes安裝證書
④勾選下圖內容,點擊證書
⑤配置完成後須要重啓fiddler4
⑥簡單熟悉fiddler4
《》表明get請求
查看請求信息
重點關注如下幾個選項卡:
Headers:請求信息
Raw:經常使用的請求信息都在這裏
WebForms:請求攜帶的參數
requests模塊下的get請求
案例:百度搜索
import requests # requests的get請求 wd = input('enter a word:') # 模擬抓取系統,手動指定關鍵字進行百度搜索,保存搜索結果 # 百度較爲特殊,須要把https的s給去掉 get_url = 'http://www.baidu.com/s' # url的特性:url必須是有ASCII編碼的數據組成 # 能夠將請求攜帶的參數封裝到一個字典中 param = { 'ie': 'utf-8', 'wd': wd } # 參數2表示請求參數的封裝 response = requests.get(url=get_url, params=param) file_name = wd + '.html' # response.encoding = 'utf-8' with open(file_name,'w',encoding='utf-8') as f : f.write(response.text) print('over')
requests模塊下的post請求
案例:百度翻譯