明確目的:將多執行緒爬蟲涉及到的技術點回顧一下
首先,是基本流程,多執行緒爬蟲架構圖如下
**用來存url,和 網頁的響應內容,給執行緒提供資料執行緒資料
class queue(object):
"""enqueue(item) 往佇列中新增乙個item元素
dequeue() 從佇列頭部刪除乙個元素
is_empty() 判斷乙個佇列是否為空
size() 返回佇列的大小
"""def __init__(self):
self.queue =
def put(self, item):
def get(self):
return self.queue.pop(0)
def isempty(self):
return self.queue ==
def size(self):
return len(self.queue)
當然,這是手寫的,(熟悉下方法的作用),這次我們直接從queue模組,匯入對列類
這次我們主要用put()和get()方法,其中給get(block=false)佇列將引發empty異常.
from queue import queue
urlqueue = queue()
dataqueue = queue()
lock = threading.lock()
url = ''
for i in range(1, 15):
urlqueue.put(url.format(i))
執行緒作業系統能夠進行運算排程的最小單位,程序中的實際運作單位
適用範圍
1.伺服器中的檔案管理或通訊控制
2.前後臺處理
3.非同步處理
爬取,解析
這裡我們要非同步爬取每個url對應的頁面,並解析爬取到的資料:非同步:訪問資源時在空閒等待時同時訪問其他資源
區別同步和非同步
乙個程序啟動的多個不相干執行緒,它們相互之間關係為非同步。
同步必須執行到底之後才能執行其他操作,而非同步可以任意操作
(任務a執行到乙個階段,需要 任務b的某個結果,a任務會停下來等待)
資料持久化,處理高併發
將資料寫到資料庫,由於執行緒共享全域性變數負責解析的執行緒會競爭同一資源,導致我們爬取的資料入庫時出現異常
因此我們可以加鎖實現執行緒的同步,
from threading import lock
lock = lock()
同步解決了執行緒的安全問題,但是會降低效率,
建立執行緒
def main()
headers =
# 佇列
urlqueue = queue()
dataqueue = queue()
lock = threading.lock()
url = ''
for i in range(1, 15):
urlqueue.put(url.format(i))
# 爬取執行緒
s_name_list = ['甲', '乙', '丙']
s_list =
for s_name in s_name_list:
s = spiderthread(s_name, headers, urlqueue, dataqueue)
s.start()
for s in s_list:
s.join()
# 解析執行緒
p_name_list = ['戊', '己', '庚']
p_list =
for p_name in p_name_list:
p = parsethread(p_name, dataqueue, lock, items)
p.start()
for p in p_list:
p.join()
使用多執行緒爬取資料
應用名稱 應用鏈結 import requests import time from multiprocessing import queue from threading import thread import json import urllib.parse class xiaomispide...
多執行緒爬取小公尺應用商店
目標 2 目標 所有應用分類 應用名稱 應用鏈結 實現步驟 1 頁面區域性重新整理 2 右鍵檢視網頁源 搜尋關鍵字未搜到 此 為動態載入 需要抓取網路資料報分析1 抓取返回json資料的url位址 headers中的request url 302 檢視並分析查詢引數 headers中的query s...
python 爬取GKGY會員多執行緒demo
coding utf 8 author wangjingyao importurllib importurllib2 importre importsys importthreading,queue,time importuser agents,random,time reload sys sys....