在學習使用scrapy爬蟲框架之前,需要了解一些基礎原理
我們知道http請求是基於socket模組進行傳送和接受的,但是socket套接字的在使用的中存在著阻塞,不利用爬蟲的高效能執行,所以我們就需要對框架進行一些高效能設定,使用select模組,檢測socket請求的io操作,實現對socket的高效能執行:
以下是**示例:
importsocket
import
select
class
request(object):
'''request類的定義是應對請求的連線不同時,做的低耦合操作
'''def
__int__
(self,sock,info):
self.sock=sock
self.info=info
deffileno(self):
'''因為select模組在檢測io操作但是針對socket物件,該物件中必須有fileno方法才能呼叫,
因此需要我們自己定義乙個request類,在類下包含fileno方法
:return:
'''return
self.sock.fileno()
class
mysocket(object):
def__int__
(self):
'''初始化兩個列表,儲存socket物件
:return:
'''self.sock_list=
self.conns=
defadd_request(self,req_info):
'''建立請求
:param req_info:
:return:
'''sock=socket.socket()
sock.setblocking(false)
#設定socket為非阻塞狀態
try:
sock.connect((req_info[
'host
'],req_info['
post
']))
except
baseexception as e:
pass
#使用try方法防止sock在非阻塞狀態下報錯
obj=request(sock,req_info)#
示例話request類,此類就是socket例項化的物件
defrun(self):
'''開始事件迴圈,檢測:連線是否成功,是否有資料返回
:return:
'''while
true:
r,w,e=select.select(self.sock_list,self.conns,,0.05)
#select。select([socket物件,]),可以是任何物件,但是物件一定要有
#fileno方法,所以需要自己去定義request類
#在此處就呼叫request物件
#seclet引數w數值就是檢測請求是否成功
for obj in
w:
#檢查obj.request物件
#該連線在成功請求過後,為防止重**送請求,需請求列表中將其刪除
#資料返回,接受到資料
for obj in
r: response=obj.sock.recv(8096)
obj.info[
"callback
"](response)
self.sock_list.remove(obj)
from .. import
mysocket
defdata(response):
'''**函式,對返回的資料進行操作
:param response:
:return:
(response)
deffile(response):
'''**函式,對返回數值的第二種操作方式
:param response:
:return:
(response)
url_list =[,,
,]obj=mysocket()
for item in
url_list:
obj.add_request(item)
obj.run()
Socket(二) 同步 非同步 阻塞 非阻塞
阻塞 客戶端去server端請求10個位元組資料。tcp傳輸分兩步,乙個是head,乙個是body。server端給客戶端傳送head的目的是告訴客戶端,這次tcp會傳10個位元組。然後,body開始傳給客戶端。如果網路很慢,傳到第6個位元組了,那麼,客戶端知道還沒有收完,就會在第6個位元組這裡一直...
socket 阻塞與非阻塞 同步與非同步
阻塞與非阻塞。所謂阻塞方式的意思是指,當試圖對該檔案描述符進行讀寫時,如果當時沒有東西可讀,或者暫時不可寫,程式就進入等待狀態,直到有東西可讀或者可寫為止。而對於非阻塞狀態,如果沒有東西可讀,或者不可寫,讀寫函式馬上返回,而不會等待。預設情況下,三述符處於阻塞狀態。同步非同步與阻塞和非阻塞是兩種不同...
Socket 同步非同步 和 阻塞非阻塞的區別
老張愛喝茶,廢話不說,煮開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 1 老張把水壺放到火上,立等水開。同步阻塞 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻塞 老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺...