首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
V2EX  ›  分享创造

再次分享 pyspider 爬虫框架

  binux · 2014-11-16 21:16:51 +08:00 · 32051 次点击
这是一个创建于 1250 天前的主题,其中的信息可能已经有所发展或是发生改变。
虽然 252 天前已经分享过,但是第二个里程碑commit数已经快到第一个的2倍了。。
功能上丰富了非常多,甚至已经部分超过原来不开源的版本了。。
请允许我再次分享一次 pyspider

github地址: https://github.com/binux/pyspider
demo地址: http://demo.pyspider.org/ (感谢@phoenixlzx

* python 脚本,可以用任何你喜欢的html解析包(内置 pyquery)
* WEB 界面编写调试脚本,起停脚本,监控执行状态,查看活动历史,获取结果产出
* 支持 MySQL, MongoDB, SQLite
* 支持抓取 JavaScript 的页面
* 组件可替换,支持单机/分布式部署,支持 Docker 部署
* 强大的调度控制

由于功能太多,更多请参考: https://github.com/binux/pyspider/wiki
pycon上的slide: http://www.slideshare.net/roybinux/pyspider-pycon2014beijing


95 回复  |  直到 2016-04-29 23:31:38 +08:00
    1
bitwing   2014-11-16 21:24:02 +08:00
今天总算看到干货了
    2
phoenixlzx   2014-11-16 21:29:07 +08:00
给点一个大大的赞
pycon 没见到真可惜...
    3
Rabbit52   2014-11-16 21:33:58 +08:00
牛逼,点赞!
    4
binux   2014-11-16 21:37:04 +08:00   ♥ 2
@phoenixlzx 给你单独讲一个?
    5
owlsec   2014-11-16 22:21:04 +08:00 via iPhone
赞(≧▽≦)
    6
Rico   2014-11-16 22:31:10 +08:00
赞,正好最近需要.
    7
zxy   2014-11-16 22:32:48 +08:00 via iPhone
赞一个,我特别关注的人😃
    8
pc10201   2014-11-16 22:34:59 +08:00
好像比scrapy强大很多,能给个对比评测就好了~
    9
qianlifeng   2014-11-16 22:42:14 +08:00
看起来很强大,已STAR
    10
binux   2014-11-16 22:42:49 +08:00   ♥ 3
@pc10201 主要是很多功能我现在还没闹不明白 scrapy 要怎么实现,如果我出评测的话别人一定说“那是你不会用”。。

而且设计思路上,pyspider 已经是一个架构了,scrapy 是一个包。
就我对 scrapy 的理解

* pyspider 使用 JSON ,不需要预先定义 Item
* 使用真的消息队列,而不需要 Pipeline
* 有真正的链接库,而不是 set集合,能对链接进行重抓调度,抓取更新更灵活方便
* 面向数据包协议编程,而不是面向接口。当需求不满足的时候,甚至可以用其他语言替换某些模块
    11
regmach   2014-11-16 23:14:39 +08:00
已收藏
已感谢
    12
reverland   2014-11-16 23:17:43 +08:00
readme里https://github.com/binux/pyspider/wiki/Running-pyspider-with-Docker写成https://github.com/binux/pyspider/wiki/Run-pyspider-with-Docker了

好棒!在docker中试下……
    13
benjiam   2014-11-16 23:41:15 +08:00 via iPad
爬虫的几个难点, 链接保存如何,快速检索出已经下载过的链接,bloomfliter太简单了,不用habse这种又貌似没有扩张性,如何区分现在很多带随机数的链接。javascrip生成的页面,js动态跳转,,由ajax和后端交互生成的页面抓起。如果防止对方服务器过载,防止对方主动屏蔽,。 这是我几年前玩的时候遇到的问题,都没解决得太好。
    14
wibile   2014-11-16 23:41:22 +08:00
听了你的演讲,东西很不错。不过个人觉得还是scrapy更完善,更强大一些。其实一般的爬虫并不难,用正则手写一个也能跑,而scrapy借鉴django的pipeline和middleware更灵活。对于你的web端自学习抓取数据的,我印象中scrapy的开发团队早就做了类似的东西。
还是那句话,一般的爬虫不难,难的是怎么应付现在的各种反扒机制:高阶js,block IP,captcha,cookie session认证。。。
消息队列用啥?rabbitmq?zeromq?没看到啊
    15
