这个作为调配的

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 做一个分布式爬虫(一)的更多相关文章

  1. Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs)

    Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs) Cola:一个分布式爬虫框架 发布时间:2013-06-17 14:58:27, 关注:+2034, 赞美: ...

  2. [python]做一个简单爬虫

    为什么选择python,它强大的库可以让你专注在爬虫这一件事上而不是更底层的更繁杂的事 爬虫说简单很简单,说麻烦也很麻烦,完全取决于你的需求是什么以及你爬的网站所决定的,遇到的第一个简单的例子是pas ...

  3. 用Nodejs做一个简单的小爬虫

    Nodejs将JavaScript语言带到了服务器端,作为js主力用户的前端们,因此获得了服务器端的开发能力,但除了用express搭建一个博客外,还有什么好玩的项目可以做呢?不如就做一个网络爬虫吧. ...

  4. 纯手工打造简单分布式爬虫(Python)

    前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. ...

  5. python3 分布式爬虫

    背景 部门(东方IC.图虫)业务驱动,需要搜集大量图片资源,做数据分析,以及正版图片维权.前期主要用node做爬虫(业务比较简单,对node比较熟悉).随着业务需求的变化,大规模爬虫遇到各种问题.py ...

  6. 分布式爬虫框架XXL-CRAWLER

    <分布式爬虫框架XXL-CRAWLER> 一.简介 1.1 概述 XXL-CRAWLER 是一个分布式爬虫框架.一行代码开发一个分布式爬虫,拥有"多线程.异步.IP动态代理.分布 ...

  7. 使用Docker Swarm搭建分布式爬虫集群

    https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653195618&idx=2&sn=b7e992da6bd1b2 ...

  8. 基于redis的简易分布式爬虫框架

    代码地址如下:http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需,但 ...

  9. 分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储

    http://blog.51cto.com/xpleaf/2093952 1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HB ...

随机推荐

  1. Python三大器之装饰器

    Python三大器之装饰器 开放封闭原则 一个良好的项目必定是遵守了开放封闭原则的,就比如一段好的Python代码必定是遵循PEP8规范一样.那么什么是开放封闭原则?具体表现在那些点? 开放封闭原则的 ...

  2. 【asp.net core 系列】14 .net core 中的IOC

    0.前言 通过前面几篇,我们了解到了如何实现项目的基本架构:数据源.路由设置.加密以及身份验证.那么在实现的时候,我们还会遇到这样的一个问题:当我们业务类和数据源越来越多的时候,我们无法通过普通的构造 ...

  3. sorted 函数及小练习

    python 中sorted函数 sorted() 函数对所有可迭代的对象进行排序操作. sorted 语法: sorted(iterable[, cmp[, key[, reverse]]]) 参数 ...

  4. 如何在Mac中配置Python虚拟环境,踩了好多坑

    如何在Mac中配置Python虚拟环境 1.安装virtualenv pip3 install virtualenv 2.安装virtualenvwrapper pip3 install virtua ...

  5. 移动端H5页面_input获取焦点时,虚拟键盘挡住input输入框解决方法

    在移动端h5开发的时候,发现如果input在页面底部,当触发input焦点的时候会弹出系统虚拟键盘,虚拟键盘会遮挡input输入框.这会很影响用户体验,于是在网上找到了如下的解决办法: 方法一:使用w ...

  6. HDU 2236 无题Ⅱ

    HDU 2236 无题Ⅱ 题目大意 这是一个简单的游戏,在一个\(n*n\)的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小. solution 暴枚\(i ...

  7. os.environ的详解

    我们想要用Python获得一些有关系统的各种信息的时候就不得不想到os的environ,那这里面都具体包含了那些内容呢? 简介 对于官方的解释,environ是一个字符串所对应环境的映像对象.这是什么 ...

  8. mysql中给查询结果添加序号

    当我们想为查询结果添加序号的时候可以这样写 SELECT @rowid:=@rowid+1 allid, pan_number, receive_person,time_note, url,unit_ ...

  9. Java中的堆和栈以及堆栈的区别

    在正式内容开始之前要说明一点,我们经常所说的堆栈堆栈是堆和栈统称,堆是堆,栈是栈,合在一起统称堆栈: 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Jav ...

  10. 数据可视化之powerBI技巧(十四)采悟:PowerBI中自制中文单位万和亿

    使用PowerBI的时候,一个很不爽之处就是数据单位的设置,只能用千.百万等英美的习惯来显示,而没有我们中文所习惯的万亿等单位,虽然要求添加"万"的呼声很高,但迟迟未见到改进动作, ...