V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
vitovan
V2EX  ›  分享创造

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

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

    网址: 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  
       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  
       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
       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-08-21 17:23:52 +08:00
    @1000copy 赞~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2449 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:24 · PVG 10:24 · LAX 18:24 · JFK 21:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.