binux   2014-11-16 23:44:54 +08:00
数了下
v0.20 比 v0.10 commit多了3.6倍
代码增加了60%
    16
binux   2014-11-16 23:53:53 +08:00
@benjiam 1亿以下链接不需要bloomfliter,任何数据库直接查就够。pyspider 是由脚本控制 follow 什么链接,如何区分带随机数的链接在写脚本的时候就能搞定。

@wibile pyspider 不只是pipeline和middleware这么简单,它是真正的队列,真正异构组件可替换。
框架解决的是共性问题,而反扒利用的恰恰是与别人不同。
比如 block IP,架构上是在fetcher前面加一个squid,给squid加大量的代理。所以你会看到我 API 里面有一个参数是是否使用代理。
比如 douban 反反爬,并不是所有的cookie都需要,这样反而让对方知道你是谁。

消息队列是可替换的啊。。只要实现成内置Queue的接口,用什么都一样。比如 libs/rabbitmq.py
    17
benjiam   2014-11-16 23:57:11 +08:00 via iPad
不知道这个框架是如何解决的
    18
binux   2014-11-17 00:03:39 +08:00
@benjiam 链接过2亿,请重写 scheduler
带随机数在脚本中自己去掉再提交
js动态可以在 JavaScript 抓取时指定一段js代码,模拟点击动作
防止过载有令牌桶流量控制

反爬请参照上一个回复
    19
phoenixlzx   2014-11-17 00:35:02 +08:00 via Android   ♥ 1
@binux 不敢当。。有空一起出来玩罢
    20
benjiam   2014-11-17 07:36:45 +08:00 via Android
@binux 这是手动版本的。百度或者Google怎么办?几万个网站,一个个写匹配js吗?随机URL也一样
    21
kslr   2014-11-17 08:42:33 +08:00
里面好多我想要的东西,开始拆 T_T
    22
forever139   2014-11-17 09:05:55 +08:00
@binux 第一次分享出来的时候,就拉到本地测试过,环境啥的都好了,就是页面没反应,然后搞了几个月的scrapy,这次再试试。
    23
binux   2014-11-17 09:33:06 +08:00
@benjiam pyspider 不是通用爬虫啊,你要是想知道通用爬虫怎么解决,来百度我告诉你:)

@forever139 开个ISSUE啊。。ISSUE对项目帮助很大的。。
    24
Jaycee   2014-11-17 09:37:53 +08:00
赞。。。
    25
xujialiang   2014-11-17 09:42:49 +08:00
不得不说!!!好东西啊!!!!!!!
    26
zyx89513   2014-11-17 09:51:17 +08:00
我用过 Portia, 请问和Portia比有哪些不同呢?
    27
laike9m   2014-11-17 09:56:50 +08:00
其实你该申请主题演讲的。。
    28
s12348765   2014-11-17 09:58:08 +08:00
收藏下。。。
    29
sohoer   2014-11-17 10:22:10 +08:00
看到爬虫我就来劲!呵呵!不错
    30
binux   2014-11-17 10:36:29 +08:00
@zyx89513
没用过 Portia,看介绍,感觉不是一层的东西,Portia 更像一个规则配置器,下层还是跑的 scrapy。
规则上,还是 http://blog.binux.me/2014/07/how-to-extract-data-from-web/ 里面,“xpath / css选择器 / 正则表达式” 这一层的东西,只是用表单简化配置罢了。

pyspider 虽然也有 自动生成css选择器的辅助工具,但是为了灵活性,或者说,还没有做这一层。
    31
yakczh   2014-11-17 11:38:15 +08:00
-r requirements.txt
这里面内容是啥?
    32
binux   2014-11-17 11:39:24 +08:00
@laike9m 我觉得介绍一个东西,10分钟提起听讲者兴趣就好了。。又不是经验分享,需要把问题说清楚。。
    33
binux   2014-11-17 11:39:37 +08:00
@yakczh 依赖包
    34
