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

專 欄

哇咔咔,学习过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的传递

# 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/PyCN/Ugly-Distributed-Crawler

本文分享自微信公众号 - Python中文社区(python-china)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-04-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏魏琼东

一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-实现字典的打印

系列回顾          从上一篇文章一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-实例一个模块(商品字典)开始我带领大...

22050
来自专栏晓晨的专栏

nodejs-ORM 操作数据库中间件waterline的使用

33930
来自专栏黑泽君的专栏

day56_BOS项目_08

  注意1:权限数据属于比较特殊的数据,系统在上线之后,必须先把权限数据给它初始化到数据库中去,然后这个系统才可以跑起来。如果不初始化权限数据的话,那么登录上系...

12220
来自专栏Kevin-ZhangCG

[ Java面试题 ]JavaWeb篇

44080
来自专栏蓝天

Linux下共享库(SO)有关的几个环境变量

Linux支持共享库已经有悠久的历史了,不再是什么新概念了。大家都知道如何编译、连接以及动态加载(dlopen/dlsym/dlclose) 共享库。但是,...

20210
来自专栏武军超python专栏

2018年8月5日对之前学习python中的问题总结

问题: linux中whereis和which的区别: whereis python     which python whereis是一个文件查找命令,...

11250
来自专栏尚国

ECShop全系列版本远程代码执行漏洞复现

问题发生在user.php的display函数,模版变量可控,导致注入,配合注入可达到远程代码执行

49930
来自专栏逆向技术

远程线程注入

一丶远程线程注入的讲解 远程线程注入的原理,我会写一个远程线程开发的例子 我们总共需要几步 /*1.查找窗口,获取窗口句柄*/ /*2.根据...

276100
来自专栏GreenLeaves

EF简介

EF:EF是 asp.net的一套ORM框架. ORM: 广义上:ORM指的是面向对象的模型和关系型数据库的数据库之间的相互转换; 狭义上:ORM可以被认为是,...

26980
来自专栏张善友的专栏

利用Windows性能计数器(PerformanceCounter)监控

一、概述 性能监视,是Windows NT提供的一种系统功能。Windows NT一直以来总是集成了性能监视工具,它提供有关操作系统当前运行状况的信息,针对各种...

44090

扫码关注云+社区

领取腾讯云代金券