赞
踩
python用requests爬取的时候,可以用多线程提高速度。这里封装了一个文件,只需修改具体的业务url就可以直接拿去使用。
import requests import time import threading # 使用 threading 模块创建线程 import queue #优先级队列模块 #线程优先级队列(Queue) from config import * from retrying import retry exitFlag = 0 class MyThread (threading.Thread): def __init__(self, threadID, name, q): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.q = q def run(self): print("开启线程:" + self.name+"\n") download_data(self.threadID, self.name, self.q) print("退出线程:" + self.name+"\n") # 下载数据的方法,不同的业务修改这个方法即可 def download_data(id,thread_name, q): @retry() def my_request(url): requests.adapters.DEFAULT_RETRIES = 15 s = requests.session() s.keep_alive = False try: response = requests.get(url, timeout=5) except BaseException: print(url, "请求失败,开始重试") response = requests.get(url, timeout=5) return response while not exitFlag: id += 1 if id >= THREAD_NUM: # 线程数 url = q.get() # 取出队首的url file = "./caches/" + url.split("/")[-1] # 根据url进行命名 response = my_request(url) with open(file, "wb") as f: f.write(response.content) # 写二进制流 print(thread_name, url, file) # 打印完成的任务 if __name__ == '__main__': work_queue = queue.Queue(QUEUE_SIZE) # 这里需要指定一下队列的长度 threads = [] # 填充队列 for i in range(0, QUEUE_SIZE): work_queue.put(URL) # 这里根据业务构造请求的URL队列 # 创建新线程并且启动 for thread_id in range(0, THREAD_NUM): # 线程数 thread = MyThread(thread_id, "Thread-{}".format(thread_id), work_queue) thread.start() threads.append(thread) # 等待队列清空 while not work_queue.empty(): pass # 通知线程是时候退出 exitFlag = 1 # 等待所有线程完成 for t in threads: t.join() print("退出主线程")
其中已经捕获了requests的异常,所以不用担心异常中断了线程。遇到失败,会自动重试。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。