爬虫小实例-拉勾网数据分析岗位

浏览: 2562

周末没事,想看看最近的职位招聘情况,就用拉勾网为例,练习下爬虫

1.分析

    首先去拉勾网的主页去观察下,

当前的搜索页面URL:

图片.png

图片.png


观察下源码,发现结构很清晰,解析起来应该很方便,再通过下一页去遍历即可

图片.png


通过上面的,我们直接去解析应该是足够了,我们再看下他的请求信息,会找到这样一个post,

很明显,这个pn应该就是页码(多查询几次观察下可以确认)

图片.png

这个应该就是查询的请求,看看结果集,就是我们想要的数据

图片.png

所以,如果我们直接去请求json数据,然后解析下就行了

2. 要注意的小问题

   写的时候,主要遇到几个问题,

    2.1 直接请求的话,不行,会被拦截,关于拉勾网,网上的例子很多,这里测试的时候,只要加上header就行了,其他的不需要

    headers = {
'User-Agent':r'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0',
'Referer':r'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput',
'Host':'www.lagou.com'
}

  2.2 json的结果集中,有总条数和每页条数,根据这2点,我们可以算出总页数

  2.3 解析json就行了

  2.4 在 循环的时候,sleep了5秒,因为一直查询偶尔会报错,估计是被拦截了

3.代码

下面分享下,第一版代码,后面再优化:

# -*- coding: utf-8 -*-
"""
Created on Sat Aug 19 15:22:20 2017

@author: yuguiyang
"""

import urllib
import json
import math
import csv
import time
import os

total_page = 1
current_page = 1

#更新结果集的总页数
def update_total_page(page_size,totalCount):
global total_page

total_page = math.ceil(totalCount/page_size)


#解析HTML页面
def parse_html(url,headers,post_data):
post_data = urllib.parse.urlencode(post_data).encode('utf-8')
req = urllib.request.Request(url,headers=headers,data=post_data)
page = urllib.request.urlopen(req)

return page.read().decode('utf-8')

#解析返回的json数据
def parse_result(html):
data_json = json.loads(html)
print(data_json['content']['pageNo'])

#第一页的话,更新下总页数
if data_json['content']['pageNo'] == 1 :
update_total_page(data_json['content']['pageSize'],data_json['content']['positionResult']['totalCount'])

#将结果保存到csv文件
with open('lagou_shujufenxi_data.csv','a',newline='',encoding='utf-8') as csvfile:
csv_writer = csv.writer(csvfile,quotechar='"',quoting=csv.QUOTE_MINIMAL)
#在第一页的时候,写入标题
if data_json['content']['pageNo'] == 1 :
csv_writer.writerow(['公司简称','公司全称','所属行业','工作地点','职位特点','薪资','经验','职位名称','firstType','secondType'])

#遍历招聘信息
for job in data_json['content']['positionResult']['result']:
line = []
line.append(job['companyShortName'])
line.append(job['companyFullName'])
line.append(job['industryField'])
line.append(job['district'])
line.append(job['positionAdvantage'])
line.append(job['salary'])
line.append(job['workYear'])
line.append(job['positionName'])
line.append(job['firstType'])
line.append(job['secondType'])

csv_writer.writerow(line)

def main():
headers = {
'User-Agent':r'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0',
'Referer':r'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput',
'Host':'www.lagou.com'
}

url = 'https://www.lagou.com/jobs/positionAjax.json'

#判断要导出的文件是否存在
if os.path.exists(r'lagou_shujufenxi_data.csv'):
print('hey,delete the file')
os.remove(r'lagou_shujufenxi_data.csv')

#循环所有页数,取导出数据
while current_page <= total_page:
#post参数,每次修改页码就行了
post_data = {'city':'上海','isSchoolJob':'0','needAddtionalResult':'false','kd':'数据分析','pn':current_page}
#解析每一个页面
html = parse_html(url ,headers, post_data)
#处理获取的json数据
parse_result(html)

#当前页码加1
current_page += 1

#这里sleep5秒,不停一下,偶尔会报错
time.sleep(5)

if __name__=='__main__':
main()

图片.png

推荐 1
本文由 liutangwow 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册