导读
从今年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=北京#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=北京#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=北京&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攻城狮),因为他的那篇文章对我有很大的帮助,才能够高效的爬取数据。
这是更新的第一篇文章,回顾一下还是很不错的,之后会继续更新哒哒哒(* ̄︶ ̄)
转载于:https://www.cnblogs.com/Du-Lin/p/11299674.html