[招聘爬虫] whereisjob.com ,昨天写了一个专门爬 V2EX 酷工作版块的爬虫 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
vitovan
V2EX    分享创造

[招聘爬虫] whereisjob.com ,昨天写了一个专门爬 V2EX 酷工作版块的爬虫

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

    网址: http://whereisjob.com/
    先上图:

    overview

    subview

    detail

    昨天有人发了个帖子说:「那么多抓招聘网站内容的 V 友,可以把公司地址显示在地图上呀,方便挑选里家近的公司。」 http://v2ex.com/t/213594

    然后我看国外有人抓 HackerNews 的 ( http://whoishiring.it/ ),没见国内有人抓 V2EX ,于是就做了个。

    源码: https://github.com/VitoVan/whereisjob.com

    有兴趣的朋友一起来完善~

    第 1 条附言    2015-08-26 17:29:12 +08:00

    嘿,有更新嘞:

    • 调整右侧栏样式及点击效果
    • 仅显示近 15 天数据

    源码有功能性调整,具体看提交日志:

    https://github.com/VitoVan/whereisjob.com

    44 条回复    2015-08-21 17:23:52 +08:00
    Razyshen
        1
    Razyshen  
       2015-08-18 09:52:47 +08:00
    初涉爬虫领域,用 nodejs 玩的爬虫,各位技术大大有交流技术的吗
    vitovan
        2
    vitovan  
    OP
       2015-08-18 10:06:44 +08:00
    @Razyshen NodeJs 好啊, Phantomjs 棒吖,再也不用担心那些动态加载的数据了。
    superbear
        3
    superbear  
       2015-08-18 10:15:17 +08:00
    居然是 lisp ,厉害
    Razyshen
        4
    Razyshen  
       2015-08-18 10:18:25 +08:00
    @vitovan 我现在基本都是去找网页接口,比较大的网站应该都有 json 数据接口。
    vitovan
        5
    vitovan  
    OP
       2015-08-18 10:41:52 +08:00
    @Razyshen 貌似是挂了。
    Razyshen
        6
    Razyshen  
       2015-08-18 10:44:28 +08:00
    @vitovan 爬虫如何应对,被爬网站内容结构的改变呢
    qiayue
        7
    qiayue  
    PRO
       2015-08-18 10:46:36 +08:00
    地点还需要再细分,最好能够具体到门牌号
    目前只到城市,没多大意义
    laotaitai
        8
    laotaitai  
       2015-08-18 10:47:50 +08:00
    Lisp 看起来很厉害, 但代码缩进让人看着蛋疼
    vitovan
        9
    vitovan  
    OP
       2015-08-18 10:50:04 +08:00
    @qiayue http://v2ex.com/go/jobs 酷工作里写门牌号的不多,不过也有,类似这个: http://v2ex.com/t/213805

    功能慢慢加吧,一起来?

    https://github.com/VitoVan/whereisjob.com

    等 Pull Request ~~
    vitovan
        10
    vitovan  
    OP
       2015-08-18 10:54:46 +08:00
    @laotaitai 看这里,还是很好看的吖,如果把工具调整好。

    ?1

    ![lisp-work-screenshot][?1]
    x4
        11
    x4  
       2015-08-18 10:59:00 +08:00 via Android
    @qiayue 不光门牌号,还得标出楼层办公区域乃至座位位置。逃
    qiayue
        12
    qiayue  
    PRO
       2015-08-18 11:09:30 +08:00
    @vitovan 要去对应的公司官网上抓取详细地址信息
    djyde
        13
    djyde  
       2015-08-18 11:31:07 +08:00
    我还以为你要招做爬虫的。。
    vitovan
        14
    vitovan  
    OP
       2015-08-18 11:32:45 +08:00
    @djyde ...... Sorry about the words ......
    eary
        15
    eary  
       2015-08-18 12:34:08 +08:00
    这精准到城市,目前所有的招聘网站都能筛选城市。别人的需求应该是精确到街区具体地址。
    laotaitai
        16
    laotaitai  
       2015-08-18 13:05:57 +08:00   1
    @vitovan 呃, 我是说 Lisp 的缩进不好看, 整体一眼看去, 特么别扭, 但用 Lisp 写程序, 在满大街用 Java, Python, PHP, OC 等情况下, 特别有逼格. 让我一下子想起那个"黑客与画家"的书.
    laotaitai
        17
    laotaitai  
       2015-08-18 13:07:53 +08:00
    我想问下, 也是用 Lisp 爬取数据的么?
    sciooga
        18
    sciooga  
       2015-08-18 13:54:46 +08:00
    楼主看你网站右边写的 “仅显示近两月数据” 你是一天爬了 V 站两个月的数据?还是说数据库只保存最近两个月的数据?
    如果是前者,你是怎么做到的?
    sciooga
        19
    sciooga  
       2015-08-18 13:55:34 +08:00
    @sciooga 喔... 是只爬了酷工作这个板块是吧?
    vitovan
        20
    vitovan  
    OP
       2015-08-18 14:07:42 +08:00
    @laotaitai 是呀,看代码:

    https://github.com/VitoVan/whereisjob.com/blob/master/server.lisp

    (defun get-job-dom (tid )
    (format t "REQUESTING PAGE... ~A ~A" tid #\newline )
    (multiple-value-bind (job-html )
    (drakma:http-request (concatenate 'string "http://v2ex.com/t/" tid ))
    (parse-html5 job-html )))
    vitovan
        21
    vitovan  
    OP
       2015-08-18 14:10:54 +08:00
    @sciooga

    1, 不是。昨天晚上就随手抓了最近几天的数据。
    2, 数据库数据没有做删除的操作,还没考虑,不过前台仅返回最近两月的数据。
    3, 一天爬 V 站两个月的数据,也是可操作的吧,我昨天试了试 V 站的请求拦截没那么严格。
    vitovan
        22
    vitovan  
    OP
       2015-08-18 14:15:10 +08:00
    @laotaitai Lisp 的确是装逼神器,不过用了一段时间之后发现,还真的很好用,做原型特别快。
    sciooga
        23
    sciooga  
       2015-08-18 14:16:18 +08:00
    @vitovan 单一节点还是可能的,如果是最近两月的全部主题就得上代理了... 不然一封就是两天那~
    laotaitai
        24
    laotaitai  
       2015-08-18 14:57:52 +08:00
    @vitovan 呀卧槽! 代码这么精简? 搞得我也想入手 Lisp 了. 听说 Lisp 有很多方言, 你用哪个方言?
    vitovan
        25
    vitovan  
    OP
       2015-08-18 15:05:05 +08:00   1
    @laotaitai 是呀,代码超级精简,由于没有强类型概念,也就没有什么数据转换概念。原来用 Java 要好几个文件加上一个 Maven 配置的东西,在 Lisp 里可能就一句话。

    关于方言,我个人推荐 Common Lisp ,工业化较强,包比较多。
    laotaitai
        26
    laotaitai  
       2015-08-18 15:12:03 +08:00
    @vitovan 感谢推荐. 哪天了解下, 要是比 Python 写起来舒服, 直接抛 Python 从 Lisp 了. 哈哈!
    vitovan
        27
    vitovan  
    OP
       2015-08-18 15:17:56 +08:00   1
    @laotaitai 就像这个例子,总共 281 行代码:页面抓取、 DOM 遍历、模式匹配、数据存储、 WebServer 、定时任务等等全部在里面。

    我最喜欢的还不是以上这些,是 Lisp 的 REPL 特性,留了一个 REPL 在服务器上,随时都可以连接上去查看或更改当前内存里的每一个变量、函数、类定义等等随便你想得到的东西。可以在不重启服务的情况下把整个服务代码全部重构。

    vitovan
        28
    vitovan  
    OP
       2015-08-18 15:24:14 +08:00   1
    @laotaitai 也不用抛 Python 吖,要是做一些本地应用还是用 Python 的好,比如和硬件打交道的:机器学习、录音程序、播放器等一些硬件依赖的东西。

    Common Lisp 对于外部依赖处理全靠 CFFI https://common-lisp.net/project/cffi/

    个人感觉是跨平台处理的不是很好,所以遇到类似问题就直接 Python 或 平台语言了 (如: Window 上 C#)。
    vitovan
        29
    vitovan  
    OP
       2015-08-18 15:25:21 +08:00
    @Razyshen 重写吖~
    laotaitai
        30
    laotaitai  
       2015-08-18 15:32:38 +08:00
    @vitovan 我就看中了那个极其精简之度, 就你说的"页面抓取、 DOM 遍历、模式匹配、数据存储、 WebServer 、定时任务", 这个在 Python 简直不能在这么短代码做完的.

    Lisp 只要能在 Linux/Unix 上运行, 其他神马都不是问题.
    Razyshen
        31
    Razyshen  
       2015-08-18 15:41:26 +08:00
    @vitovan 如果人家有 app 产品的话,可以逆向他们的程序,找到数据接口!你说这样对不对!
    vitovan
        32
    vitovan  
    OP
       2015-08-18 15:55:51 +08:00
    @Razyshen 说得好!好有激情撒~~

    最后可能要死到版权上呐,就像 http://whereisjob.com , @Livid 一句话就能把它关掉吖。

    只能玩玩撒。
    Razyshen
        33
    Razyshen  
       2015-08-18 15:59:43 +08:00
    @vitovan 办法总归是有的。只不过看你想得到想不到了
    Livid
        34
    Livid  
    MOD
    PRO
       2015-08-18 16:38:25 +08:00
    @vitovan 这是一个很有创意的作品,代码也实现得很有意思。谢谢你链接回 V2EX.com
    laotaitai
        35
    laotaitai  
       2015-08-18 17:08:09 +08:00
    @vitovan 请教个问题, 我刚才就入手 Common Lisp, 安装了 SBCL, 我输入 sbcl 这个命令, 进入 interactive, 我发觉在这里面试验代码不方便, 不像 Python 的 interactive 方便, 至少 Python 的可以上下左右移动光标.

    代码写在文件里, 然后执行, 也不方便, 毕竟我只是想测试临时代码.

    你有啥方式可以方便试验 Lisp 代码?
    vitovan
        36
    vitovan  
    OP
       2015-08-18 18:09:09 +08:00
    @laotaitai 我的组合建议: Linux + Emacs + Slime + Quicklisp + SBCL ,这样下来全套环境都有了。

    中文的 Lisp 教程好像不多,你可以 Google 一下,改天有空了我写个简明教程试试。
    vitovan
        37
    vitovan  
    OP
       2015-08-18 18:10:16 +08:00
    @Livid 谢谢你创造了 V2EX 。
    vitovan
        38
    vitovan  
    OP
       2015-08-18 18:12:58 +08:00
    @laotaitai 看错了,入手的话,建议先玩玩 GNU Emacs Lisp https://www.gnu.org/software/emacs/manual/html_node/elisp/
    laotaitai
        39
    laotaitai  
       2015-08-18 18:19:23 +08:00
    @vitovan 看起来很复杂的样子, 我慢慢研究去.
    laotaitai
        40
    laotaitai  
       2015-08-18 21:58:03 +08:00
    @vitovan 花了几个小时了解, 发现入门 Lisp 这个语言, 不难. 但是开发环境就蛋疼了, 入门门槛太高了. 光是 Emacs 就把我吓退了. 太特么变态了!

    By the way: 你这个 server.lisp 里用的什么 web framework?
    vitovan
        41
    vitovan  
    OP
       2015-08-19 06:26:28 +08:00
    Crabby
        42
    Crabby  
       2015-08-19 10:59:32 +08:00
    @vitovan lisp 炸 , 哈哈, 牛掰 SICP 学习中, 我先拜一拜楼主
    1000copy
        43
    1000copy  
       2015-08-21 14:19:10 +08:00   1
    @vitovan 留一个 REPL 确实是一个提神醒脑的好做法。赞。

    想了想, js 也可以做到,虽然不敢说在线重构,但是访问和测试点东西还是够了。


    function Foo (){
    this.bar = 10
    }
    var repl = require ("repl");

    var replServer = repl.start ({
    prompt: "my-app > ",
    });

    replServer.context.Foo = Foo
    λ node test_repl.js
    my-app > Foo
    Foo
    [Function: Foo]
    my-app > a = new Foo ()
    { bar: 10 }
    my-app > a.bar
    10
    my-app > a.bar =11
    11
    my-app > a
    { bar: 11 }
    my-app >
    vitovan
        44
    vitovan  
    OP
       2015-0-21 17:23:52 +08:00
    @1000copy 赞~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3610 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 04:20 PVG 12:20 LAX 20:20 JFK 23:20
    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