laike9m   2014-11-17 11:43:30 +08:00
@binux 也对
    35
glongzh   2014-11-17 11:48:36 +08:00
上HN了,赞一下!
    36
yakczh   2014-11-17 11:51:56 +08:00
http://localhost:5000/debug 这是python的在线编辑器? 通过后台 修改python代码,这个怎么调试呢?
    37
binux   2014-11-17 12:21:40 +08:00
@yakczh 后台修改的是pyspider的组件代码?
    38
shoumu   2014-11-17 12:39:06 +08:00
能不能更多地分享一些那两个抽取demo的内容
    39
binux   2014-11-17 12:43:00 +08:00
@shoumu 你是指how,还是指demo的数据?
    40
jprovim   2014-11-17 13:19:17 +08:00
@binux 恭喜,上HN頭條了.
    41
wusuopuBUPT   2014-11-17 13:32:43 +08:00
@phoenixlzx 好啊-_-
    42
wusuopuBUPT   2014-11-17 13:33:43 +08:00
牛!
    43
hustlzp   2014-11-17 13:39:01 +08:00
碉堡了!
    44
withrock   2014-11-17 14:53:48 +08:00
我觉得更牛逼的是你博客里写的那个“如何从 WEB 页面中提取信息”
http://blog.binux.me/2014/07/how-to-extract-data-from-web/
micro-data
    45
Yiph   2014-11-17 14:54:16 +08:00
MARK
    46
binux   2014-11-17 15:14:06 +08:00
@withrock micro-data目前需要在html里面加标签,而且太理想了。。
    47
staticor   2014-11-17 15:17:56 +08:00
mark/ 对比着scrapy学习学习。。。
    48
geew   2014-11-17 15:40:17 +08:00
已收藏 好东西 不过这star数也是醉了


可能是我看的原因...
    49
Mrabbit   2014-11-17 16:31:27 +08:00
谢谢分享,已star
    50
zhchyu999   2014-11-17 16:35:09 +08:00
好东西
    51
oaix   2014-11-17 17:09:19 +08:00
上HN首页了,恭喜恭喜
    52
yanchao7511461   2014-11-17 19:37:52 +08:00
好东西啊 好东西
    53
shoumu   2014-11-17 21:22:36 +08:00
@binux how
    54
binux   2014-11-17 21:43:17 +08:00
@shoumu 能说的就是blog写的那些了。。
    55
qloog   2014-11-17 22:30:51 +08:00
看起来很牛掰的东西~
    56
binux   2014-11-18 16:33:08 +08:00
HN 上有人提出要测性能。。于是。。
多线程下 5700 pages/min,作为对比 scrapy bench 4800 pages/min
多进程都不想欺负它了。。

PS:我用了无限制消息队列,流量直接往下一个模块上压。。由于不清楚 scrapy 的实现其实结果不好说。。
    57
crossmaya   2014-11-20 14:18:24 +08:00
windows上跑不起来,我只是过来说一声。。
    58
binux   2014-11-20 14:32:15 +08:00
@crossmaya 我没有windows,前面有人报过issue,然后可以了啊
    59
crossmaya   2014-11-20 14:40:36 +08:00
@binux 我从拉一下代码吧,昨天试过,启动后python进程就出错退出了,出错信息具体没看,我在试试。
    60
crossmaya   2014-11-20 14:43:13 +08:00
看了一下,可能pycurl模块的问题!
    61
idy0013   2014-11-20 16:33:46 +08:00
做一个爬虫社区 大家可以贡献代码,可以获取爬到的数据 有偿获取数据给贡献者
    62
benjiam   2014-11-23 00:29:11 +08:00 via iPad
@binux 仔细看了下你的URL是存数据库的,.....太过了,靠数据库主机键来区别啊
    63
fly51fly   2014-11-23 07:07:11 +08:00
原来是同校小友!有机会多交流交流……要是pyspider的文档再完善一点就好了,尤其是自定义配置这块;Mac上试了一下,run.py后5000能访问,不过debug的任务测试run不动,看调试信息报“Uncaught TypeError: Cannot read property 'indexOf' of undefined”,runtest也有错(太长避免撑爆版面先不贴了),还没顾上仔细看
    64
