V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
allencode
V2EX  ›  Python

Python 抓取拉勾网职位分布[回报 v2ex]

  •  1
     
  •   allencode · 2016-08-15 19:17:44 +08:00 · 5448 次点击
    这是一个创建于 3026 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前在 V2 求问过爬取拉勾的思路。现在基本达到自己的要求了。分享出来。希望有用。

    思路

    • 开始即根据职位来抓取相应的招聘职位数量。但是只有 1w 多。数量不达标。
    • 组合关键字抓取。如组合城市,职位,服务领域。即可达成抓取 5w+ 数量目标。

    细节

    如下 Request URL 中的 %E7... 即为对应查询关键字的 16 进制表现形式。

    如下 Form Data 皆为 Post 需要构建的表单。

    存储

    • 为保证存储和查询速度。选择 MongoDB 数据库。
    • 为保证插入不重复。对插入语句进行优化。
    def insert_data(self,data):
        data['_id'] = data['positionId']
        data['updateTime'] = datetime.datetime.now()
        # 防止重复插入
        db.Collection.update_one(
            filter={'_id': data['_id']},
            update={'$set': data},
            upsert=True
        )
        count = db.Collection.count()
        print u'已经存储了:',count,u'条记录'
    

    代码

    写了很多爬虫,分享给大家。共同进步学习。希望有用。

    代码可以在这里取到

    第 1 条附言  ·  2016-08-16 08:21:53 +08:00

    如下为构建的存储信息:

                        formatData = {
                            "companyShortName": i['companyShortName'],
                            "salary":i['salary'],
                            "city": i['city'],
                            "education": i['education'],
                            "positionName": i['positionName'],
                            "workYear": i['workYear'],
                            "companySize": i['companySize'],
                            "financeStage": i['financeStage'],
                            "industryField": i['industryField'],
                            "positionId":i['positionId']
                        }
    
    第 2 条附言  ·  2016-08-16 14:29:25 +08:00
    被封了 2 个 IP 。大约可以爬 8w+ 的数据。代理还不是很可靠。没有找到好的解决办法。数据存储在 MongoDB 。后续会有一些分析。打算用百度的 Echarts 来完成图标的绘制。
    第 3 条附言  ·  2016-08-16 20:29:57 +08:00
    第 4 条附言  ·  2016-08-17 08:26:35 +08:00
    打个广告。可以接爬虫私活。也可以做数据分析展示等。
    10 条回复    2016-08-16 20:36:08 +08:00
    ioiogoo
        1
    ioiogoo  
       2016-08-15 19:27:04 +08:00
    `如下 Request URL 中的 %E7... 即为对应查询关键字的 16 进制表现形式`
    这个应该是 url 编码后的表现形式啊
    allencode
        2
    allencode  
    OP
       2016-08-15 19:30:09 +08:00
    @ioiogoo 嗯 是的。代码中可以用 Python 相应模块将关键字转化为 16 进制形式。

    keyWord1 = urllib.quote(hy)

    这句代码即可实现汉字到 16 进制编码的转换。
    lzgbeyong
        3
    lzgbeyong  
       2016-08-16 11:07:55 +08:00
    楼主资料整理的很详细,赞一个。
    正好我最近用 ndoe 也做了一个拉勾网的爬虫,可以实时在线查看招聘职位数量和城市的分布,有兴趣的可以看看。
    因为 js 的异步特性,爬取多个 url 的信息会比 python 快很多。

    在线地址: http://123.56.17.200:8082/
    github 地址: https://github.com/woxixiulayin/lagou_spider
    allencode
        4
    allencode  
    OP
       2016-08-16 11:13:55 +08:00 via Android
    @lzgbeyong 哈哈,好的。学习一个。
    sleshep
        5
    sleshep  
       2016-08-16 11:58:32 +08:00
    @lzgbeyong
    gevent 表示不服
    allencode
        6
    allencode  
    OP
       2016-08-16 14:03:22 +08:00
    @lzgbeyong 绘图好赞。是百度的那个 Echarts 吗
    pathbox
        7
    pathbox  
       2016-08-16 20:04:11 +08:00
    果然 还是会被封
    allencode
        8
    allencode  
    OP
       2016-08-16 20:13:42 +08:00
    @pathbox 嗯呢。爬了两个晚上。都是早上被封的。后来抓了些代理,但是可用性不高。能用的也只有五六个。我把抓代理的代码也贴上好了。
    lzgbeyong
        9
    lzgbeyong  
       2016-08-16 20:27:00 +08:00
    @allencode 是的, api 很简单,你可以用来做展示
    allencode
        10
    allencode  
    OP
       2016-08-16 20:36:08 +08:00
    @lzgbeyong 嗯呢 我就打算用那个来做展示呢,现在还没怎么会用。只会用在线的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3454 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:55 · PVG 18:55 · LAX 02:55 · JFK 05:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.