Python开源:Ugly-Distributed-Crawler - 基于 Redis 实现的简单到爆的分布式爬虫
ty014914
8年前
<h2>Ugly-Distributed-Crawler</h2> <h2>简陋的分布式爬虫</h2> <p>新手向,基于Redis构建的分布式爬虫。 以爬取考研网的贴子为例,利用 PyQuery, lxml 进行解析,将符合要求的文章文本存入MySQ数据库中。</p> <h2>结构简介</h2> <p>cooperator</p> <p>协作模块,用于为Master&Worker模块提供代理IP支持</p> <p>master</p> <p>提取满足条件的文章url,并交给Worker进一步处理</p> <p>Worker</p> <p>解析文章内容,将符合要求的存入数据库</p> <h2>环境依赖</h2> <p>sqlalchemy => 1.0.13</p> <p>pyquery => 1.2.17</p> <p>requests => 2.12.3</p> <p>redis => 2.10.5</p> <p>lxml => 3.6.0</p> <ol> <li>需要预先安装MySQL-server 和 Redis-server.</li> <li>MySQL中应有名为kybsrc的数据库,且该数据库包含一个名为posts的表,拥有num(INT AUTO_INCREMENT)和post(TEXT)两个字段。</li> </ol> <h2>如何启动</h2> <p>0. 先配置好各模块所引用的配置文件</p> <p>1. 为了更好地运行,cooperator/start.py 应提前开始并完成一次工作函数执行</p> <p>第一次执行完后,每五分钟运行一次工作函数</p> <p>2. 启动 master/start.py</p> <p>默认只执行一次</p> <p>3. 启动 worker/start.py</p> <p>默认循环监听是否有新的URL待解析</p> <h2>核心点说明</h2> <p>1. 通过Redis的集合类型进行代理IP和URL的传递</p> <pre> <code class="language-python"># 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> <p>2. 由于在验证代理IP和使用封装的get_url()函数的时候网络IO较多,所以使用多线程(效果还是很明显的)。</p> <pre> <code class="language-python">#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> <h2>项目地址</h2> <p><a href="/misc/goto?guid=4959746772087295591" rel="nofollow,noindex">https://github.com/A1014280203/Ugly-Distributed-Crawler</a></p> <p> </p> <p> </p> <p>项目主页:<a href="http://www.open-open.com/lib/view/home/1491392874864 ">http://www.open-open.com/lib/view/home/1491392874864 </a></p> <p> </p>