binux   2014-11-23 10:06:25 +08:00
@benjiam 本来就是靠 taskid,taskid是定长的,来区别的啊
@fly51fly 你什么环境?
    65
benjiam   2014-11-23 22:19:19 +08:00
@binux 我的意思 网站上的url 你认为1亿以下可以存数据库。这样是可以的,但是这样任何url是否已经存在需要靠一次db io.这样的效率很低,如果存在内存用map,这样的结构。内存消耗又非常大。bloomfliter 又有可能丢失某些url. hbase 貌似是google 的解决方案,但是没实践过
    66
binux   2014-11-23 22:30:05 +08:00   ♥ 1
@benjiam 我觉得没有必要,pyspider是人工写模板的,而不是说页面上所有的链接都需要去检测一次是否在库中。实际上只有列表页有这样的检测。

再加上需要做按照时间判断是否重抓取的检测,bloomfilter 是不够的,还是得查库。
    67
fly51fly   2014-11-24 06:38:25 +08:00
我的环境:Mac OS X 10.9.5 下 Python 2.7.5
    68
aksoft   2014-12-05 14:40:37 +08:00
真高级啊...
    69
fumer   2014-12-24 23:19:01 +08:00
@binux 是作者啊。不错不错。在so上看到了作者的英文也是刚刚的。
    70
kenvinqu   2015-01-26 22:17:14 +08:00
太棒了。我在测试,赞一个。 @binux
    71
gogobeijing   2015-02-02 19:34:52 +08:00
mac下 Python 2.7.5,执行setup.py报错,如下:

Searching for six>=1.8.0

Reading http://pypi.python.org/simple/six/

Download error: [Errno 60] Operation timed out -- Some packages may not be found!

Couldn't find index page for 'six' (maybe misspelled?)

Scanning index of all packages (this may take a while)

Reading http://pypi.python.org/simple/

Download error: [Errno 60] Operation timed out -- Some packages may not be found!

No local packages or download links found for six>=1.8.0

error: Could not find suitable distribution for Requirement.parse('six>=1.8.0')
    72
binux   2015-02-02 19:41:44 +08:00
@gogobeijing 能自己读一下报错吗
    73
gogobeijing   2015-02-02 21:05:26 +08:00
缺 six-1.8.0 ,我在 http://pypi.python.org/simple/six/ 上找到 six-1.8.0.tar.gz ,可以自己下载吗?
执行自动安装就是一直说timed out呢。
    74
laotaitai   2015-03-29 21:58:11 +08:00
我觉得这pyspider至少在开发测试时用pyspider, 是坨屎. 另外, 文档写得也像坨屎. 我认为Scrapy比你设计更加先进和更加人性化, 你这pyspider连windows版的火车头的1%都不如. 我自己也尝试设计过爬虫框架, 一开始也是觉得scrapy是坨屎, 后面越来越觉得scrapy设计非常先进.
    75
binux   2015-03-29 22:00:26 +08:00
@laotaitai 你不具体说屎在哪,别人怎么会明白?
    76
laoyuan   2015-04-03 14:45:51 +08:00
快被我自己写的山寨PHP爬虫搞疯了,pypy快给我爬起~
    77
laoyuan   2015-04-03 14:56:50 +08:00
呃,还要先去学学Python。。
    78
monsabre   2015-04-24 15:16:43 +08:00
低逼格的百毒找楼主这样的脑残写出锁死浏览器毒一坨屎

很正常
    79
binux   2015-04-24 15:33:12 +08:00
@Livid 举报 @monsabre 「人身攻击、仇恨、暴力、侮辱性的言辞」
    80
monsabre   2015-04-24 19:05:29 +08:00
@Livid 举报 @binux

1.在Livid和聚合数据矛盾时候明显偏向聚合 同时攻击Livid
2.写了一坨屎 导致偶浏览器死掉
    81
laotaitai   2015-04-25 00:07:00 +08:00
@monsabre 哎, 兄弟, 咱们可以骂他代码烂, 不能进行人身攻击哈, 毕竟我们用它爬虫又没给钱呢.
    82
