//server
import socket, select, re, queue, redis
from multiprocessing import Pool, cpu_count
from pymongo import MongoClient host = '192.168.1.107'
ConnectionList = []
Recv_buffer = 4096000
Client_Status = {}
Client_Num = {}
redis1 = redis.Redis(host='localhost', port=6379, db=0)
Num = 0 class Distributed_Web_Crawler:
def __init__(self, port):
self.url_num = 1
self.queue = queue.Queue()
self.db = MongoClient().CrawSpider.content
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.bind((host, port))
self.server_socket.listen(10)
self.pool = Pool(cpu_count() - 1)
ConnectionList.append(self.server_socket)
print("服务器运行在端口:" + str(port))
address = 'https://movie.douban.com/'
self.queue.put(address)
redis1.set(address, 0)
self.main() def main(self):
global Num
while 1:
if not self.queue.empty() and ConnectionList.__len__() > 1 is not None:
self.pool.apply_async(self.task_manage())
read_sockets, write_sockets, error_sockets = select.select(ConnectionList, [], [])
for sock in read_sockets:
if sock == self.server_socket:
conn, addr = self.server_socket.accept()
ConnectionList.append(conn)
core_num = conn.recv(Recv_buffer).decode('utf8')
Client_Status[conn] = core_num
Client_Num[conn] = Client_Num.__len__() + 1
print('客户端 ' + addr[0] + ':' + str(addr[1]) + '已连接,核心数: ' + core_num + '\n编号为' + str(Client_Num[
conn]))
else:
data = sock.recv(Recv_buffer)
if data:
Contents = data.decode('utf8').split('Page_ContentPPPPPP///////')
# print('收到'+str(Client_Num[sock])+'号机发来数据,正在处理')
Client_Status[sock] = int(Client_Status[sock]) + len(Contents)
print('编号'+str(Client_Num[sock])+'可用核心'+str(Client_Status[sock]))
for content in Contents:
if content:
self.pool.apply_async(self.web_page_resolution(content))
else:
print('客户端 ' + addr[0] + ':' + str(addr[1]) + '断开连接')
sock.close()
Client_Status.pop(sock)
Client_Num.pop(sock)
ConnectionList.remove(sock) def web_page_resolution(self, content):
db = MongoClient().Web.data
db.insert({'page_content': content})
pattern = re.compile('https://movie.douban.com/(.*?)"')
urls = re.findall(string=content, pattern=pattern)
for url in urls:
url = 'https://movie.douban.com/' + url
if redis1.get(url) is None:
redis1.set(url, self.url_num)
self.queue.put(url)
self.url_num += 1 def task_manage(self):
urls = ''
for socket in ConnectionList:
if socket != self.server_socket:
while not self.queue.empty() and int(Client_Status[socket]) != 0:
urls = urls + self.queue.get() + ' '
Client_Status[socket] = int(Client_Status[socket]) - 1
# print('向' + str(Client_Num[socket]) + '号终端分配任务')
socket.send(urls.encode('utf8')) if __name__ == "__main__":
port = 8888
Distributed_Web_Crawler(port, )
//Client
import socket, sys, select
from multiprocessing import cpu_count
from requests import get
from multiprocessing import Pool p = Pool(cpu_count() - 1)
host = '192.168.0.103'
Page_contents = [] def crawler_page(url):
print("正在爬取网页" + url)
content = get(url).content.decode('utf8') + 'Page_ContentPPPPPP///////'
print(url + "爬取完成,正在向服务器发送数据")
s.send(content.encode('utf8')) def listing():
while 1:
rlist = [sys.stdin, s]
read_list, write_list, error_list = select.select(rlist, [], [])
for sock in read_list:
if sock == s:
data = sock.recv(4096).decode('utf8')
if data != 'quit' and data:
urls = data.split()
if len(urls) == 1:
p.apply_async(crawler_page(urls[0]))
else:
for url in urls:
p.apply_async(crawler_page(url))
urls.remove(url)
elif data == 'quit':
print('接收到服务器关闭指令,客户端正在退出')
sys.exit()
else:
print('服务器连接失败,正在退出')
sys.exit() if __name__ == "__main__":
port = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(3)
try:
s.connect(('192.168.1.107', port))
except:
print("无法连接至服务器,请检查地址后重试")
sys.exit()
print("已连接至服务器,开始发送机器信息\n核心数:" + str(cpu_count()))
s.send(str(cpu_count()).encode('utf8'))
listing()

