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

再次分享 pyspider 爬虫框架

  binux ·
binux · 2014-11-16 21:16:51 +08:00 · 40227 次点击
这是一个创建于 3686 天前的主题,其中的信息可能已经有所发展或是发生改变。
虽然 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

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

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

* pyspider 使用 JSON ,不需要预先定义 Item
* 使用真的消息队列,而不需要 Pipeline
* 有真正的链接库,而不是 set集合,能对链接进行重抓调度,抓取更新更灵活方便
* 面向数据包协议编程,而不是面向接口。当需求不满足的时候,甚至可以用其他语言替换某些模块
regmach
    11
regmach  
   2014-11-16 23:14:39 +08:00
已收藏
已感谢
reverland
    12
reverland  
   2014-11-16 23:17:43 +08:00
benjiam
    13
benjiam  
   2014-11-16 23:41:15 +08:00 via iPad
爬虫的几个难点, 链接保存如何,快速检索出已经下载过的链接,bloomfliter太简单了,不用habse这种又貌似没有扩张性,如何区分现在很多带随机数的链接。javascrip生成的页面,js动态跳转,,由ajax和后端交互生成的页面抓起。如果防止对方服务器过载,防止对方主动屏蔽,。 这是我几年前玩的时候遇到的问题,都没解决得太好。
wibile
    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?没看到啊
binux
    15
binux  
OP
   2014-11-16 23:44:54 +08:00
数了下
v0.20 比 v0.10 commit多了3.6倍
代码增加了60%
binux
    16
binux  
OP
   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
benjiam
    17
benjiam  
   2014-11-16 23:57:11 +08:00 via iPad
不知道这个框架是如何解决的
binux
    18
binux  
OP
   2014-11-17 00:03:39 +08:00
@benjiam 链接过2亿,请重写 scheduler
带随机数在脚本中自己去掉再提交
js动态可以在 JavaScript 抓取时指定一段js代码,模拟点击动作
防止过载有令牌桶流量控制

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

@forever139 开个ISSUE啊。。ISSUE对项目帮助很大的。。
Jaycee
    24
Jaycee  
   2014-11-17 09:37:53 +08:00
赞。。。
xujialiang
    25
xujialiang  
   2014-11-17 09:42:49 +08:00
不得不说!!!好东西啊!!!!!!!
zyx89513
    26
zyx89513  
   2014-11-17 09:51:17 +08:00
我用过 Portia, 请问和Portia比有哪些不同呢?
laike9m
    27
laike9m  
   2014-11-17 09:56:50 +08:00
其实你该申请主题演讲的。。
s12348765
    28
s12348765  
   2014-11-17 09:58:08 +08:00
收藏下。。。
sohoer
    29
sohoer  
   2014-11-17 10:22:10 +08:00
看到爬虫我就来劲!呵呵!不错
binux
    30
binux  
OP
   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选择器的辅助工具,但是为了灵活性,或者说,还没有做这一层。
yakczh
    31
yakczh  
   2014-11-17 11:38:15 +08:00
-r requirements.txt
这里面内容是啥?
binux
    32
binux  
OP
   2014-11-17 11:39:24 +08:00
@laike9m 我觉得介绍一个东西,10分钟提起听讲者兴趣就好了。。又不是经验分享,需要把问题说清楚。。
binux
    33
binux  
OP
   2014-11-17 11:39:37 +08:00
@yakczh 依赖包
laike9m
    34
laike9m  
   2014-11-17 11:43:30 +08:00
@binux 也对
glongzh
    35
glongzh  
   2014-11-17 11:48:36 +08:00
上HN了,赞一下!
yakczh
    36
yakczh  
   2014-11-17 11:51:56 +08:00
http://localhost:5000/debug 这是python的在线编辑器? 通过后台 修改python代码,这个怎么调试呢?
binux
    37
binux  
OP
   2014-11-17 12:21:40 +08:00
@yakczh 后台修改的是pyspider的组件代码?
shoumu
    38
shoumu  
   2014-11-17 12:39:06 +08:00
能不能更多地分享一些那两个抽取demo的内容
binux
    39
binux  
OP
   2014-11-17 12:43:00 +08:00
@shoumu 你是指how,还是指demo的数据?
jprovim
    40
jprovim  
   2014-11-17 13:19:17 +08:00
@binux 恭喜,上HN頭條了.
wusuopuBUPT
    41
wusuopuBUPT  
   2014-11-17 13:32:43 +08:00
@phoenixlzx 好啊-_-
wusuopuBUPT
    42
wusuopuBUPT  
   2014-11-17 13:33:43 +08:00
牛!
hustlzp
    43
hustlzp  
   2014-11-17 13:39:01 +08:00
碉堡了!
withrock
    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
Yiph
    45
Yiph  
   2014-11-17 14:54:16 +08:00
MARK
binux
    46
binux  
OP
   2014-11-17 15:14:06 +08:00
@withrock micro-data目前需要在html里面加标签,而且太理想了。。
staticor
    47
staticor  
   2014-11-17 15:17:56 +08:00
mark/ 对比着scrapy学习学习。。。
geew
    48
geew  
   2014-11-17 15:40:17 +08:00
已收藏 好东西 不过这star数也是醉了


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

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

再加上需要做按照时间判断是否重抓取的检测,bloomfilter 是不够的,还是得查库。
fly51fly
    67
fly51fly  
   2014-11-24 06:38:25 +08:00
我的环境:Mac OS X 10.9.5 下 Python 2.7.5
aksoft
    68
