如何爬取实习僧的职位信息(初级)

  本项目利用爬虫技术来获取求职网站上的招聘信息,以便让求职更加高效。

一、项目要求

功能要求:

一、输入关键字,可列出区域、职务、工资。

二、列出对于此工作之额外要求,例如学历或是工作年限。

三、爬虫结果输出类型为JSON,或者储存在MongoDB

二、网站的选定与解析

  在本次项目中,用户只需要在终端输入“职位关键字”,相对应的职位信息即可被爬取下来,并储存在本地MongoDB服务器内,供查看。

网站分析:

https://www.shixiseng.com/interns?page=2&type=intern&keyword=java&area=&months=&days=°ree=&official=&enterprise=&salary=-0&publishTime=&sortType=&city=%E5%85%A8%E5%9B%BD&internExtend=

https://www.shixiseng.com/interns?page=3&type=intern&keyword=java&area=&months=&days=°ree=&official=&enterprise=&salary=-0&publishTime=&sortType=&city=%E5%85%A8%E5%9B%BD&internExtend=

https://www.shixiseng.com/interns?page=8&type=intern&keyword=java&area=&months=&days=°ree=&official=&enterprise=&salary=-0&publishTime=&sortType=&city=%E5%85%A8%E5%9B%BD&internExtend=

综合以上三个网址,可以得出以下规律

page:1-不限

type:intern/school/company

keyword:不限

aera:None/根据城市来选择具体区(汉字)

months:None/1/2/3/4

days:None/1/2/3/4/5/6

degree:None/大专、本科、硕士、博士

offical:None/entry/noentry/notsure

enterprise:None/china500/IT300

salary:-0/0-100/100-150/150-200/200-300/300-

publishTime:None/day/wek/mon

sortType:None/zj

city:全国、南京、上海、北京、......

internExtend:None

