1. //server
  2. import socket, select, re, queue, redis
  3. from multiprocessing import Pool, cpu_count
  4. from pymongo import MongoClient
  5.  
  6. host = '192.168.1.107'
  7. ConnectionList = []
  8. Recv_buffer = 4096000
  9. Client_Status = {}
  10. Client_Num = {}
  11. redis1 = redis.Redis(host='localhost', port=6379, db=0)
  12. Num = 0
  13.  
  14. class Distributed_Web_Crawler:
  15. def __init__(self, port):
  16. self.url_num = 1
  17. self.queue = queue.Queue()
  18. self.db = MongoClient().CrawSpider.content
  19. self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  20. self.server_socket.bind((host, port))
  21. self.server_socket.listen(10)
  22. self.pool = Pool(cpu_count() - 1)
  23. ConnectionList.append(self.server_socket)
  24. print("服务器运行在端口:" + str(port))
  25. address = 'https://movie.douban.com/'
  26. self.queue.put(address)
  27. redis1.set(address, 0)
  28. self.main()
  29.  
  30. def main(self):
  31. global Num
  32. while 1:
  33. if not self.queue.empty() and ConnectionList.__len__() > 1 is not None:
  34. self.pool.apply_async(self.task_manage())
  35. read_sockets, write_sockets, error_sockets = select.select(ConnectionList, [], [])
  36. for sock in read_sockets:
  37. if sock == self.server_socket:
  38. conn, addr = self.server_socket.accept()
  39. ConnectionList.append(conn)
  40. core_num = conn.recv(Recv_buffer).decode('utf8')
  41. Client_Status[conn] = core_num
  42. Client_Num[conn] = Client_Num.__len__() + 1
  43. print('客户端 ' + addr[0] + ':' + str(addr[1]) + '已连接,核心数: ' + core_num + '\n编号为' + str(Client_Num[
  44. conn]))
  45. else:
  46. data = sock.recv(Recv_buffer)
  47. if data:
  48. Contents = data.decode('utf8').split('Page_ContentPPPPPP///////')
  49. # print('收到'+str(Client_Num[sock])+'号机发来数据,正在处理')
  50. Client_Status[sock] = int(Client_Status[sock]) + len(Contents)
  51. print('编号'+str(Client_Num[sock])+'可用核心'+str(Client_Status[sock]))
  52. for content in Contents:
  53. if content:
  54. self.pool.apply_async(self.web_page_resolution(content))
  55. else:
  56. print('客户端 ' + addr[0] + ':' + str(addr[1]) + '断开连接')
  57. sock.close()
  58. Client_Status.pop(sock)
  59. Client_Num.pop(sock)
  60. ConnectionList.remove(sock)
  61.  
  62. def web_page_resolution(self, content):
  63. db = MongoClient().Web.data
  64. db.insert({'page_content': content})
  65. pattern = re.compile('https://movie.douban.com/(.*?)"')
  66. urls = re.findall(string=content, pattern=pattern)
  67. for url in urls:
  68. url = 'https://movie.douban.com/' + url
  69. if redis1.get(url) is None:
  70. redis1.set(url, self.url_num)
  71. self.queue.put(url)
  72. self.url_num += 1
  73.  
  74. def task_manage(self):
  75. urls = ''
  76. for socket in ConnectionList:
  77. if socket != self.server_socket:
  78. while not self.queue.empty() and int(Client_Status[socket]) != 0:
  79. urls = urls + self.queue.get() + ' '
  80. Client_Status[socket] = int(Client_Status[socket]) - 1
  81. # print('向' + str(Client_Num[socket]) + '号终端分配任务')
  82. socket.send(urls.encode('utf8'))
  83.  
  84. if __name__ == "__main__":
  85. port = 8888
  86. Distributed_Web_Crawler(port, )
  1. //Client
  2. import socket, sys, select
  3. from multiprocessing import cpu_count
  4. from requests import get
  5. from multiprocessing import Pool
  6.  
  7. p = Pool(cpu_count() - 1)
  8. host = '192.168.0.103'
  9. Page_contents = []
  10.  
  11. def crawler_page(url):
  12. print("正在爬取网页" + url)
  13. content = get(url).content.decode('utf8') + 'Page_ContentPPPPPP///////'
  14. print(url + "爬取完成,正在向服务器发送数据")
  15. s.send(content.encode('utf8'))
  16.  
  17. def listing():
  18. while 1:
  19. rlist = [sys.stdin, s]
  20. read_list, write_list, error_list = select.select(rlist, [], [])
  21. for sock in read_list:
  22. if sock == s:
  23. data = sock.recv(4096).decode('utf8')
  24. if data != 'quit' and data:
  25. urls = data.split()
  26. if len(urls) == 1:
  27. p.apply_async(crawler_page(urls[0]))
  28. else:
  29. for url in urls:
  30. p.apply_async(crawler_page(url))
  31. urls.remove(url)
  32. elif data == 'quit':
  33. print('接收到服务器关闭指令,客户端正在退出')
  34. sys.exit()
  35. else:
  36. print('服务器连接失败,正在退出')
  37. sys.exit()
  38.  
  39. if __name__ == "__main__":
  40. port = 8888
  41. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  42. s.settimeout(3)
  43. try:
  44. s.connect(('192.168.1.107', port))
  45. except:
  46. print("无法连接至服务器,请检查地址后重试")
  47. sys.exit()
  48. print("已连接至服务器,开始发送机器信息\n核心数:" + str(cpu_count()))
  49. s.send(str(cpu_count()).encode('utf8'))
  50. 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. zabbix监控交换机

    zabbix可以通过snmp协议监控交换机 前提: 交换机需要开启snmp协议,通过snmpwalk 可以抓取到数据就可以了 snmpwalk -v 2c -c public *.*.*.* 1.创建 ...

  2. 用nstimer实现倒计时

    用nstimer实现倒计时 // [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFir ...

  3. Java提高篇——equals()与hashCode()方法详解

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

  4. 事务复制-大批量DEL操作

    同事讨论删除发布表历史记录,导致订阅端数据滞后N小时.后来询问得知,发布表T只保留最近31天的数据,每天由Job删除31天前的数据,每天的删除量约400-500万条.默认情况下,在发布端删除400万条 ...

  5. 对于指定区块div,如何区分区块内的点击 和 区块外的点击?

    需求:对于区块div内点击事件, 需要展示区块内的附属操作区块,对于区块外的点击, 需要将前面说的附属操作区块隐藏掉. 分析:对于一般的HTML控件,有标准的js事件接口, focus和blur,来实 ...

  6. AndroidStudio第一个项目HelloWorld

    实验内容 在Android Studio中创建项目 创建并启动Android模拟器 项目的编译和运行 实验要求 在安装好的AndroidStudio上建立第一个工程 创建并启动Android模拟器 编 ...

  7. 数据库的Instance/Crash Recovery

    crash recovery是指单实例数据库发生了failure.或者rac数据库中的所有实例都发生了failure后进行的recovery.rac数据库crash后,rac中第一个重启启动的inst ...

  8. linux 查看磁盘剩余命令

    df -hl命令查看各磁盘的大小,使用情况,挂载点等信息. du -bs dir_name查看具体目录的空间大小

  9. JS按回车键实现登录的方法

    本文实例讲述了JS按回车键实现登录的方法,该功能有着非常广泛的实用价值.分享给大家供大家参考之用.具体方法如下: 方法一: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 < ...

  10. word转html方法

    在网上看了一篇关于word转html的文章,感觉不错,和大家分享一下. /// <summary> /// word转成html /// </summary> /// < ...