原标题:爬虫小实例-拉勾网数据分析岗位
欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习、问答、求职,一站式搞定!
对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。
周末没事,想看看最近的职位招聘情况,就用拉勾网为例,练习下爬虫 1.分析
首先去拉勾网的主页去观察下,
当前的搜索页面URL:
观察下源码,发现结构很清晰,解析起来应该很方便,再通过下一页去遍历即可
通过上面的,我们直接去解析应该是足够了,我们再看下他的请求信息,会找到这样一个post,
很明显,这个pn应该就是页码(多查询几次观察下可以确认)
这个应该就是查询的请求,看看结果集,就是我们想要的数据
所以,如果我们直接去请求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
#更新结果集的总页数
defupdate_total_page(page_size,totalCount):
global total_page total_page = math.ceil(totalCount/page_size)
#解析HTML页面
defparse_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数据
defparse_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)
defmain(): 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()
天善学院svip包含Excel BI、Python爬虫案例、Python机器学习、Python数据科学家、大数据、数据分析报告、数据分析师体系、深度学习、R语言案例10套课程火爆报名中,欢迎大家关注 www.hellobi.com/svip
转载请保留以下内容:
本文来源自天善社区liutangwow老师的博客(公众号)。
原文链接:https://ask.hellobi.com/blog/yuguiyang1990/9444返回搜狐,查看更多
责任编辑: