Python開源:Ugly-Distributed-Crawler - 基于 Redis 實現的簡單到爆的分布式爬蟲

ty014914 7年前發布 | 51K 次閱讀 Redis 分布式系統 網絡爬蟲

Ugly-Distributed-Crawler

簡陋的分布式爬蟲

新手向,基于Redis構建的分布式爬蟲。 以爬取考研網的貼子為例,利用 PyQuery, lxml 進行解析,將符合要求的文章文本存入MySQ數據庫中。

結構簡介

cooperator

協作模塊,用于為Master&Worker模塊提供代理IP支持

master

提取滿足條件的文章url,并交給Worker進一步處理

Worker

解析文章內容,將符合要求的存入數據庫

環境依賴

sqlalchemy => 1.0.13

pyquery => 1.2.17

requests => 2.12.3

redis => 2.10.5

lxml => 3.6.0

  1. 需要預先安裝MySQL-server 和 Redis-server.
  2. MySQL中應有名為kybsrc的數據庫,且該數據庫包含一個名為posts的表,擁有num(INT AUTO_INCREMENT)和post(TEXT)兩個字段。

如何啟動

0. 先配置好各模塊所引用的配置文件

1. 為了更好地運行,cooperator/start.py 應提前開始并完成一次工作函數執行

第一次執行完后,每五分鐘運行一次工作函數

2. 啟動 master/start.py

默認只執行一次

3. 啟動 worker/start.py

默認循環監聽是否有新的URL待解析

核心點說明

1. 通過Redis的集合類型進行代理IP和URL的傳遞

# Summary Reference

---------

創建句柄

def make_redis_handler(): pool = redis.ConnectionPool(host=r_server['ip'], port=r_server['port'], password=r_server['passwd']) return redis.Redis(connection_pool=pool)

獲得句柄

def make_proxy_handler(): return make_redis_handler()

保存到指定的set下

def check_and_save(self, proxy): 'pass' self.redis_handler.sadd(r_server['s_name'], proxy)</code></pre>

2. 由于在驗證代理IP和使用封裝的get_url()函數的時候網絡IO較多,所以使用多線程(效果還是很明顯的)。

#Summary Reference

---------

def save_proxy_ip(self): 'pass' for proxy in self.proxy_ip: Thread(target=self.check_and_save, args=(proxy,)).start()

def get_url(url): 'pass' while True: 'pass' resp = request('get', url, headers=headers, proxies={'http': proxy}) 'pass'</code></pre>

項目地址

https://github.com/A1014280203/Ugly-Distributed-Crawler

 

 

項目主頁:http://www.baiduhome.net/lib/view/home/1491392874864 

 

 本文由用戶 ty014914 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!