Python開源:Ugly-Distributed-Crawler - 基于 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
- 需要預先安裝MySQL-server 和 Redis-server.
- 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