python3 提高爬虫采集速度 方案一:多线程 + 队列

‘’’

  1. 创建 URL队列, 响应队列, 数据队列 在init方法中
  2. 在生成URL列表中方法中,把URL添加URL队列中
  3. 在请求页面的方法中,从URL队列中取出URL执行,把获取到的响应数据添加响应队列中
  4. 在处理数据的方法中,从响应队列中取出页面内容进行解析, 把解析结果存储数据队列中
  5. 在保存数据的方法中, 从数据队列中取出数据,进行保存
  6. 开启几个线程来执行上面的方法
    ‘’’

def run_forever(func):
def wrapper(obj):
while True:
func(obj)
return wrapper

class JiubaiSpider(object):
def init(self):
self.headers = {
‘User-Agent’: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36’
}
self.url_pattern = ‘https://www.baike.com/8hr/page/{}/’
# url 队列
self.url_queue = Queue()
# 响应队列
self.page_queue = Queue()
# 数据队列
self.data_queue = Queue()

def add_url_to_queue(self):
   pass

@run_forever
def add_page_to_queue(self):
    pass

@run_forever
def add_dz_to_queue(self):
    pass

def get_first_element(self, list):
   pass

@run_forever
def save_dz_list(self):
  pass

def run_use_more_task(self, func, count=1):
    '''把func放到线程中执行, count:开启多少线程执行'''
    for i in range(0, count):
        t = threading.Thread(target=func)
        t.setDaemon(True)
        t.start()

def run(self):
    # 开启线程执行上面的几个方法
    url_t = threading.Thread(target=self.add_url_to_queue)
    # url_t.setDaemon(True)
    url_t.start()

    self.run_use_more_task(self.add_page_to_queue, 3)
    self.run_use_more_task(self.add_dz_to_queue, 2)
    self.run_use_more_task(self.save_dz_list, 2)

    # 使用队列join方法,等待队列任务都完成了才结束
    self.url_queue.join()
    self.page_queue.join()
    self.data_queue.join()

if name == ‘main’:
qbs = JiubaiSpider()
qbs.run()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫中,多线程队列是非常常见的技术应用。下面是它们在爬虫中的应用示例: 1. 多线程使用多线可以提高爬取数据的效率,同时可以并发处理多个请求。例如,可以将爬虫程序分为多个线程,每个线程负责处理一个请求,这样可以同时发送多个请求并同时处理响应。 2. 队列使用队列可以实现任务的调度和管理。例如,可以将待爬取的URL放入队列中,然后创建多个爬虫线程从队列中获取URL,并进行相应的爬取操作。这样可以有效地控制任务的执行顺序,避免资源竞争和重复爬取。 综合应用示例: ```python import threading import queue import requests # 创建队列 url_queue = queue.Queue() # 定义爬虫函数 def crawler(): while not url_queue.empty(): url = url_queue.get() # 发送请求并处理响应 response = requests.get(url) # 其他处理操作... # 添加待爬取的URL到队列 url_queue.put('http://example.com/page1') url_queue.put('http://example.com/page2') url_queue.put('http://example.com/page3') # 创建多个爬虫线程 num_threads = 3 threads = [] for _ in range(num_threads): t = threading.Thread(target=crawler) threads.append(t) # 启动线程 for t in threads: t.start() # 等待所有线程执行完毕 for t in threads: t.join() # 所有任务完成 print("All tasks finished.") ``` 这个示例展示了如何使用多线程队列来进行爬虫任务的并发处理和调度。通过将待爬取的URL放入队列中,然后创建多个爬虫线程从队列中获取URL并进行相应的爬取操作,可以实现高效的爬取任务处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值