V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
vitovan
V2EX  ›  奇思妙想

spider-lang :爬虫语言,专为网络爬虫设计

  •  
  •   vitovan · 2015-09-16 21:11:11 +08:00 · 5009 次点击
    这是一个创建于 3391 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家看看有没有用?

    下面是代码(最好看图,有高亮):

    ;;Example 1: Hello World
    ;;V2EX 好像不需要验证码,此为模拟
    GET http://v2ex.com/signin FOR img.captcha
      :T 登录失败,需要验证码
      :F POST http://v2ex.com/signin WITH u:vitovan p:password FOR a.fade[href=/notifications]
        :T GET http://v2ex.com/notifications FOR #Main>.box>div.cell AS JSON
        :F 登录失败,未知原因
    ;;Example 2: Code Block and Params
    ;;define a block
    BLOCK v2ex-login $param
       POST http://v2ex.com/signin WITH u:vitovan p:password $param FOR a.fade[href=/notifications]
        :T GET http://v2ex.com/notifications FOR #Main>.box>div.cell AS JSON
        :F 登录失败,未知原因
    ;;call block
    GET http://v2ex.com/signin FOR img.captcha AS IMG
      :T POST http://handle-captcha-service.com/img WITH @RESULT AS TEXT
        :T CALL v2ex-login c:@RESULT
      :F CALL v2ex-login

    第 1 条附言  ·  2015-09-17 07:14:57 +08:00

    伪造头和数据库

    ;;Example 3: fake HEAD
    ;;fake HEAD
    PUSH @HEAD [User-Agent: "Mozilla/5.0 (X11; Linux i686; rv:38.0) Gecko/20100101 Firefox/38.0"]
    POP @HEAD Referer
    GET http://v2ex.com/go/ideas

    ;;Example 4: database operation, with websocket

    BLOCK db-callback $data
      $data

    BLOCK save-data $data
       OPEN ws://127.0.0.1/dbserver
        :T SEND $data WITH db-callback
        :F 数据库连接失败
       CLOSE

    BLOCK get-data $param
       OPEN ws://127.0.0.1/dbserver
        :T SEND $param WITH db-callback
        :F 数据库链接失败
       CLOSE

    ;;save data
    GET http://v2ex.com FOR a ["href" "text"] AS JSON
      :T CALL save-data @RESULT
      :F 未知错误

    ;;get data
    CALL get-data lasthead
    SET @HEAD @RESULT
    GET http://v2ex.com/go/ideas

    第 2 条附言  ·  2015-09-17 09:55:05 +08:00

    找到页面 css 路径为 body div.container div.pages div.current 所在元素的 text 值,转换为 int ,加 1 ,作为下一页加入到当前页面 URL 中,继续爬取下一页。

    ;;找到页面 css 路径为 body div.container div.pages div.current 所在元素的 text 值,转换为 int ,加 1 ,作为下一页加入到当前页面 URL 中,继续爬取下一页。

    BLOCK get-next-page $param
       INC $param 1
       GET http://www.example.com/p=$param

    GET http://www.example.com/p=1 FOR div.container>div.pages>div.current ["text"] AS NUMBER
     :T CALL get-next-page @RESULT

    25 条回复    2015-10-19 13:01:02 +08:00
    halfcrazy
        1
    halfcrazy  
       2015-09-16 21:30:00 +08:00
    DSL ?看注释像是 clojure 写的?
    29488503878
        2
    29488503878  
       2015-09-16 21:35:32 +08:00   ❤️ 1
    伪装 http 头怎么办,采集来的数据要入库怎么办
    vitovan
        3
    vitovan  
    OP
       2015-09-17 07:15:28 +08:00
    @29488503878 新加了附言。
    vitovan
        4
    vitovan  
    OP
       2015-09-17 07:16:50 +08:00
    @halfcrazy 嗯......只是个设想,还没实现。不知道有没有用,所以先讨论一下。
    cxh116
        5
    cxh116  
       2015-09-17 07:43:39 +08:00 via Android
    解析与数据提取那一块准备写成什么样?
    plqws
        6
    plqws  
       2015-09-17 08:40:24 +08:00 via Android
    想法很好,不过相对于用代码,我更喜欢图形界面
    bengol
        7
    bengol  
       2015-09-17 08:45:47 +08:00 via Android
    好丑
    Ncer
        8
    Ncer  
       2015-09-17 08:46:32 +08:00
    有意思
    qdwang
        9
    qdwang  
       2015-09-17 08:53:43 +08:00 via Android
    用 Python 实现过和这个很像的内部 dsl
    tobyxdd
        10
    tobyxdd  
       2015-09-17 08:55:12 +08:00 via Android
    还不错
    tdifg
        11
    tdifg  
       2015-09-17 09:19:42 +08:00
    要是只为了爬虫这么一件事,为啥不直接写个框架啊?
    est
        12
    est  
       2015-09-17 09:31:24 +08:00   ❤️ 1
    一个场景:

    找到页面 css 路径为 body div.container div.pages div.current 所在元素的 text 值,转换为 int ,加 1 ,作为下一页加入到当前页面 URL 中,继续爬取下一页。
    vitovan
        13
    vitovan  
    OP
       2015-09-17 09:34:54 +08:00
    @est 稍等我试试。
    vitovan
        14
    vitovan  
    OP
       2015-09-17 09:36:16 +08:00
    @cxh116 基本解析就类似于这样: GET http://v2ex.com FOR a ["href" "text"] AS JSON
    进阶的就上正则了。
    vitovan
        15
    vitovan  
    OP
       2015-09-17 09:36:47 +08:00
    @plqws 这不是问题,现在有没有好用的爬虫构建图形界面?
    vitovan
        16
    vitovan  
    OP
       2015-09-17 09:37:46 +08:00
    @tdifg 框架有语言和运行环境的限制吖。
    vitovan
        17
    vitovan  
    OP
       2015-09-17 09:55:20 +08:00
    @est 已附言:
    est
        18
    est  
       2015-09-17 11:30:01 +08:00
    @vitovan 嗯。。看来是需要发明个 INC 表达式。。
    vitovan
        19
    vitovan  
    OP
       2015-09-17 12:51:34 +08:00
    @est 一些基本的加减乘除还是要有的吧,本来没这个打算(原本是想:所有链接均应该由页面元素点击而来,而不是程序组建),你这么一提还是有必要的。
    est
        20
    est  
       2015-09-17 12:54:09 +08:00
    @vitovan 还有更加复杂的正则组装,跨 JSON 拼接 URL 等等。麻烦死了都要!

    最要命的,是对付 google 这类变态,都不能解析 json 了,要解析 js !
    vitovan
        21
    vitovan  
    OP
       2015-09-17 13:02:40 +08:00
    @est 像那种非静态 HTML 的页面,打算不做考虑,如果需要的话可以直接挂个 headless WebKit ,如: PhantomJS 。
    est
        22
    est  
       2015-09-17 13:47:43 +08:00   ❤️ 1
    @vitovan 都这个年代了,不考虑不行了。现在连视频弹幕都需要抓。
    hobbyliu
        23
    hobbyliu  
       2015-09-18 18:32:14 +08:00
    求 gihub 连接
    pythoner
        24
    pythoner  
       2015-09-20 12:49:23 +08:00
    其实如果是专为爬虫设计的话,还需要考虑的东西还有很多,比如:
    1 ,需要 JS 渲染的页面怎么办
    2 ,数据处理怎么办
    3 ,爬虫任务调度怎么办
    4 ,分布式怎么办
    5 ,抓取频率 /速度怎么控制
    6 ,验证码怎么处理
    7 ,页面有更新或者 404 了怎么办
    8 ,需要代理怎么办
    9 ,爬虫状态监控怎么办
    等等,够玩一年了。

    把这一坨东西加在一起,就不单单是一个“爬虫语言”了,而变成了一个"爬虫框架"。
    那么问题来了,写爬虫哪家强?
    当然是我大 python 了!我大 python 里从来都不缺少轮子:古有 scrapy ,今有 pyspider ,方方面面都考虑到了。
    上网搜“九评 python ”有真相
    JhOOOn
        25
    JhOOOn  
       2015-10-19 13:01:02 +08:00
    @pythoner 笑死了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   951 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:02 · PVG 06:02 · LAX 14:02 · JFK 17:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.