python的實現原理 python爬蟲實現原理

2021-10-12 13:14:29 字數 1904 閱讀 1105

前言

簡單來說網際網路是由乙個個站點和網路裝置組成的大網,我們通過瀏覽器訪問站點,站點把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 ...