美文网首页
多线程爬虫

多线程爬虫

作者: 指向远方的灯塔 | 来源:发表于2019-06-21 13:10 被阅读0次
import threading
import time
import requests
from bs4 import BeautifulSoup
import json
from queue import Queue

class CrawlThread(threading.Thread):
    def __init__(self, name, page_queue, data_queue):
        super().__init__()
        self.name = name
        self.page_queue = page_queue
        self.data_queue = data_queue
        self.url = 'http://www.fanjian.net/jianwen-{}'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
        }

    def run(self):
        print('%s线程启动......' % self.name)
        '''
        1、从页码队列中取出一个页码
        2、将url和页码进行拼接得到url
        3、发送请求,得到响应
        4、将响应内容保存到数据队列中
        '''
        while 1:
            page = self.page_queue.get()
            url = self.url.format(page)
            content = requests.get(url=url, headers=self.headers).text
            self.data_queue.put(content)
        print('%s线程结束...' % self.name)

class ParseThread(threading.Thread):
    def __init__(self, name, data_queue, fp, lock):
        super().__init__()
        self.name = name
        self.data_queue = data_queue
        self.fp = fp
        self.lock = lock

    def run(self):
        '''
        1、从数据队列中获取数据
        2、解析
        3、保存数据到文件中
        '''
        while 1:
            data = self.data_queue.get()
            self.parse(data)

    def parse(self, data):
        soup = BeautifulSoup(data, 'lxml')

        item = {

        }
        self.lock.acquire()
        self.fp.write()
        self.lock.release()

def create_queue():
    page_queue = Queue()
    data_queue = Queue()
    # 向页码队列添加待爬取的页码
    for x in range(1, 11):
        page_queue.put(x)
    return page_queue, data_queue

def main():
    # 创建锁、打开文件
    fp = open('fanjian.txt', 'w', encoding='utf8')
    lock = threading.Lock()
    # 创建两个队列
    page_queue, data_queue = create_queue()
    # 创建两个空列表,用来保存创建的线程
    t_crawl_list = []
    t_parser_list = []
    # 创建采集线程并且启动
    crawl_names_list = ['采集线程1', '采集线程2', '采集线程3']
    for crawl_name in crawl_names_list:
        t_crawl = CrawlThread(crawl_name, page_queue, data_queue)
        t_crawl_list.append(t_crawl)
        t_crawl.start()

    # 创建解析线程并且启动
    parser_names_list = ['解析线程1', '解析线程2', '解析线程3']
    for parser_name in parser_names_list:
        t_parser = ParseThread(parser_name, data_queue, fp, lock)
        t_parser_list.append(t_parser)
        t_parser.start()

    # 写循环,让主线程等待每一个线程
    for t_crawl in t_crawl_list:
        t_crawl.join()
    for t_parser in t_parser_list:
        t_parser.join()
    fp.close()
    print('主线程-子线程全部结束')

if __name__ == '__main__':
    main()

相关文章

  • Python爬虫第七天:多线程爬虫|Scrapy框架

    内容简述: 一:多线程爬虫 二:Scrapy框架 一:多线程爬虫原理 【示例见代码】 二:Scrapy框架...

  • Python爬虫基础教程(三)

    九、多线程爬虫 9.1利用多线程爬虫爬取糗事百科的资源: 十、爬虫代码总结: 要实现一个完整的爬虫,无外乎4...

  • 「爬虫」12爬虫之多线程爬虫

    1.多线程爬虫 多线程就是程序中的某些程序段并行执行,合理地设置多线程,可以让爬虫效率更高。 2.单线程实例 以爬...

  • Thread

    队列 线程锁 多线程,线程池 队列 多线程爬虫示例 多线程 自定义线程 线程池

  • [CP_12] Python多线程爬虫应用实践(社招职位名称获取

    目录结构 一、多线程爬虫的使用 1. 多线程实现 <关联> [Pt_04] Python进程|多进程|线程|多线程...

  • 爬虫基础05

    多线程爬虫 队列(from multiprocessing import Queue)UrlQueue = Que...

  • 男子大学生的無駄日常

    关键词:Python,爬虫,requests,BeautifulSoup,opencv,python多线程,正则表...

  • 多线程爬虫实战——爬取糗事百科

    多线程爬虫思路 我们之前写的爬虫网页,往往是等待一页内容爬取完毕后,再爬取另一页内容,效率很低,而用多线程和队列之...

  • 多线程爬虫

    1、多线程爬虫,可考虑放到线程池,把我们需要解析的URL 地址存入我们的队列中,然后去触发多线程进行操作、 代码如...

  • 多线程爬虫

    多线程爬虫 有些时候,比如下载图片,因为下载图片是一个耗时的操作。如果采用之前那种同步的方式下载。那效率肯会特别慢...

网友评论

      本文标题:多线程爬虫

      本文链接:https://www.haomeiwen.com/subject/vrweqctx.html