【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多进程版)
- # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正
- import requests
- from lxml import etree
- from multiprocessing import JoinableQueue as Queue
- from multiprocessing import Process
- """爬取目标:http://www.qiushibaike.com/8hr/page/1
- 利用多进程实现
- """
- class QiuShi:
- def __init__(self):
- # url和headers
- self.base_url = 'http://www.qiushibaike.com/8hr/page/{}'
- self.headers = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
- # 定义队列,用来传递数据
- self.url_queue = Queue()
- self.request_queue = Queue()
- self.html_queue = Queue()
- def get_url_list(self):
- """获取所有的url"""
- for i in range(1, 14):
- target_url = self.base_url.format(i)
- print(target_url)
- # 计数需要请求的url
- self.url_queue.put(target_url)
- def request_url(self):
- """向url发起请求"""
- while True:
- target_url = self.url_queue.get()
- response = requests.get(target_url, self.headers)
- print(response)
- self.request_queue.put(response)
- self.url_queue.task_done()
- def get_content(self):
- """获取数据"""
- while True:
- html_text = self.request_queue.get().content.decode()
- html = etree.HTML(html_text)
- div_list = html.xpath('//div[@id="content-left"]/div')
- content_list = []
- for div in div_list:
- item = {}
- item['author'] = div.xpath('.//h2/text()')[0].strip()
- item['content'] = div.xpath('.//span/text()')[0].strip()
- print(item)
- content_list.append(item)
- self.html_queue.put(content_list)
- self.request_queue.task_done()
- def save_data(self):
- """保存入库"""
- while True:
- data_list = self.html_queue.get()
- for data in data_list:
- with open('qiushi.text', 'a+') as f:
- f.write(str(data))
- f.write('\r\n')
- self.html_queue.task_done()
- def main(self):
- # 获取所有url
- self.get_url_list()
- # 创建一个进程盒子,用于收集进程
- process_list = []
- p_request = Process(target=self.request_url)
- process_list.append(p_request)
- p_content = Process(target=self.get_content)
- process_list.append(p_content)
- p_save_data = Process(target=self.save_data)
- process_list.append(p_save_data)
- # 让所有进程跑起来
- for process in process_list:
- process.daemon = True # 设置为守护进程:主进程结束,子进程任务完不完成,都要随着主进程结束而结束
- process.start()
- # 等待进程任务完成,回收进程 director:主任:可以理解为普通员工都下班了,领导才能下班
- for director in [self.url_queue,self.request_queue,self.html_queue]:
- director.join()
- if __name__ == '__main__':
- qiushi = QiuShi()
- qiushi.main()
【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多进程版)的更多相关文章
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正from selenium import webdriver import time class Douyu: "&q ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(协程池版)
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from gevent import monkey monkey.patch_all() from gevent.pool i ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(线程池版)
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多线程版)
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...
- 基于webmagic的爬虫小应用--爬取知乎用户信息
听到“爬虫”,是不是第一时间想到Python/php ? 多少想玩爬虫的Java学习者就因为语言不通而止步.Java是真的不能做爬虫吗? 当然不是. 只不过python的3行代码能解决的问题,而Jav ...
- [python爬虫] Selenium定向爬取PubMed生物医学摘要信息
本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容. PubMed是一个免费的搜寻引擎,提供生物医学方 ...
- python爬虫实战之爬取智联职位信息和博客文章信息
1.python爬取招聘信息 简单爬取智联招聘职位信息 # !/usr/bin/env python # -*-coding:utf-8-*- """ @Author ...
- Python爬虫基础--分布式爬取贝壳网房屋信息(Client)
1. client_code01 2. client_code02 3. 这个时候运行多个client就可以分布式进行数据爬取.
- selenium,webdriver爬取斗鱼主播信息 实操
from selenium import webdriver import time from bs4 import BeautifulSoup class douyuSelenium(): #初始化 ...
随机推荐
- MySQL 5.7 的安装历程
mysql5.7零基础入门级的安装教程: 安装环境:Windows 10, 64 位(联想拯救者R720) 安装版本:mysql-5.7.25-winx64 一.下载 1.进入官网 首先,下载MySQ ...
- Java NIO系列之[说在前面的话]
在开始这个系列文章之前,先聊一些题外话,说说我为什么要写Java NIO这个系列技术文章(不看完会错失一个亿的),因为Java NIO并不像JVM,中间件源码那么有吸引力,但这个技术点是java的基础 ...
- Redis各数据结构常用命令
redis 通用API keys * 遍历所有key 一般不在生产环境中使用 redis单线程,容易阻塞其他命令执行 O(n) dbsize 计算key的总数 O(1)exists 检查key是否存在 ...
- [python]python列表、元组
1. 列表和元组简介 列表:用中括号[]包裹,元素的个数及元素的值可以改变. 元组:用小括号()包裹,不可用更改. 通过切片运算[]和[:]可以得到子集. 2.列表 示例: List = [1, 2, ...
- 牛客小白月赛8 - E - 诡异数字 数位DP
牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...
- codeforces 842 D. Vitya and Strange Lesson(01字典树+思维+贪心)
题目链接:http://codeforces.com/contest/842/problem/D 题解:像这种求一段异或什么的都可以考虑用字典树而且mex显然可以利用贪心+01字典树,和线段树差不多就 ...
- 个推TechDay参会感悟
上周六去参加了个推和FCC联合在梦想小镇举办的TechDay,当然是作为台下听讲选手参与的,想上去讲可惜实力他不允许啊,吹牛逼我在行,讲技术可就有点虚了,老老实实的坐在台下听大佬们的分享,当然由于买了 ...
- 详解JAVA字符串类型switch的底层原理
基础 我们现在使用的Java的版本,基本上是都支持String类型的.当然除了String类型,还有int.char.byte.short.enum等等也都是支持的.然而在其底部实现中,还是基于 整型 ...
- 初玩Docker
Docker 和VM的区别 Docker就是类似于一个打包好的环境,相关的服务都安装在里面,可以直接使用的. VM就相当于另外一套独立的系统,独立的IP,虚拟硬件. 要使用就需要单独构建一套才可以. ...
- Java连载29-方法执行内存分析、方法重载
一.JVM包含三个内存区:栈内存.堆内存.方法区内存 二.注意点 (1)在MyEclipse中字体是红色的是一个类的名字,并且这个类除了我们自定义的类是JavaSE类库中自带的 (2)其实JavaSE ...