spider-lang :爬虫语言,专为网络爬虫设计 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

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

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

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

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

    大家看看有没有用?

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

    ;;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 2130: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:0
    @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     Solana     831 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 19:44 PVG 03:44 LAX 11:44 JFK 14:44
    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