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

再次分享 pyspider 爬虫框架

  binux
binux 2014-11-16 21:16:51 +08:00 40916 次点击
这是一个创建于 4030 天前的主题,其中的信息可能已经有所发展或是发生改变。
虽然 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 没见到真可惜...
tunetoystory
    3
tunetoystory  
   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 nbsp;
   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
不得不说!!!好东西啊!!!!!!!
dofaith09
    26
dofaith09  
   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
PRO
   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     Solana     2531 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 31ms UTC 10:10 PVG 18:10 LAX 02:10 JFK 05:10
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86