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

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

  •  
  •   vitovan · Aug 18, 2015 · 6056 views
    This topic created in 3917 days ago, the information mentioned may be changed or developed.

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

    overview

    subview

    detail

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

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

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

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

    Supplement 1  ·  Aug 26, 2015

    嘿,有更新嘞:

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

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

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

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

    功能慢慢加吧,一起来?

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

    等 Pull Request ~~
    vitovan
        10
    vitovan  
    OP
       Aug 18, 2015
    @laotaitai 看这里,还是很好看的吖,如果把工具调整好。

    ?1

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

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

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

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

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

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

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

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

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

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

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

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

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

    By the way: 你这个 server.lisp 里用的什么 web framework?
    vitovan
        41
    vitovan  
    OP
       Aug 19, 2015
    Crabby
        42
    Crabby  
       Aug 19, 2015
    @vitovan lisp 炸 , 哈哈, 牛掰 SICP 学习中, 我先拜一拜楼主
    1000copy
        43
    1000copy  
       Aug 21, 2015   ❤️ 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
       Aug 21, 2015
    @1000copy 赞~
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2965 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 14:56 · PVG 22:56 · LAX 07:56 · JFK 10:56
    ♥ Do have faith in what you're doing.