#多线程爬虫一般思维就是,开启两个线程,一个爬,一个取。
#实现步骤
#1,把自己思路的裤架给配置出来,两个线类,一个主方法。
#思考,改把数据存到什么结构里。。。。。队列。
import re
import threading
import queue
from urllib import request
import time
#爬取线程
class Thread1(threading.Thread):
def init(self,threadName,pagequen,dataquen):
threading.Thread.init(self)
self.threadName=threadName
self.pagequen=pagequen
self.dataquen=dataquen
self.headers={
“User-Agent”: “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36”
}#配置一些爬虫需要的条件
def run(self):
while not flag:
try:
page = self.pagequen.get()#从页码中拿出一个值
url=“你的url”+page#这块是你要构造的url,明白?
res=request.Request(url,headers=self.headers)
html=request.urlopen(res).read().decode()#拿到网页的源码,爬取包有好几种,记住,就是要拿到网页源码
#这是爬取的基本,
time.sleep(0.1)#休息一会,等拿到在放到队列。
self.dataquen.put(html)
#把数据放到数据队列,就算完成任务。
except Exception as e:
pass
pass
#清洗线程
class Thread2(threading.Thread):
def init(self,threadName,dataquen,filename):#清洗使用到的数据
threading.Thread.init(self)
self.threadName=threadName
self.dataquen = dataquen
self.filename = filename
def run(self):
while not flag2:
try:
data=self.dataquen.get();
result=re.compile(“匹配条件”).findall(data)#清洗的办法有很多种我就用正则模拟一下
self.filename.write(result)#写文件,目的达到,去主函数写完流程
except Exception as e:
pass
#主方法
flag=False#配置两个判断中间值
flag2=False
def mian():
pagequeue=queue.Queue(10)#创建页码队列,10是加入10个数据
for i in range(1,11):
pagequeue.put(i)#把1到10 个数加入到队列
dataquen=queue.Queue()#创建数据空列里。
#下面是你的业务逻辑代码,自己思考着写
filename=open(“text.txt”,“a”)#我演示的是我想把数据追加写到TXT文件里。没有具体作用只是演示
#开始启动线程和使用上面的两个类,先启动爬的线程。
t1=Thread1(“采”,pagequeue,dataquen)
t1.start()
t2=Thread1(“洗”,pagequeue,dataquen)
t2.start()
#各自工作
while not pagequeue.empty():#没有还有页码就停这里,while,有时做为阻塞作用
pass
#到这里时就证明pagequeue为空
global flag#全局变量
global flag2
flag=True#结合上面的判断条件,理解,停了爬虫线程
while not dataquen.empty():#同例
pass
flag2=True
t1.join()
t2.join()
print(“结束爬虫”)
#入口
if name==“main”:
mian()
#样速度确实快很多,可以按照这框架原来,开多点线程,提高你爬虫的速度