aksoft  
   2014-12-05 14:40:37 +08:00
真高级啊...
fumer
    69
fumer  
   2014-12-24 23:19:01 +08:00
@binux 是作者啊。不错不错。在so上看到了作者的英文也是刚刚的。
kenvinqu
    70
kenvinqu  
   2015-01-26 22:17:14 +08:00
太棒了。我在测试,赞一个。 @binux
gogobeijing
    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')
binux
    72
binux  
OP
   2015-02-02 19:41:44 +08:00
@gogobeijing 能自己读一下报错吗
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呢。
laotaitai
    74
laotaitai  
   2015-03-29 21:58:11 +08:00
我觉得这pyspider至少在开发测试时用pyspider, 是坨屎. 另外, 文档写得也像坨屎. 我认为Scrapy比你设计更加先进和更加人性化, 你这pyspider连windows版的火车头的1%都不如. 我自己也尝试设计过爬虫框架, 一开始也是觉得scrapy是坨屎, 后面越来越觉得scrapy设计非常先进.
binux
    75
binux  
OP
   2015-03-29 22:00:26 +08:00
@laotaitai 你不具体说屎在哪,别人怎么会明白?
laoyuan
    76
laoyuan  
   2015-04-03 14:45:51 +08:00
快被我自己写的山寨PHP爬虫搞疯了,pypy快给我爬起~
laoyuan
    77
laoyuan  
   2015-04-03 14:56:50 +08:00
呃,还要先去学学Python。。
monsabre
    78
monsabre  
   2015-04-24 15:16:43 +08:00
低逼格的百毒找楼主这样的脑残写出锁死浏览器毒一坨屎

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

1.在Livid和聚合数据矛盾时候明显偏向聚合 同时攻击Livid
2.写了一坨屎 导致偶浏览器死掉
laotaitai
    81
laotaitai  
   2015-04-25 00:07:00 +08:00
@monsabre 哎, 兄弟, 咱们可以骂他代码烂, 不能进行人身攻击哈, 毕竟我们用它爬虫又没给钱呢.
Livid
    82
Livid  
MOD
   2015-04-25 06:24:58 +08:00
@binux 多谢举报。那个账号已经被 Deactivate。一些无意义的回复会被清理。
laoyuan
    83
laoyuan  
   2015-04-27 15:34:14 +08:00
LZ啊,对于那种列表性质的页面,一次crawl() 得到多条result 的情况,只能override on_result() 么?有没有方便一点的办法入库多条result 呢?
laoyuan
    84
laoyuan  
   2015-04-28 12:38:50 +08:00
太好了,在Tutorial Level 1 里碰到的问题今天看Level 2 就解决了
laoyuan
    85
laoyuan  
   2015-04-28 16:22:20 +08:00
http://demo.pyspider.org/debug/tutorial_twitch
parse_rendered_page() 报 error: error
laoyuan
    86
laoyuan  
   2015-04-29 15:41:43 +08:00
原来一次crawl() 得到多条result 用message 来解决,今天正式学完文档了。学习笔记我发了个帖子算是反馈吧:/t/187256
laoyuan
    87
laoyuan  
   2015-04-29 15:43:20 +08:00
@Livid 上一楼全角冒号后面没解析出来 /t/187256
694380889
    88
694380889  
   2015-04-30 15:00:52 +08:00
这个可以爬到哪些东西 谁能具体说下 只能爬到可以看见的东西吗
binux
    89
binux  
OP
   2015-04-30 15:07:47 +08:00
@694380889 确实只能爬到可以「看见」的东西,这个「看见」是 http 层的「看见」。
WeiEast
    90
WeiEast  
   2015-08-15 22:00:19 +08:00
用js 去click() 提交表单不起作用。是不是不支持js点击事件。我的代码 http://demo.pyspider.org/debug/agoda
yuwei162
    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
不知道问题是否说明白了,还望帮忙看一下,谢谢。
binux
    92
binux  
OP
   2015-09-10 20:42:44 +08:00
@yuwei162 debug 时是由 WEBUI 执行的脚本,而正式执行时,是由 processor 执行的脚本,他们可能不在同一台机器上.
yuwei162
    93
yuwei162  
   2015-09-12 16:37:38 +08:00
@binux 是啊!一语道破天机,谢谢。
对了,我最近一直都在迷惑:
第一:如果不通过 ui ,是否可以直接运行脚本提交任务?
第二:如果部署多个 processor 的话,如果我像上面执行一个任务的话,是不能提前预选 processor 吧。
感觉我提的两个问题是一个,还请帮忙解答下,谢谢。
binux
    94
binux  
OP
   2015-09-12 17:27:07 +08:00
@yuwei162
1 、什么意思?你这里的任务是 task 还是 project ?现在只能通过模拟 http 请求,或者直接插数据库(记得通知 scheduler 更新),才能通过脚本进行。
2 、不能,本来就是分布式设计,如果要执行 processor ,需要脚本获取 processor 的部署信息。
explist
    95
explist  
   2016-04-29 23:31:38 +08:00
@binux 网易云音乐怎么抓取?
Muse666
    96
Muse666  
   2019-04-15 11:07:48 +08:00
楼主 怎么利用 pyspider 对同一个网页实现每隔 15min 抓取一次数据啊 求翻牌 万很感谢
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5784 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 28ms · UTC 06:26 · PVG 14:26 · LAX 22:26 · JFK 01:26
Developed with CodeLauncher
♥ Do have faith in what you're doing.