1.  
  1. # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正
  1. from queue import Queue
  2. import requests
  3. from lxml import etree
  4. from threading import Thread
  5.  
  6. """爬取目标:http://www.qiushibaike.com/8hr/page/1
  7. 用多线程实现
  8. """
  9.  
  10. class QiuShi:
  11.  
  12. def __init__(self):
  13.  
  14. # url和headers
  15. self.base_url = 'http://www.qiushibaike.com/8hr/page/{}'
  16. self.headers = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
  17.  
  18. # 定义队列,用来传递数据
  19. self.url_queue = Queue()
  20. self.request_queue = Queue()
  21. self.html_queue = Queue()
  22.  
  23. def get_url_list(self):
  24. """获取所有的url"""
  25. for i in range(1, 14):
  26. target_url = self.base_url.format(i)
  27. print(target_url)
  28. self.url_queue.put(target_url)
  29.  
  30. def request_url(self):
  31. """向url发起请求"""
  32. while True:
  33. target_url = self.url_queue.get()
  34. response = requests.get(target_url, self.headers)
  35. self.request_queue.put(response)
  36. self.url_queue.task_done()
  37.  
  38. def get_content(self):
  39. """获取数据"""
  40. while True:
  41. html_text = self.request_queue.get().content.decode()
  42. html = etree.HTML(html_text)
  43. div_list = html.xpath('//div[@id="content-left"]/div')
  44. content_list = []
  45. for div in div_list:
  46. item = {}
  47. item['author'] = div.xpath('.//h2/text()')[0].strip()
  48. item['content'] = div.xpath('.//span/text()')[0].strip()
  49. print(item)
  50. content_list.append(item)
  51. self.html_queue.put(content_list)
  52. self.request_queue.task_done()
  53.  
  54. def save_data(self):
  55. """保存入库"""
  56. while True:
  57. data_list = self.html_queue.get()
  58. for data in data_list:
  59. with open('qiushi.text', 'a+') as f:
  60. f.write(str(data))
  61. f.write('\r\n')
  62. self.html_queue.task_done()
  63.  
  64. def main(self):
  65. """主程序逻辑"""
  66. # 定义一个线程收集器,用于收集线程
  67. thread_list = []
  68. # 1.获取url
  69. self.get_url_list()
  70. # 2.请求url
  71. t_request_url = Thread(target=self.request_url)
  72. thread_list.append(t_request_url)
  73. # 3.获取数据任务比较重,用四个线程去跑
  74. # for worker in range(4):
  75. t_get_content = Thread(target=self.get_content)
  76. thread_list.append(t_get_content)
  77. # 4.保存入库
  78. t_save_data = Thread(target=self.save_data)
  79. thread_list.append(t_save_data)
  80.  
  81. # 将收集器中的线程全部跑起来
  82. for s in thread_list:
  83. s.start() # 开启线程
  84.  
  85. # 当所有队列中的任务完成了,回收线程
  86. for i in [self.url_queue,self.request_queue,self.html_queue]:
  87. i.join()
  88. print("主线程结束")
  89.  
  90. if __name__ == '__main__':
  91. qiushi = QiuShi()
  92. qiushi.main()

【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多线程版)的更多相关文章

  1. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正from selenium import webdriver import time class Douyu: "&q ...

  2. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(协程池版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from gevent import monkey monkey.patch_all() from gevent.pool i ...

  3. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(线程池版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...

  4. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多进程版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 import requests from lxml import etree from multiprocessing imp ...

  5. 基于webmagic的爬虫小应用--爬取知乎用户信息

    听到“爬虫”,是不是第一时间想到Python/php ? 多少想玩爬虫的Java学习者就因为语言不通而止步.Java是真的不能做爬虫吗? 当然不是. 只不过python的3行代码能解决的问题,而Jav ...

  6. [python爬虫] Selenium定向爬取PubMed生物医学摘要信息

    本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容.        PubMed是一个免费的搜寻引擎,提供生物医学方 ...

  7. python爬虫实战之爬取智联职位信息和博客文章信息

    1.python爬取招聘信息 简单爬取智联招聘职位信息 # !/usr/bin/env python # -*-coding:utf-8-*- """ @Author  ...

  8. Python爬虫基础--分布式爬取贝壳网房屋信息(Client)

    1. client_code01 2. client_code02 3. 这个时候运行多个client就可以分布式进行数据爬取.

  9. selenium,webdriver爬取斗鱼主播信息 实操

    from selenium import webdriver import time from bs4 import BeautifulSoup class douyuSelenium(): #初始化 ...

随机推荐

  1. QFramework 使用指南 2020(三):脚本生成(1)基本使用

    在上一篇,我们对 QFramework 的两个主要版本提供了介绍,并且写下了第一个 QFramework 脚本. 在这一篇,我们学习 QFramework 中几乎每个项目都要用到并且从中受益的功能:自 ...

  2. Django + JQuery + ajax实时显示数据

    1 创建django项目 :Visualization and  APP :Demo >>django-admin startproject Visualization >>p ...

  3. vue-cli3.x创建及运行项目

    Node 版本要求 Vue CLI 需要 Node.js 8.9 或更高版本 (推荐 8.11.0+).如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm un ...

  4. abp(net core)+easyui+efcore实现仓储管理系统——菜单 (十六)

    系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) ...

  5. 一 安装docker(详解)

    一.安装docker 1 Docker 要求 CentOS 系统的内核版本高于 3.10 执行命令:uname -r 2 添加yum源: yum-config-manager --add-repo h ...

  6. 关于斐波那契数列的一些恒等式 模板 牛客OI测试赛 A 斐波拉契

    牛客A 斐波拉契 链接:https://www.nowcoder.com/acm/contest/181/A来源:牛客网 设f[i]表示斐波那契数论的第i项 f[1]=1,f[2] =1,f[i] = ...

  7. 天梯杯 L2-023 图着色问题

    L2-023. 图着色问题 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 图着色问题是一个著名的NP完全问题.给定无向图 G ...

  8. Java内部类的使用小结 形参为什么要用final

    部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文 ...

  9. 一道算法问题:一幢 200 层的大楼,给你两个鸡蛋. 如果在第 n 层扔下鸡蛋,鸡蛋不碎,那么从前 n-1 层扔鸡蛋都不碎. 这两只鸡蛋一模一样,不碎的话可以扔无数次. 已知鸡蛋在0层扔不会碎. 提出一个策略, 要保证能测出鸡蛋恰好会碎的楼层, 并使此策略在最坏情况下所扔次数最少.

    今晚要参加网易的笔试,所以一直在刷题,刷到这个题的时候觉得自己的思路很模糊,就去网上百度了一下,找到一个大神给的解决方案: 如下: (http://ppwwyyxx.com/2013/Problem- ...

  10. CentOS7上OpenResty安装

    1,OpenResty安装 通过repl源安装: sudo yum-config-manager --add-repo https://openresty.org/yum/cn/centos/Open ...