V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
爱意满满的作品展示区。
binux

再次分享 pyspider 爬虫框架

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

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

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

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

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

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

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

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


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

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

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

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

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