使用queue 做一个分布式爬虫(一)
这个作为调配的
taskMaster.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/12/23 15:21
# @author : libaibuaidufu
# @File : taskMaster.py
# @Software: PyCharm
import queue
import random
from multiprocessing.managers import BaseManager
from todos.test import get_href
import requests
from bs4 import BeautifulSoup
import time
# 发送任务的队列
task_queue = queue.Queue()
# 接收结果的队列
result_queue = queue.Queue()
class QueueManager(BaseManager):
pass
class SaceMnage():
def __init__(self):
# 在网页上 请求一下 拷一份
self.headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cache-Control': 'max-age=0',
'Connection': 'keep-alive', 'Host': 'www.27270.com', 'If-Modified-Since': 'Sat, 22 Dec 2018 19',
'If-None-Match': 'W/"5c1e8fff-b918"', 'Referer': 'https', 'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
# 把两个queue注册到网络上
QueueManager.register('get_task_queue', callable=self.get_task_queue)
QueueManager.register('get_result_queue', callable=self.get_result_queue)
# 绑定端口5000,设置验证码abc
self.manager = QueueManager(address=('127.0.0.1', 5000), authkey='abc'.encode('UTF-8'))
self.manager.start()
# 通过网络访问Queue对象
self.task = self.manager.get_task_queue()
self.result = self.manager.get_result_queue()
self.num = 1
self.url = "https://www.27270.com/word/dongwushijie/" #动物
# self.url = "https://www.27270.com/ent/meinvtupian/" # 美女
# 为解决__main__.<lambda> not found问题
def get_task_queue(self):
return task_queue
# 为解决__main__.<lambda> not found问题
def get_result_queue(self):
return result_queue
def main(self):
self.distributed_task(self.url)
self.close()
def distributed_task(self, url):
self.num += 1
res = requests.get(url, headers=self.headers)
# 本地模拟时,写入本地 然后 测试
# with open("test.html", "r") as f:
# html = f.read()
# 中文乱码 使用以下处理
res.encoding = 'gb18030'
soup = BeautifulSoup(res.text, 'lxml')
# soup = BeautifulSoup(res.text)
# 定位
resultList = soup.select("div.MeinvTuPianBox ul li")
# print(resultList)
print(len(resultList))
for result in resultList:
a_list = result.select("a")
a = a_list[0]
# a_lists.append(a["href"])
# return a_lists
# 添加待处理任务
# for i in a_lists:
print('Put task %s ...' % a["href"])
self.task.put(a["href"])
for li in soup.select(".NewPages ul li a"):
if li.text == "下一页":
nexturl = self.url + li.get("href")
print(nexturl)
time.sleep(10)
while True:
# 不要让队列 有太多 怕 爬取不完 就设置小一点
if self.task.qsize() <= 60:
self.distributed_task(nexturl)
try:
nexturl = url[:-1] + str(int(url[-1]) + 1)
print(nexturl)
time.sleep(10)
while True:
if self.task.qsize() <= 60:
self.distributed_task(nexturl)
# self.distributed_task(nexturl)
except:
# 防止队列 自动关闭 应该有更好的方法 我没去查,直接等待几个小时 哈哈哈
self.wait()
# print("not any")
# if queue.Empty:
# return
def wait(self):
import time
time.sleep(6000*3)
self.manager.shutdown()
def close(self):
# 关闭
self.manager.shutdown()
def ss(self):
zurl = "https://www.27270.com/ent/meinvtupian/list_11_212.html"
url = 'https://www.27270.com/ent/meinvtupian/list_11_'
# for z in range(1,212+1):
# zurl = f'{url}{z}.html'
# self.task.put(zurl)
self.task.put(zurl)
time.sleep(3600*3)
self.close()
if __name__ == '__main__':
sace = SaceMnage()
sace.main()
# a_lists = get_href()
# distributed_task(a_lists)
# soup.div['class']="MeinvTuPianBox"
# print (soup.div.ul)
# with open("test.html","wb") as f:
# f.write(res.content)
说好的动物呢!!!!!