Livid   V2EX Moderator   2015-04-25 06:24:58 +08:00
@binux 多谢举报。那个账号已经被 Deactivate。一些无意义的回复会被清理。
    83
laoyuan   2015-04-27 15:34:14 +08:00
LZ啊,对于那种列表性质的页面,一次crawl() 得到多条result 的情况,只能override on_result() 么?有没有方便一点的办法入库多条result 呢?
    84
laoyuan   2015-04-28 12:38:50 +08:00
太好了,在Tutorial Level 1 里碰到的问题今天看Level 2 就解决了
    85
laoyuan   2015-04-28 16:22:20 +08:00
http://demo.pyspider.org/debug/tutorial_twitch
parse_rendered_page() 报 error: error
    86
laoyuan   2015-04-29 15:41:43 +08:00
原来一次crawl() 得到多条result 用message 来解决,今天正式学完文档了。学习笔记我发了个帖子算是反馈吧:/t/187256
    87
laoyuan   2015-04-29 15:43:20 +08:00
@Livid 上一楼全角冒号后面没解析出来 /t/187256
    88
694380889   2015-04-30 15:00:52 +08:00
这个可以爬到哪些东西 谁能具体说下 只能爬到可以看见的东西吗
    89
binux   2015-04-30 15:07:47 +08:00
@694380889 确实只能爬到可以「看见」的东西,这个「看见」是 http 层的「看见」。
    90
WeiEast   2015-08-15 22:00:19 +08:00
用js 去click() 提交表单不起作用。是不是不支持js点击事件。我的代码 http://demo.pyspider.org/debug/agoda
    91
yuwei162   2015-09-10 20:40:09 +08:00
@binux 你好,最近使用 pyspider ,碰到一个问题:
debug 模式下存在的文件,在 running 的时候提示文件不存在。
代码示例如下:
file = "/home/pyspider/myseeds"
file2 = "/home/pyspider/next"

@every (minutes=24 * 60 )
def on_start (self ):
print os.getcwd ()
print os.path.dirname (self.file )
print "file: exist=%s" % os.path.exists (self.file.strip ())
print os.path.abspath (self.file )

#open (self.file2, 'w') #通过该模式写文件,在 runing 中可以被识别出来
print "file2: exist=%s" % os.path.exists (self.file2 )
print os.path.abspath (self.file2 )
debug 模式下输出为:
/home/pyspider
/home/pyspider
file: exist=True
/home//pyspider/myseeds
file2: exist=True
/home/pyspider/next
running 的时候输出为:
/home/pyspider
/home/pyspider
file: exist=False
/home/pyspider/myseeds
file2: exist=True
/home/pyspider/next
不知道问题是否说明白了,还望帮忙看一下,谢谢。
    92
binux   2015-09-10 20:42:44 +08:00
@yuwei162 debug 时是由 WEBUI 执行的脚本,而正式执行时,是由 processor 执行的脚本,他们可能不在同一台机器上.
    93
yuwei162   2015-09-12 16:37:38 +08:00
@binux 是啊!一语道破天机,谢谢。
对了,我最近一直都在迷惑:
第一:如果不通过 ui ,是否可以直接运行脚本提交任务?
第二:如果部署多个 processor 的话,如果我像上面执行一个任务的话,是不能提前预选 processor 吧。
感觉我提的两个问题是一个,还请帮忙解答下,谢谢。
    94
binux   2015-09-12 17:27:07 +08:00
@yuwei162
1 、什么意思?你这里的任务是 task 还是 project ?现在只能通过模拟 http 请求,或者直接插数据库(记得通知 scheduler 更新),才能通过脚本进行。
2 、不能,本来就是分布式设计,如果要执行 processor ,需要脚本获取 processor 的部署信息。
    95
explist   2016-04-29 23:31:38 +08:00
@binux 网易云音乐怎么抓取?
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   2191 人在线   最高记录 3541   ·  
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.0 · 23ms · UTC 00:57 · PVG 08:57 · LAX 17:57 · JFK 20:57
♥ Do have faith in what you're doing.
沪ICP备16043287号-1