因此,网址可以简化为(实习_实习生招聘信息 – 实习僧

检查网页的结构和数据传输,发现传统的爬虫方法,也就是直接访问网址解析,不能直接爬取职位信息,因为实习僧网站有严格的反爬机制,爬虫爬下来的数据是一串未经解析的乱码,所以采用如下拼接的方法:

完成这样的操作,再去爬取页面的话,就不会出现乱码的情况,再去爬取数据就会出现正确的职位信息。

三、代码详解

  1. import requests
  2. from lxml import etree
  3. from urllib.parse import urlencode
  4. from pymongo import MongoClient
  5. # 连接MongoDB
  6. client = MongoClient('localhost'27017)
  7. db = client['ShixiSeng']
  8. collection = db['ios']
  9. headers = {
  10.     'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36'}
  11. # 定义函数
  12. def send_requests(url):
  13.     response = requests.get(url=url, headers=headers)
  14.     return response.text
  15. def parse_html(data):
  16.     tree = etree.HTML(data)
  17.     div_list = tree.xpath('//div[@class="result-list clearfix"]//div[@class="f-l intern-detail__job"]')
  18.     url_lst = []
  19.     for di in div_list:
  20.         new_url = di.xpath('.//a/@href')  # 得到了每一个实习页面的url
  21.         new_url = ''.join(new_url)  # 进行格式的转换,将列表转换为字符串格式
  22.         url_lst.append(new_url)
  23.     print(url_lst)
  24.     job_list = []
  25.     for i in range(len(url_lst)):  # 对新的url进行解析,爬取我们需要的薪水,公司的信息
  26.         resp = requests.get(url=url_lst[i], headers=headers)
  27.         tree = etree.HTML(resp.text)
  28.         job_name = tree.xpath('//div[@class="new_job_name"]/span/text()')
  29.         job_name = ''.join(job_name)
  30.         # 职位名称
  31.         job_address = tree.xpath('//div[@class="job_msg"]/span[@class="job_position"]/text()')
  32.         job_address = ''.join(job_address)
  33.         # 工作地点
  34.         job_money = tree.xpath('//div[@class="job_msg"]/span[@class="job_money cutom_font"]/text()')
  35.         job_money = ''.join(job_money)
  36.         # 实习薪水
  37.         company_name = tree.xpath('//a[@class="com-name"]/text()')
  38.         company_name = ''.join(company_name)
  39.         # 公司名称
  40.         job_require = tree.xpath('//div[@class="job_msg"]//span[@class="job_academic"]/text()')
  41.         job_require = ''.join(job_require)
  42.         # 职位描述
  43.         shixi_week = tree.xpath('//div[@class="job_msg"]/span[@class="job_week cutom_font"]/text()')
  44.         shixi_week = ''.join(shixi_week)
  45.         # 实习天数
  46.         job_month = tree.xpath('//div[@class="job_msg"]/span[@class="job_time cutom_font"]/text()')
  47.         job_month = ''.join(job_month)
  48.         # 实习月数
  49.         job_items = {
  50.             "职位名称": job_name,
  51.             "工作地点": job_address,
  52.             "实习薪水": job_money,
  53.             "公司名称": company_name.strip(),  # 去除空格
  54.             "工作要求": job_require,
  55.             "实习天数": shixi_week,
  56.             "实习月数": job_month
  57.         }
  58.         job_list.append(job_items)
  59.     save_file(job_list)
  60. def save_file(job_list):
  61.     collection.insert_many(job_list)
  62. if __name__ == '__main__':
  63.     page_num = int(input('请输入需要爬取的页数:'))
  64.     keyword = input('请输入搜索关键词:')
  65.     job_list = []
  66.     for page in range(1, page_num + 1):
  67.         params = {
  68.             'keyword': keyword,
  69.             'page': page
  70.         }
  71.         url = 'https://www.shixiseng.com/interns?' + urlencode(params)
  72.         data = send_requests(url)
  73.         parse_html(data)
  74.     if job_list:
  75.         save_file(job_list)

项目所需的库:

Request: 发送HTTP请求,获取网络上的数据。

From lxml import etree: lxml库基于xml来解析HTML或XML格式的文本数据,提取我们需要的信息

From urllib import urlencode:使用urlencode()方法构造url中的查询字符串。

From pymongo import MongoClient: 用来连接MongoDB并对其进行增删改查等操作。

具体代码解释:

这段代码实现了对实习僧网站职位信息的爬取和存储。主要流程如下:

1. 输入需要爬取的页数和搜索关键词

2. 构造url,包含搜索关键词和页数参数

3. 发送请求,获取响应数据

4. 解析响应数据,提取职位链接url

5. 遍历职位链接,解析详情页,获取职位信息

6. 构造字典,存储解析得到的职位信息

7. 将所有职位信息存储在job_list列表中并保存到MonggoDB中。

8. 重复第2-8步,实现多页爬取

程序运行:

首先安装好MongoDB和MongoDB Compass,在cmd中输入’net start mongodb’

打开PyCharm,运行程序。

四、结果总结

本次项目是初级网络爬虫应用,在面对网站严格的反爬机制下,需要不断学习和摸索新技术,就需要学习反爬虫技术以及应对反反爬虫的反爬虫技术,代码具有时效性,网站结构的变化以及新反爬虫技术的应用,都需要重新编写代码爬取。

本次项目成功做到了用户在终端输入要爬取的页数和职位关键字,就可实现批量爬取数据的操作,最后的结果存储到本地MongoDB数据库中,代码运行顺畅。

项目功能实现:

  1. 输入关键字,可列出工作地点、职位名称、薪水
  2. 额外添加:公司名称、工作要求、实习天数、实习月数
  3. 额外添加:批量爬取,可以爬取多页的数据。
  4. 数据输出类型为json,并保存在MongoDB

本次项目仍然有许多需要改进的地方,在反爬虫操作上仍有很大进步空间,在数据清洗方面,仍有进步空间。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值