1. 併發與並行(**) 2. 多線程致使數據的不安全(**) --> 理解不了, 那就記住結論(多線程共同操做數據會致使數據不安全) 3. 多線程爬蟲架構(*****) 4. 多線程爬蟲的代碼(*****)
1.併發: 在同一時間段內, 全部任務同時運行. 2.並行: 在同一時刻, 全部任務同時執行
i = 0 i += 1 i -= 1 print(i) 多線程共同操做數據會致使數據不安全
1.url,發請求, 獲取響應 2.數據解析 3.數據持久化
from threading import Thread from threading import Lock from queue import Queue import requests import pymysql from lxml import etree # base_url = 'http://xiaohua.zol.com.cn/youmo/%s.html' # 爬蟲類 class Sqider(Thread): def __init__(self, sname, urlQueue, dataQueue): super().__init__() self.sname = sname self.urlQueue = urlQueue self.dataQueue = dataQueue self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36' } # 爬取數據 def run(self, ): base_url = 'http://xiaohua.zol.com.cn/youmo/%s.html' while 1: # block 表明阻塞,block爲True即爲阻塞。block爲False爲不阻塞 try: print('%s正在爬取數據' % self.name) page = self.urlQueue.get(block=False) res = requests.get(url=base_url % page, headers=self.headers) self.dataQueue.put(res.text) print('%s提交數據完畢--' % self.name) except: break # 解析類 class Parse(Thread): def __init__(self, pname, dataQueue, conn, cursor, lock): super().__init__()