爱意满满的作品展示区。
binux

再次分享 pyspider 爬虫框架

  binux ·
binux · Nov 16, 2014 · 42182 views
This topic created in 4375 days ago, the information mentioned may be changed or developed.
虽然 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 replies  •  2019-04-15 11:07:48 +08:00
bitwing
bitwing
Nov 16, 2014
1
今天总算看到干货了
phoenixlzx
phoenixlzx
Nov 16, 2014
2
给点一个大大的赞
pycon 没见到真可惜...
tunetoystory
tunetoystory
Nov 16, 2014
3
牛逼,点赞!
binux
binux
OP
Nov 16, 2014❤️2
4
@phoenixlzx 给你单独讲一个?
owlsec
owlsec
Nov 16, 2014 via iPhone
5
赞(≧▽≦)
Rico
Rico
Nov 16, 2014
6
赞,正好最近需要.
zxy
zxy
Nov 16, 2014 via iPhone
7
赞一个,我特别关注的人😃
pc10201
pc10201
Nov 16, 2014
8
好像比scrapy强大很多,能给个对比评测就好了~
qianlifeng
qianlifeng
Nov 16, 2014
9
看起来很强大,已STAR
binux
binux
OP
Nov 16, 2014❤️3
10
@pc10201 主要是很多功能我现在还没闹不明白 scrapy 要怎么实现,如果我出评测的话别人一定说“那是你不会用”。。

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

* pyspider 使用 JSON ,不需要预先定义 Item
* 使用真的消息队列,而不需要 Pipeline
* 有真正的链接库,而不是 set集合,能对链接进行重抓调度,抓取更新更灵活方便
* 面向数据包协议编程,而不是面向接口。当需求不满足的时候,甚至可以用其他语言替换某些模块
regmach
regmach
Nov 16, 2014
11
已收藏
已感谢
benjiam
benjiam
Nov 16, 2014 via iPad
13
爬虫的几个难点, 链接保存如何,快速检索出已经下载过的链接,bloomfliter太简单了,不用habse这种又貌似没有扩张性,如何区分现在很多带随机数的链接。javascrip生成的页面,js动态跳转,,由ajax和后端交互生成的页面抓起。如果防止对方服务器过载,防止对方主动屏蔽,。 这是我几年前玩的时候遇到的问题,都没解决得太好。
wibile
wibile
Nov 16, 2014
14
听了你的演讲,东西很不错。不过个人觉得还是scrapy更完善,更强大一些。其实一般的爬虫并不难,用正则手写一个也能跑,而scrapy借鉴django的pipeline和middleware更灵活。对于你的web端自学习抓取数据的,我印象中scrapy的开发团队早就做了类似的东西。
还是那句话,一般的爬虫不难,难的是怎么应付现在的各种反扒机制:高阶js,block IP,captcha,cookie session认证。。。
消息队列用啥?rabbitmq?zeromq?没看到啊
binux
binux
OP
Nov 16, 2014
15
数了下
v0.20 比 v0.10 commit多了3.6倍
代码增加了60%
binux
binux
OP
Nov 16, 2014
16
@benjiam 1亿以下链接不需要bloomfliter,任何数据库直接查就够。pyspider 是由脚本控制 follow 什么链接,如何区分带随机数的链接在写脚本的时候就能搞定。

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

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

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

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

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


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

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

再加上需要做按照时间判断是否重抓取的检测,bloomfilter 是不够的,还是得查库。
fly51fly
fly51fly
Nov 24, 2014
67
我的环境:Mac OS X 10.9.5 下 Python 2.7.5
aksoft
aksoft
Dec 5, 2014
68
真高级啊...
fumer
fumer
Dec 24, 2014
69
@binux 是作者啊。不错不错。在so上看到了作者的英文也是刚刚的。
kenvinqu
kenvinqu
Jan 26, 2015
70
太棒了。我在测试,赞一个。 @binux
gogobeijing
gogobeijing
Feb 2, 2015
71
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
binux
OP
Feb 2, 2015
72
@gogobeijing 能自己读一下报错吗
gogobeijing
gogobeijing
Feb 2, 2015
73
缺 six-1.8.0 ,我在 http://pypi.python.org/simple/six/ 上找到 six-1.8.0.tar.gz ,可以自己下载吗?
执行自动安装就是一直说timed out呢。
laotaitai
laotaitai
Mar 29, 2015
74
我觉得这pyspider至少在开发测试时用pyspider, 是坨屎. 另外, 文档写得也像坨屎. 我认为Scrapy比你设计更加先进和更加人性化, 你这pyspider连windows版的火车头的1%都不如. 我自己也尝试设计过爬虫框架, 一开始也是觉得scrapy是坨屎, 后面越来越觉得scrapy设计非常先进.
binux
binux
OP
Mar 29, 2015
75
@laotaitai 你不具体说屎在哪,别人怎么会明白?
laoyuan
laoyuan
Apr 3, 2015
76
快被我自己写的山寨PHP爬虫搞疯了,pypy快给我爬起~
laoyuan
laoyuan
Apr 3, 2015
77
呃,还要先去学学Python。。
monsabre
monsabre
Apr 24, 2015
78
低逼格的百毒找楼主这样的脑残写出锁死浏览器毒一坨屎

很正常
binux
binux
OP
Apr 24, 2015
79
@Livid 举报 @monsabre 「人身攻击、仇恨、暴力、侮辱性的言辞」
monsabre
monsabre
Apr 24, 2015
80
@Livid 举报 @binux

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