地址:https://github.com/libaibuaidufu/queue_pacong
使用queue 做一个分布式爬虫(一)的更多相关文章
- Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs)
Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs) Cola:一个分布式爬虫框架 发布时间:2013-06-17 14:58:27, 关注:+2034, 赞美: ...
- [python]做一个简单爬虫
为什么选择python,它强大的库可以让你专注在爬虫这一件事上而不是更底层的更繁杂的事 爬虫说简单很简单,说麻烦也很麻烦,完全取决于你的需求是什么以及你爬的网站所决定的,遇到的第一个简单的例子是pas ...
- 用Nodejs做一个简单的小爬虫
Nodejs将JavaScript语言带到了服务器端,作为js主力用户的前端们,因此获得了服务器端的开发能力,但除了用express搭建一个博客外,还有什么好玩的项目可以做呢?不如就做一个网络爬虫吧. ...
- 纯手工打造简单分布式爬虫(Python)
前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. ...
- python3 分布式爬虫
背景 部门(东方IC.图虫)业务驱动,需要搜集大量图片资源,做数据分析,以及正版图片维权.前期主要用node做爬虫(业务比较简单,对node比较熟悉).随着业务需求的变化,大规模爬虫遇到各种问题.py ...
- 分布式爬虫框架XXL-CRAWLER
<分布式爬虫框架XXL-CRAWLER> 一.简介 1.1 概述 XXL-CRAWLER 是一个分布式爬虫框架.一行代码开发一个分布式爬虫,拥有"多线程.异步.IP动态代理.分布 ...
- 使用Docker Swarm搭建分布式爬虫集群
https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653195618&idx=2&sn=b7e992da6bd1b2 ...
- 基于redis的简易分布式爬虫框架
代码地址如下:http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需,但 ...
- 分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储
http://blog.51cto.com/xpleaf/2093952 1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HB ...
随机推荐
- 动力节点 mysql 郭鑫 34道经典的面试题
DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `DEPTNO` int(2) NOT NULL COMMENT '部门编号', `DNAME` ...
- vue环境配置脚手架搭建,生命周期,钩子
Vue项目环境搭建 """ node ~~ python:node是用c++编写用来运行js代码的 npm(cnpm) ~~ pip:npm是一个终端应用商城,可以换国内 ...
- python0.1
python基础 python是一种高级编程语言,而编程语言分为3种 编程语言 编程语言是一种人与计算机沟通的工具. 编程就是就将人的需求通过攥写编程语言命令计算机完成指令. 编程的意义在于将人类的生 ...
- python 异常类型大全
try except 处理异常真舒服!!!
- java使字符串的数字加一
/** * 字符串+1方法,该方法将其结尾的整数+1,适用于任何以整数结尾的字符串,不限格式,不限分隔符. * @author zxcvbnmzb * @param testStr 要+1的字符串 * ...
- JavaScript基础对象创建模式之声明依赖模式(023)
运用了命名空间(Namespace)模式后, 就可以使用一些JavaScript库了,比如YAHOO作用YUI2库的全局对象,可以通过 YAHOO.util.Dom 和 YAHOO.util.Even ...
- 洛谷 P3916 【图的遍历】
这道题绿题有点高了吧... 我一开始的思路就是一个暴力的遍历,用递归加一个记忆化,对于一个点不断的往下搜索,然后确定最大的,返回,给上面的节点.就在这个过程中,我们是搜到最大的数然后返回给上层的数,那 ...
- 集群搭建完成简要测试集群(性能)带宽与IOPS
集群搭建好之后网络,raid卡策略,磁盘都会影响集群的性能.为了避免因上述问题使得集群的性能受到影响,我们依次进行测试,最后得到基本的集群性能. 网络 首先是网络,ceph集群一大堆让人摸不着头脑的问 ...
- Python3笔记022 - 5.1 字符串常用操作
第5章 字符串及正则表达式 5.1 字符串常用操作 5.1.1 拼接字符串 使用+运算符可完成多个字符串的拼接,产生一个新的字符串对象. str1 = "2020年07月06日是" ...
- [JAVA]标准IO流操作
import java.io.*; /** * @Description: * @projectName:JavaTest * @see:PACKAGE_NAME * @author:郑晓龙 * @c ...