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__()