python--分布式爬虫的更多相关文章

  1. Python分布式爬虫原理

    转载 permike 原文 Python分布式爬虫原理 首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的. (1)打开浏览器,输入URL,打开源网页 (2)选取我们想要的内容,包括标题,作 ...

  2. 第三百七十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapyd部署scrapy项目

    第三百七十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapyd部署scrapy项目 scrapyd模块是专门用于部署scrapy项目的,可以部署和管理scrapy项目 下载地址:h ...

  3. 第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索

    第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到 ...

  4. 第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

    第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time ...

  5. 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  6. 第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能

    第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.e ...

  7. 第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中 前面我们讲到的elasticsearch( ...

  8. 第三百六十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询

    第三百六十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询 bool查询说明 filter:[],字段的过滤,不参与打分must:[] ...

  9. 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...

  10. 第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

    第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字 ...

随机推荐

  1. linux中ONBOOT=yes的含义

    在/etc/sysconfig/network-scripts/ifcfg-eth0(确认ONBOOT=yes),其中eth0是设备名 ONBOOT是指明在系统启动时是否激活网卡,只有在激活状态的网卡 ...

  2. Android 高德地图No implementation found for long com.autonavi.amap.mapcore.MapCore

    此篇博客最后更新时间写自2016.5.18.当下高德地图jar版本为3.3.1. 使用高德地图碰到此问题,纠结许久(接近4个多小时). 记录在此,希望遇到相同问题的读者可以有所借鉴. 错误截图: 导致 ...

  3. iOS ARC中CTCallCenter没用,无法监听电话的解决方案

    今天在尝试使用CTCallCenter进行电话监听时,发现一直无法捕获电话状态改变的事件,研究了一番之后找到了解决方案,在这里分享给大家. 首先使用CTCallCenter监听电话的代码如下: CTC ...

  4. Windows Server 2008 R2 DNS服务器迁移

    一.实验模拟环境: Zhuyu公司有一个DNS服务器,因DNS服务器比较老旧,准备迁移至新的DNS服务器上(DNS备份也可以这么操作). 旧DNS服务器: 主机名: test-zhuAD        ...

  5. 使用百度编辑器时,报错:从客户端("...)中检测到有潜在危险的 Request.Form 值

    ajax请求失败,提交不上去 起初没找到报错的这句话,可能由于我用了其他第三方插件的原因,后来改动了一下,出现了这个错误 然后百度得到答案:http://www.cnblogs.com/tearer/ ...

  6. RDIFramework.NET ━ 9.15 个性化设置 ━ Web部分

    RDIFramework.NET ━ .NET快速信息化系统开发框架 9.15  个性化设置 -Web部分 个性化设置,主要针对用户的偏好对界面进行设置,主界面如下: 9.15.1界面皮肤设置 目前框 ...

  7. Struts2(五):ActionSupport

    我们在上一章节中的一个列子中使用到了一个标识跳转到登录页面的例子: 示例是这样写的: index.jsp: <br/> <a href="gotoLoginPage&quo ...

  8. Python快速建站系列-Part.Five.1-个人主页及发表文章

    |版权声明:本文为博主原创文章,未经博主允许不得转载. 现在的TSSS已经有了注册和登录的功能,首页的内容也填充好了,那这一节就完成用户个人主页的内容和发表文章功能的实现. 先完成用户个人主页的use ...

  9. C# 参数化SQL语句中的like和in

    在写项目的时候遇到一个问题,sql 语句进行 like in 参数化,按照正常的方式是无法实现的我们一般的思维是: Like 参数:string strSql = "select * fro ...

  10. Intel+Ardruino 101 翻转时点灯

    /*  ===============================================  Example sketch for CurieIMU library for Intel(R ...