Dimples's blog Dimples's blog
首页
  • 前端随笔

    • React
  • 系列文章

    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript》笔记
  • 后端文章

    • Java
    • Python
    • 数据库
  • 学习笔记

    • 《Rust》笔记
    • 《SpringBoot》笔记
    • 《Django》笔记
    • 《Docker》笔记
    • 《Python爬虫》笔记
技术分享
友情链接
索引
关于
GitHub (opens new window)

DimplesY

不会写代码
首页
  • 前端随笔

    • React
  • 系列文章

    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript》笔记
  • 后端文章

    • Java
    • Python
    • 数据库
  • 学习笔记

    • 《Rust》笔记
    • 《SpringBoot》笔记
    • 《Django》笔记
    • 《Docker》笔记
    • 《Python爬虫》笔记
技术分享
友情链接
索引
关于
GitHub (opens new window)
  • 爬虫介绍
  • 工具的使用
  • 爬取数据-urllib库
  • urllib库的高级用法
  • URLError与Cookie
  • Requests库的用法
  • 数据提取-正则表达式
  • 数据提取-Beautiful Soup
  • 数据提取-XPath
  • 数据提取-JsonPath
  • 数据提取-PyQuery
  • 爬虫之多线程
    • Selenium与PhantomJS
    • Selenium 处理滚动条
    • Python下Tesseract Ocr引擎及安装介绍
    • Scrapy 框架介绍与安装
    • 《Python爬虫》笔记
    DimplesY
    2022-03-07

    爬虫之多线程

    # 1. 引入

    我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理。

    不建议你用这个,不过还是介绍下了,如果想看可以看看下面,不想浪费时间直接看

    # 2. 如何使用

    爬虫使用多线程来处理网络请求,使用线程来处理URL队列中的url,然后将url返回的结果保存在另一个队列中,其它线程在读取这个队列中的数据,然后写到文件中去

    # 3. 主要组成部分

    # 3.1 URL队列和结果队列

    将将要爬去的url放在一个队列中,这里使用标准库Queue。访问url后的结果保存在结果队列中

    初始化一个URL队列

    from queue import Queue
    urls_queue = Queue()
    out_queue = Queue()
    
    1
    2
    3

    # 3.2 请求线程

    使用多个线程,不停的取URL队列中的url,并进行处理:

    import threading
    
    class ThreadCrawl(threading.Thread):
        def __init__(self, queue, out_queue):
            threading.Thread.__init__(self)
            self.queue = queue
            self.out_queue = out_queue
    
        def run(self):
            while True:
                item = self.queue.get()
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    如果队列为空,线程就会被阻塞,直到队列不为空。处理队列中的一条数据后,就需要通知队列已经处理完该条数据

    # 3.3 处理线程

    处理结果队列中的数据,并保存到文件中。如果使用多个线程的话,必须要给文件加上锁

    lock = threading.Lock()
    f = codecs.open('out.txt', 'w', 'utf8')
    
    1
    2

    当线程需要写入文件的时候,可以这样处理:

    with lock:
        f.write(something)
    
    1
    2

    # 4. Queue模块中的常用方法:

    Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步

    • Queue.qsize() 返回队列的大小
    • Queue.empty() 如果队列为空,返回True,反之False
    • Queue.full() 如果队列满了,返回True,反之False
    • Queue.full 与 maxsize 大小对应
    • Queue.get([block[, timeout]])获取队列,timeout等待时间
    • Queue.get_nowait() 相当Queue.get(False)
    • Queue.put(item) 写入队列,timeout等待时间
    • Queue.put_nowait(item) 相当Queue.put(item, False)
    • Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
    • Queue.join() 实际上意味着等到队列为空,再执行别的操作
    帮助我修改此页面 (opens new window)
    #Python#爬虫
    上次更新: 2022/11/20, 18:28:09
    数据提取-PyQuery
    Selenium与PhantomJS

    ← 数据提取-PyQuery Selenium与PhantomJS→

    最近更新
    01
    使用 strapi 快速构建 API 和 CMS 管理系统
    03-03
    02
    Rust 开发环境
    11-26
    03
    使用 paka.dev 为 npm 包生成文档
    11-24
    更多文章>
    Theme by Vdoing | Copyright © 2020-2025 Dimples YJ | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式