Python开源:Ugly-Distributed-Crawler - 基于 Redis 实现的简单到爆的分布式爬虫

ty014914 4年前
   <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>