1. # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正
  1. import requests
  2. from lxml import etree
  3. from multiprocessing import JoinableQueue as Queue
  4. from multiprocessing import Process
  5.  
  6. """爬取目标:http://www.qiushibaike.com/8hr/page/1
  7. 利用多进程实现
  8. """
  9.  
  10. class QiuShi:
  11. def __init__(self):
  12. # url和headers
  13. self.base_url = 'http://www.qiushibaike.com/8hr/page/{}'
  14. self.headers = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
  15.  
  16. # 定义队列,用来传递数据
  17. self.url_queue = Queue()
  18. self.request_queue = Queue()
  19. self.html_queue = Queue()
  20.  
  21. def get_url_list(self):
  22. """获取所有的url"""
  23. for i in range(1, 14):
  24. target_url = self.base_url.format(i)
  25. print(target_url)
  26. # 计数需要请求的url
  27. self.url_queue.put(target_url)
  28.  
  29. def request_url(self):
  30. """向url发起请求"""
  31. while True:
  32. target_url = self.url_queue.get()
  33. response = requests.get(target_url, self.headers)
  34. print(response)
  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. # 获取所有url
  67. self.get_url_list()
  68. # 创建一个进程盒子,用于收集进程
  69. process_list = []
  70. p_request = Process(target=self.request_url)
  71. process_list.append(p_request)
  72.  
  73. p_content = Process(target=self.get_content)
  74. process_list.append(p_content)
  75.  
  76. p_save_data = Process(target=self.save_data)
  77. process_list.append(p_save_data)
  78.  
  79. # 让所有进程跑起来
  80. for process in process_list:
  81. process.daemon = True # 设置为守护进程:主进程结束,子进程任务完不完成,都要随着主进程结束而结束
  82. process.start()
  83.  
  84. # 等待进程任务完成,回收进程 director:主任:可以理解为普通员工都下班了,领导才能下班
  85. for director in [self.url_queue,self.request_queue,self.html_queue]:
  86. director.join()
  87.  
  88. if __name__ == '__main__':
  89. qiushi = QiuShi()
  90. 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(多线程版)

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

  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. MySQL 5.7 的安装历程

    mysql5.7零基础入门级的安装教程: 安装环境:Windows 10, 64 位(联想拯救者R720) 安装版本:mysql-5.7.25-winx64 一.下载 1.进入官网 首先,下载MySQ ...

  2. Java NIO系列之[说在前面的话]

    在开始这个系列文章之前,先聊一些题外话,说说我为什么要写Java NIO这个系列技术文章(不看完会错失一个亿的),因为Java NIO并不像JVM,中间件源码那么有吸引力,但这个技术点是java的基础 ...

  3. Redis各数据结构常用命令

    redis 通用API keys * 遍历所有key 一般不在生产环境中使用 redis单线程,容易阻塞其他命令执行 O(n) dbsize 计算key的总数 O(1)exists 检查key是否存在 ...

  4. [python]python列表、元组

    1. 列表和元组简介 列表:用中括号[]包裹,元素的个数及元素的值可以改变. 元组:用小括号()包裹,不可用更改. 通过切片运算[]和[:]可以得到子集. 2.列表 示例: List = [1, 2, ...

  5. 牛客小白月赛8 - E - 诡异数字 数位DP

    牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...

  6. codeforces 842 D. Vitya and Strange Lesson(01字典树+思维+贪心)

    题目链接:http://codeforces.com/contest/842/problem/D 题解:像这种求一段异或什么的都可以考虑用字典树而且mex显然可以利用贪心+01字典树,和线段树差不多就 ...

  7. 个推TechDay参会感悟

    上周六去参加了个推和FCC联合在梦想小镇举办的TechDay,当然是作为台下听讲选手参与的,想上去讲可惜实力他不允许啊,吹牛逼我在行,讲技术可就有点虚了,老老实实的坐在台下听大佬们的分享,当然由于买了 ...

  8. 详解JAVA字符串类型switch的底层原理

    基础 我们现在使用的Java的版本,基本上是都支持String类型的.当然除了String类型,还有int.char.byte.short.enum等等也都是支持的.然而在其底部实现中,还是基于 整型 ...

  9. 初玩Docker

    Docker 和VM的区别 Docker就是类似于一个打包好的环境,相关的服务都安装在里面,可以直接使用的. VM就相当于另外一套独立的系统,独立的IP,虚拟硬件. 要使用就需要单独构建一套才可以. ...

  10. Java连载29-方法执行内存分析、方法重载

    一.JVM包含三个内存区:栈内存.堆内存.方法区内存 二.注意点 (1)在MyEclipse中字体是红色的是一个类的名字,并且这个类除了我们自定义的类是JavaSE类库中自带的 (2)其实JavaSE ...