python拉勾网数据分析-爬虫阶段

导读

从今年1月份开始拉勾网反爬能力加强(好像是5号,之后就需要模拟登录和验证码),后来读了一篇文章解决了这个问题(没找到之前历时4个月很想哭,,,好不容易找到一个,然而一个code生成一个文件需要80分钟。。。别问我爬了几个o(╥﹏╥)o),解决方法是伪装请求头,并将session更新进行抓取,只需很短的时间。80分钟的代码用的selenium,可见两种爬虫方法各有各的不同及优势,根据实际情况选择爬虫的方法。

数据概况

我爬取的是北京地区5月13日~5月27日半个月的数据,是各种技能语言的汇总(Java、C、C#、Android等),总共14313条数据。每天都对拉勾网爬取,并将与前一天重复的数据删除,纯手工操作还是很多的。具体情况如下:

 

还可以根据需要增加“公司简称”、“公司规模”的字段。

爬虫代码

# -*- coding: utf-8 -*-
"""
Created on Mon May 13 12:51:01 2019

@author: THSML
"""

import requests

import xlwt

import time


# 获取存储职位信息的 json 对象,遍历获得公司名、福利待遇、工作地点、学历要求、工作类型、发布时间、职位名称、薪资、工作年限

def get_json(url, datas):

    my_headers = {

        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",

        "Referer": "https://www.lagou.com/jobs/list_Ruby?px=default&city=%E5%8C%97%E4%BA%AC#filterBox",

        "Content-Type": "application/x-www-form-urlencoded;charset = UTF-8"

    }

    time.sleep(5)

    ses = requests.session()    # 获取 session

    ses.headers.update(my_headers)  # 更新

    ses.get("https://www.lagou.com/jobs/list_Ruby?px=default&city=%E5%8C%97%E4%BA%AC#filterBox")

    content = ses.post(url=url, data=datas)

    result = content.json()

    info = result['content']['positionResult']['result']

    info_list = []

    for job in info:

        information = []

        information.append(job['positionId'])  # 岗位对应 ID

        information.append(job['city'])  # 岗位对应城市

        information.append(job['companyFullName'])  # 公司全名
        
        information.append(job['financeStage'])    #融资阶段

        information.append(job['companyLabelList'])  # 福利待遇

        information.append(job['district'])  # 工作地点

        information.append(job['education'])  # 学历要求

        information.append(job['firstType'])  # 工作类型

        information.append(job['formatCreateTime'])  # 发布时间

        information.append(job['positionName'])  # 职位名称

        information.append(job['salary'])  # 薪资

        information.append(job['workYear'])  # 工作年限

        info_list.append(information)

        # 将列表对象进行 json 格式的编码转换,其中 indent 参数设置缩进值为 2

       # print(json.dumps(info_list, ensure_ascii=False, indent=2))

    # print(info_list)

    return info_list


def main():

    page = int(input('请输入你要抓取的页码总数:'))

    #kd = input('请输入你要抓取的职位关键字:') # 可以自行调整关键字

    #city = input('请输入你要抓取的城市:')  # 可以自行调整关键字



    info_result = []

    title = ['岗位 id', '城市', '公司全名', '融资阶段','福利待遇', '工作地点', '学历要求', '工作类型', '发布时间', '职位名称', '薪资', '工作年限']

    info_result.append(title)

    for x in range(1, page+1):

        url = 'https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false'

        datas = {

            'first': 'false',

            'pn': x,

            'kd': 'Ruby',

        }

        try:

            info = get_json(url, datas)

            info_result = info_result + info

            print("第%s 页正常采集" % x)

        except Exception as msg:

            print("第%s 页出现问题" % x)



        # 创建 workbook,即 excel

        workbook = xlwt.Workbook(encoding='utf-8')

        # 创建表,第二参数用于确认同一个 cell 单元是否可以重设值

        worksheet = workbook.add_sheet('Ruby', cell_overwrite_ok=True)

        for i, row in enumerate(info_result):

            # print(row)

            for j, col in enumerate(row):

                # print(col)

                worksheet.write(i, j, col)

        workbook.save('Ruby.xls')


if __name__ == '__main__':

    main()

可以修改地区和职位。

我的数据:

链接:https://pan.baidu.com/s/11FfMCd6l-HNnn4NsbgB2NQ
提取码:98f3

小葡萄在这里要感谢一下一个公众号(Python攻城狮),因为他的那篇文章对我有很大的帮助,才能够高效的爬取数据。

这是更新的第一篇文章,回顾一下还是很不错的,之后会继续更新哒哒哒(* ̄︶ ̄)

posted @ 2019-08-04 21:26  葡萄小丸子  阅读(318)  评论(0)    收藏  举报