高效能 爬蟲原理

2022-05-30 20:36:10 字數 4348 閱讀 3283

socket :原理(本質上就是乙個socket服務端,乙個客戶端.  客戶端在連線服務端的時候只是封裝了http協議頭以及訪問的位址)

阻塞:

import

socket

#####################阻塞 請求

非阻塞:http用的就是這種 請求方式,請求只管發出去,而阻塞的方式還等請求連線成功再發訊息。

mport socket

ip_post=(('

43.226.160.17

',80))

s=socket.socket(socket.af_inet,socket.sock_stream)

print('

這是非阻塞')

s.setblocking(false)

#非阻塞 如果 這裡不加try 會報乙個阻塞異常

try: #

因為請求已經發過去了

io多路復用:用來檢測【多個】socket 物件是否有變化?

import

socket

import

select

socket_list=

for i in

[100個url]:

client=socket.socket(socket.af_inet,socket.sock_stream)

#建立socket物件

client.setblocking(false)#

設定非阻塞,這裡設定非阻塞會導致連線報錯。所以需要 try#連線

try:

client.connect((i,80)) #

連線的請求已經發出去

except

blockingioerror as e:

print

(e)#

將socket 物件新增到socket_list 列表裡。

while

true:#也稱為事件迴圈、事件驅動

r,w,e=select.select(socket_list,socket_list,,0.05)

#w 檢測連線是否成功。

#r 是接收資料 recv

for obj in

r: response=obj.recv(1024)

print

(response)

非同步非阻塞模組原理socket客戶端:twisted,tornado 內部實現就是這樣

import

select

import

socket

class

request(object):

def__init__

(self,sock,info):

self.sock=sock

self.info=info

deffileno(self):

"""封裝socket物件有fileno方法

:return:

"""return

self.sock.fileno()

class

custom(object):

def__init__

(self):

self.sock_list=

self.conns=

defadd_reqeust(self,req_info):

"""建立傳送請求

req_info:,

:return:

"""sock=socket.socket()

sock.setblocking(false)

try:

sock.connect((req_info[

'host

'],req_info['

port

']))

except

blockingioerror as e:

pass

obj=request(sock,req_info)

print(obj.sock.fileno(),'

------')

defrun(self):

"""開始事件迴圈,檢測連線成功與否,資料是否返回 ?

:return:

"""while 1:

#在select的r 列表中,值必須是socket物件,物件一定要有fileno方法 ,select內部就是獲取fileno方法的值,所以建立了乙個 request類,

#並socket物件已經變成request物件

r,w,e=select.select(self.sock_list,self.conns,,0.05)#

e表示error,0

#w 是否連線成功

for obj in

w:

#這裡可能是cnblogs ,可能是baidu 的字典,所以 這裡需要檢查obj是哪個字典 #所以用了request類 info 就是req_info

#因為self.conns 檢測成功的就傳送資料,防止第二次進來再傳送資料

#資料返回,接收資料

for obj in

r: response=obj.sock.recv(8192)

print(obj.info['

host'])

#如果這個連線成功,這個連線就移除掉。http協議的一次連線一次斷開

self.sock_list.remove(obj)

obj.info[

'callback

'](response)

#所有的請求已經完成

ifnot

self.sock_list:

break

defdone(response):

print

(response)

url_list=[,,

,,,,

,,,,

,,

]custom=custom()

for item in

url_list:

custom.add_reqeust(item)

custom.run()

高效能非同步爬蟲

目的 在爬蟲中使用非同步實現高效能的資料爬取操作。非同步爬蟲的方式 多執行緒 多程序 不建議 弊端 無法無限制的開啟多執行緒或者多程序 執行緒池 程序池 適當的使用 好處 可以降低系統對程序或者執行緒建立和銷毀的乙個頻率,從而很好的降低系統的開銷 弊端 池中線程或程序的數量是有上限 from mul...

高效能非同步爬蟲概述

同步呼叫 即提交乙個任務後就在原地等待任務結束,等到拿到任務的結果後再繼續下一行 效率低下,呼叫乙個任務,就在原地等待任務結束拿到結果後才繼續往後執行。好處 在伺服器端使用多執行緒 或多程序 的目的是讓每個連線都擁有獨立的執行緒 或程序 這樣任何乙個連線的阻塞都不會影響其他的連線。缺點 在遇到要同時...

Kafka高效能讀寫原理

kafka是高吞吐低延遲的高併發 高效能的訊息中介軟體,在大資料領域有極為廣泛的運用。配置良好的kafka集群甚至可以做到每秒幾十萬 上百萬的超高併發寫入。那麼kafka到底是如何做到這麼高的吞吐量和效能的呢?首先kafka每次接收到資料都會往磁碟上去寫,如下圖所示。那麼在這裡我們不禁有乙個疑問了,...