python--分布式爬虫
- //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--分布式爬虫的更多相关文章
- Python分布式爬虫原理
转载 permike 原文 Python分布式爬虫原理 首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的. (1)打开浏览器,输入URL,打开源网页 (2)选取我们想要的内容,包括标题,作 ...
- 第三百七十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapyd部署scrapy项目
第三百七十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapyd部署scrapy项目 scrapyd模块是专门用于部署scrapy项目的,可以部署和管理scrapy项目 下载地址:h ...
- 第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索
第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到 ...
- 第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页
第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time ...
- 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能
第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...
- 第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能
第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.e ...
- 第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中
第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中 前面我们讲到的elasticsearch( ...
- 第三百六十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询
第三百六十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询 bool查询说明 filter:[],字段的过滤,不参与打分must:[] ...
- 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询
第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...
- 第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理
第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字 ...
随机推荐
- zabbix监控交换机
zabbix可以通过snmp协议监控交换机 前提: 交换机需要开启snmp协议,通过snmpwalk 可以抓取到数据就可以了 snmpwalk -v 2c -c public *.*.*.* 1.创建 ...
- 用nstimer实现倒计时
用nstimer实现倒计时 // [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFir ...
- Java提高篇——equals()与hashCode()方法详解
java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...
- 事务复制-大批量DEL操作
同事讨论删除发布表历史记录,导致订阅端数据滞后N小时.后来询问得知,发布表T只保留最近31天的数据,每天由Job删除31天前的数据,每天的删除量约400-500万条.默认情况下,在发布端删除400万条 ...
- 对于指定区块div,如何区分区块内的点击 和 区块外的点击?
需求:对于区块div内点击事件, 需要展示区块内的附属操作区块,对于区块外的点击, 需要将前面说的附属操作区块隐藏掉. 分析:对于一般的HTML控件,有标准的js事件接口, focus和blur,来实 ...
- AndroidStudio第一个项目HelloWorld
实验内容 在Android Studio中创建项目 创建并启动Android模拟器 项目的编译和运行 实验要求 在安装好的AndroidStudio上建立第一个工程 创建并启动Android模拟器 编 ...
- 数据库的Instance/Crash Recovery
crash recovery是指单实例数据库发生了failure.或者rac数据库中的所有实例都发生了failure后进行的recovery.rac数据库crash后,rac中第一个重启启动的inst ...
- linux 查看磁盘剩余命令
df -hl命令查看各磁盘的大小,使用情况,挂载点等信息. du -bs dir_name查看具体目录的空间大小
- JS按回车键实现登录的方法
本文实例讲述了JS按回车键实现登录的方法,该功能有着非常广泛的实用价值.分享给大家供大家参考之用.具体方法如下: 方法一: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 < ...
- word转html方法
在网上看了一篇关于word转html的文章,感觉不错,和大家分享一下. /// <summary> /// word转成html /// </summary> /// < ...