基於Redis的簡單分佈式爬蟲

Ugly-Distributed-Crawler

建議先大概瀏覽一下項目結構python

項目介紹

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

結構簡介

cooperator

協做模塊,用於爲Master&Worker模塊提供代理IP支持github

master

提取知足條件的文章url,並交給Worker進一步處理redis

worker

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

環境依賴

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)

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'

項目地址

https://github.com/A101428020...

有任何問題能夠與我聯繫(微信:smartseer)

相關文章
相關標籤/搜索