专栏名称: Python中文社区
致力于成为国内最好的Python开发者学习交流平台,这里有关于Python的国内外最新消息,每日推送有趣有料的技术干货和社区动态。 官方网站:www.python-cn.com
目录
相关文章推荐
狐狸说安全  ·  4W,建议师傅们冲一冲这个方向!! ·  2 天前  
Python爱好者社区  ·  深度学习“四大名著”发布!Python、机器 ... ·  4 天前  
Python爱好者社区  ·  刷新三观,深圳某公司重新定义八小时工作制 ·  4 天前  
Python爱好者社区  ·  部门准备解散了。 ·  6 天前  
Python爱好者社区  ·  这就是算法的天花板。。 ·  6 天前  
51好读  ›  专栏  ›  Python中文社区

简陋的分布式爬虫(附项目代码地址)

Python中文社区  · 公众号  · Python  · 2017-04-05 23:09

正文

專 欄



哇咔咔,学习过C, C++, Python, 了解java,html, javascript基础。其中就Python而言,自己写过简单的博客(注册,登录,发帖,删帖,评论),写过几个爬虫。

新手向,基于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的传递

  1. # Summary Reference

  2. # ---------

  3. # 创建句柄

  4. def make_redis_handler():

  5.    pool = redis.ConnectionPool(host=r_server['ip'], port=r_server['port'], password=r_server['passwd'])

  6.    return redis.Redis(connection_pool=pool)


  7. # 获得句柄

  8. def make_proxy_handler():

  9.    return make_redis_handler()


  10. # 保存到指定的set下

  11. def check_and_save(self, proxy):

  12. 'pass'

  13.   self.redis_handler.sadd(r_server['s_name'], proxy)

2. 由于在验证代理IP和使用封装的get_url()函数的时候网络IO较多,所以使用多线程(效果还是很明显的)。

  1. #Summary Reference

  2. #---------

  3. def save_proxy_ip(self):

  4.    'pass'

  5.    for proxy in self.proxy_ip:

  6.        Thread(target=self.check_and_save, args=(proxy,)).start()


  7. def get_url(url):

  8.    'pass'

  9.    while True:

  10.    'pass'

  11.        resp = request('get', url, headers=headers, proxies={'http': proxy})

  12.    'pass'

本文项目地址:https://github.com/PyCN/Ugly-Distributed-Crawler


长按扫描加入Python圈子

获取更多内部消息!

Python 中 文 社 区

Python中文开发者的精神家园

合作、投稿请联系微信:

pythonpost

— 人生苦短,我用Python —




本文为作者原创作品,未经作者授权同意禁止转载

点击阅读原文可搜索历史文章

推荐文章
狐狸说安全  ·  4W,建议师傅们冲一冲这个方向!!
2 天前
Python爱好者社区  ·  刷新三观,深圳某公司重新定义八小时工作制
4 天前
Python爱好者社区  ·  部门准备解散了。
6 天前
Python爱好者社区  ·  这就是算法的天花板。。
6 天前
爱奇艺晓松奇谈  ·  文艺青年矮大紧的一周—琴棋书画、读书访友
7 年前
马蜂窝旅游  ·  你以为你以为的是你以为的沙县小吃?
7 年前