前言
簡單來說網際網路是由乙個個站點和網路裝置組成的大網,我們通過瀏覽器訪問站點,站點把html、js、css**返回給瀏覽器,這些**經過瀏覽器解析、渲染,將豐富多彩的網頁呈現我們眼前;
一、爬蟲是什麼?
如果我們把網際網路比作一張大的蜘蛛網,資料便是存放於蜘蛛網的各個節點,而爬蟲就是乙隻小蜘蛛,
二、爬蟲的基本流程
使用者獲取網路資料的方式:
方式2:模擬瀏覽器傳送請求(獲取網頁**)->提取有用的資料->存放於資料庫或檔案中
爬蟲要做的就是方式2;
1、發起請求
使用http庫向目標站點發起請求,即傳送乙個request
request包含:請求頭、請求體等
request模組缺陷:不能執行js 和css **
2、獲取響應內容
如果伺服器能正常響應,則會得到乙個response
3、解析內容
解析html資料:正規表示式(re模組),第三方解析庫如beautifulsoup,pyquery等
解析json資料:json模組
解析二進位制資料:以wb的方式寫入檔案
4、儲存資料
資料庫(mysql,mongdb、redis)
檔案三、http協議 請求與響應
request:使用者將自己的資訊通過瀏覽器(socket client)傳送給伺服器(socket server)
ps:瀏覽器在接收response後,會解析其內容來顯示給使用者,而爬蟲程式在模擬瀏覽器傳送請求然後接收response後,是要提取其中的有用資料。
四、 request
1、請求方式:
常見的請求方式:get / post
2、請求的url
url編碼
會被編碼(看示例**)
網頁的載入過程是:
載入乙個網頁,通常都是先載入document文件,
3、請求頭
user-agent:請求頭中如果沒有user-agent客戶端配置,服務端可能將你當做乙個非法使用者host;
cookies:cookie用來儲存登入資訊
注意: 一般做爬蟲都會加上請求頭
請求頭需要注意的引數:
(2)user-agent:訪問的瀏覽器(要加上否則會被當成爬蟲程式)
(3)cookie:請求頭注意攜帶
4、請求體
請求體如果是get方式,請求體沒有內容 (get請求的請求體放在 url後面引數中,直接能看到)
如果是post方式,請求體是format data
ps:1、登入視窗,檔案上傳等,資訊都會被附加到請求體內
2、登入,輸入錯誤的使用者名稱密碼,然後提交,就可以看到post,正確登入後頁面通常會跳轉,無法捕捉到post
五、 響應response
1、響應狀態碼
200:代表成功
301:代表跳轉
404:檔案不存在
403:無許可權訪問
502:伺服器錯誤
2、respone header
響應頭需要注意的引數:
(1)set-cookie:bdsvrtm=0; path=/:可能有多個,是來告訴瀏覽器,把cookie儲存下來
(2)content-location:服務端響應頭中包含location返回瀏覽器之後,瀏覽器就會重新訪問另乙個頁面
3、preview就是網頁源**
json資料,如網頁html,二進位制資料等
六、總結
1、總結爬蟲流程:
爬取--->解析--->儲存
2、爬蟲所需工具:
請求庫:requests,selenium(可以驅動瀏覽器解析渲染css和js,但有效能劣勢(有用沒用的網頁都會載入);
解析庫:正則,beautifulsoup,pyquery
儲存庫:檔案,mysql,mongodb,redis
python實現約瑟夫 約瑟夫問題python實現
python語言之如何實現約瑟夫環問題 def josephus n,m if type n 60個人從1開始編號每人拿乙個號碼牌排成圈,從 1開始報數,第一次報數 totalnum 猴子總數 startnum 開始序號 intervalnum 間隔數def kingelect totalnum,s...
python實現迴圈佇列 迴圈佇列Python
我試圖在python中建立乙個迴圈佇列,以便在到達陣列中的最後乙個元素時指向頭部。我正在研究排隊方法,我遇到了一些問題。我正在嘗試使用乙個大小為4的陣列,並且能夠將值排隊到第4個點,但是當它執行elif語句時,我收到這個錯誤。typeerror 不支援 的運算元型別 node 和 int 有什麼想法...
socketserver實現併發(Python)
server類 處理鏈結 request類 處理通訊 基於tcp 服務端 import socketserver class myserver socketserver.baserequesthandler def handle self print self.request conn print ...