0基础爬虫前程无忧招聘信息
安装
首先,我们需要安装pycharm和mysql
官网链接:https://www.jetbrains.com/pycharm/,https://www.mysql.com/
1.连接数据库
目录
1.连接数据库
- 第一步如果我们没有连接过数据库的话,需要先下载插件点半,即在文件->设置->插件->db
显示已完成后重启pycharm
2.重启后,点击位于pycharm左边的菜单栏打开DB Browser
点击‘+’,选择mysql
在输入用户名和密码后进行test connection,若出现如下错误:
按下win+r,打开cmd,登录你的mysql账号后,输入:set global time_zone='+8:00';后显示
说明时区更改成功,关闭cmd,重新test connection,显示
连接成功。
创建一个py项目,导入pymysql包
输入:
db = pymysql.connect(host='localhost',port=3306,user='root',password="121200",db='students',charset='utf8'
)
然后输入#拿到游标
cursor = db.cursor()
写一个创建表的函数:
def create():db = pymysql.connect(host="localhost", user="root", password="121200", database="students") # 连接数据库cursor = db.cursor()cursor.execute("DROP TABLE IF EXISTS data")#如果已经存在表格data则删除sql = """CREATE TABLE data (ID INT PRIMARY KEY AUTO_INCREMENT,post CHAR(255),company CHAR(255),address CHAR(255),salary_min CHAR(255),salary_max CHAR(255),job CHAR(255),degree CHAR(255),edu CHAR(255))"""cursor.execute(sql)db.close()
2.爬取https://www.51job.com/的招聘信息
例如我们爬取Python工程师的招聘信息数据:
首先创建一个header的列表
打开前程无忧按下f12,点击Network选择第一条:
在Header栏下找到Cookie复制进入header,再找到user-agent(浏览器)复制后放入header
复制网站地址,获得url=‘ https://search.51job.com/list/000000,000000,0000,00,9,99,python%25E5%25B7%25A5%25E7%25A8%258B%25E5%25B8%2588,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=’
通过往后翻取页数发现url变化在于.html之前的数字即数字为页数
若我们爬取前10页数据:则
for page in range(1, 5):url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,python%25E5%25B7%25A5%25E7%25A8%258B%25E5%25B8%2588,2,{}.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='.format(page)
接着我们使用requests函数通过user-agent获取网站数据
response = requests.get(url, headers=headers).text
这时我们可以先运行不会报错后,我们继续获取数据。
现在我们已经有了获取网页数据的资格了,于是我们使用正则查找获取数据。鼠标右键打开网页源码,在465行找到包含了所有数据的位置,于是我们使用findall函数,直接获取所有数据。((.*?)获取中间的所有数据)
r = re.findall('<script type="text/javascript">window.__SEARCH_RESULT__ = (.*?)div class="clear"></div>', response,re.S)
由于里面数据排列不是很规范不宜与提取,所以我们使用''.join()函数,将其中每个数据用''括起来,然后使用json.loads函数将str转换成dict。
string = ''.join(r)
infodict = json.loads(string)
观察可知,我们所需的岗位信息等数据都在engine_search_result的列表里,所以我们应该直接缩小范围为爬取engine_search_result列表内容:
engine_search_result = infodict['engine_search_result']
由于每条招聘信息中公司名称、地理位置等信息都是循环出现,且变量名相同,所以我们可以使用for循环写入数据库,但由于薪资待遇的最大最小值是由‘-’连接的一个数据所以为将两个数据分开后存入数据库,再使用一次正则查找,但由于存在salary没有的情况,所以使用一个try函数规避salary为赋值的情况。对上传日期,工作经验,学历等的爬取同上。
for i in engine_search_result:job_name = i['job_name'] # 工作名称workarea_text = i['workarea_text'] # 工作地company_name = i['company_name'] # 公司名称providesalary_text = i['providesalary_text'] # 工资salary = re.findall(r"\d+\.?\d*", providesalary_text)print(salary)try:salary_min = salary[0]salary_max = salary[1]except:IndexError: "list index out of range"updatedate = i['updatedate'] # 上传日期attribute_text = i['attribute_text']a = []a = attribute_textdegreefrom = a[1] # 工作经验edu = a[2] # 学历
2.存入数据库
编写一个sql语句写成的insert函数
def insert(value):db = pymysql.connect(host="localhost", user="root", password="121200", database="students")cursor = db.cursor()sql = "insert into students.data_1(post,company,address,salary_min,salary_max,job,degree,edu) values (%s,%s,%s,%s,%s,%s,%s,%s)"try:cursor.execute(sql, value)db.commit()print('插入数据成功')except:db.rollback()print("插入数据失败")db.close()
完整代码如下:
import reimport pymysql
import json
# 请求头
import requestsdef create():db = pymysql.connect(host="localhost", user="root", password="121200", database="students") # 连接数据库cursor = db.cursor()cursor.execute("DROP TABLE IF EXISTS data_1") # 如果已经存在表格data则删除sql = """CREATE TABLE data_1 (ID INT PRIMARY KEY AUTO_INCREMENT,post CHAR(255),company CHAR(255),address CHAR(255),salary_min CHAR(255),salary_max CHAR(255),job CHAR(255),degreeform CHAR(255),edu CHAR(255))"""cursor.execute(sql)db.close()def insert(value):db = pymysql.connect(host="localhost", user="root", password="121200", database="students")cursor = db.cursor()sql = "insert into students.data_1(post,company,address,salary_min,salary_max,job,degreeform,edu) values (%s,%s,%s,%s,%s,%s,%s,%s)"try:cursor.execute(sql, value)db.commit()print('插入数据成功')except:db.rollback()print("插入数据失败")db.close()headers = {'Cookie': 'guid=1e658418e5c26810ae320ac5c3d625ef; nsearch=jobarea%3D%26%7C%26ord_field%3D%26%7C%26recentSearch0%3D%26%7C%26recentSearch1%3D%26%7C%26recentSearch2%3D%26%7C%26recentSearch3%3D%26%7C%26recentSearch4%3D%26%7C%26collapse_expansion%3D; ssxmod_itna=eqGOqfxmxIxjxmqGKGHRx1BWtEmDCq4ehmqPmbKDsoWDSxGKidDqxBecjeDteW3YADxxzGFrmrKeNF2LTdItFx44XatI/qqGLDmKDy7A8G3Dx1q0rD74irDDxD3yD7PGmDim1uXTqAQDQ4GyDitDKuX/DG3D0S==CGGyWnLyDBtXDGU7zqGIDYQD0kKD+S=llqGgl4GuDMWXYnNqumxlGA6isqDMbPGX70HoxDUsqIDDbOpneWiFxG6e6qQqx0PGm7PPfB5PBh4enF4KKH+flh4rYsqKKA4KF7khQ4+QDRz4DD3wAioPeD==; ssxmod_itna2=eqGOqfxmxIxjxmqGKGHRx1BWtEmDCq4ehmqPm4ikf8bDlxS0Dj4bo6Mdidqbc/DGq=KiBorx=PiR2G5wh8AZwHb4nClS8N8GnbwLKzqDqQMt5G5mCi0vGriQLcC3/ULKwxXbywC+HFT=iR2dISg3X7YE1WGiszOr0Cj0HFfjVR8GqaBNylOb9l3UzmYvuYL232kRTNb=HyOYFkwvO=aQn3d5y9hW9i09150dskp7zYm9+Nl2z=aa293uMYLuf1p2VjLGwZb0BizG87bQx5vyH+3fjCUR5TTj5Ou6mD37RU4gzfO5NRx4zg3oxeU2Wpuo5ioDohcixjrTDh1fd5Su=qoz83t2MTcYwx3trgkoxHOhoBRdErWXYtiQbnissqIU44E8qob4YDxvEY9iptErqn+woCnMYFwid8QB4YPL=3rs0ArEhxBfHS2KAj3Qx3L3x3x7yh=3BTGEC3b=IE3foCPq8Q2YKLrjxKTk+Q4L+kddY11k5GYIFfQhqKiLxlbPD7j4GmYpYqmcBa4M0GLeeP7f=7fGiDwGcdvOQTwGeeDjKDewD8gDYGx4D===; partner=sem_pcsogoupz_1; slife=lowbrowser%3Dnot%26%7C%26; search=jobarea%7E%60000000%7C%21ord_field%7E%600%7C%21recentSearch0%7E%60000000%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA0%A1%FB%A1%FApython%B9%A4%B3%CC%CA%A6%A1%FB%A1%FA2%A1%FB%A1%FA1%7C%21recentSearch1%7E%60000000%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA0%A1%FB%A1%FApython%A1%FB%A1%FA2%A1%FB%A1%FA1%7C%21recentSearch2%7E%60000000%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA0%A1%FB%A1%FAjava%A1%FB%A1%FA2%A1%FB%A1%FA1%7C%21recentSearch3%7E%60000000%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA0%A1%FB%A1%FAPython%A1%FB%A1%FA2%A1%FB%A1%FA1%7C%21recentSearch4%7E%60010000%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA%A1%FB%A1%FA0%A1%FB%A1%FAPython%A1%FB%A1%FA2%A1%FB%A1%FA1%7C%21collapse_expansion%7E%601%7C%21','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3870.400 QQBrowser/10.8.4405.400'
}def main():create()for page in range(1, 11):url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,python%25E5%25B7%25A5%25E7%25A8%258B%25E5%25B8%2588,2,{}.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='.format(page)response = requests.get(url, headers=headers).text# 正则查找r = re.findall('window.__SEARCH_RESULT__ = (.*?)</script>', response,re.S)string = ''.join(r)infodict = json.loads(string)# 字典的键获取对应的键值engine_search_result = infodict['engine_search_result']for i in engine_search_result:job_name = i['job_name'] # 工作名称workarea_text = i['workarea_text'] # 工作地company_name = i['company_name'] # 公司名称providesalary_text = i['providesalary_text'] # 工资salary = re.findall(r"\d+\.?\d*", providesalary_text)print(salary)try:salary_min = salary[0]salary_max = salary[1]except:IndexError: "list index out of range"updatedate = i['updatedate'] # 上传日期# attribute_text = []attribute_text = i['attribute_text']a = []a = attribute_textdegreefrom = a[1] # 工作经验edu = a[2] # 学历# 插入数据库value = (updatedate, company_name, workarea_text, salary_min, salary_max, job_name, degreefrom, edu)insert(value)if __name__ == '__main__':main()
爬取数据如下:
0基础爬虫前程无忧招聘信息相关推荐
- 抓取前程无忧招聘信息
抓取前程无忧招聘信息 本文通过分析前程无忧的相关规则,通过python来抓取相关的招聘信息,并通过redis缓存相关信息,实现增量抓取. 相关技术 python3.6 requests redis m ...
- 前程无忧招聘信息爬取
爬取前程无忧招聘信息 本文是关于招聘数据爬取,我们选取的网站是前程无忧. 百度直接搜索前程无忧,或者51job.我们将看到搜索栏,在搜索栏中输入"数据分析师"将可以看到工作信息. ...
- python爬虫找工作怎么找_python爬虫判断招聘信息是否存在的实例代码
在找工作的时候,我们会选择上网查询招聘的信息,或者是通过一些招聘会进行现场面试.但由于信息更新不及时,有一些岗位会出现下架的情况,如果我们不注意的话,可能就扑了空.在时间上耽误了不说,面试的信息也会受 ...
- java爬虫之WebMagic实战抓取前程无忧招聘信息
webmagic教程 http://webmagic.io/docs/zh/ 入门案例 package com.hikktn.webmagic;import us.codecraft.webmagic ...
- Python爬虫新手入门教学:爬取前程无忧招聘信息
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 基本开发环境 Python 3.6 Pycharm 相关模块的使用 requests parsel ...
- 数据采集:利用Scrapy采集前程无忧招聘信息
需求分析: 1.采集目标网站:前程无忧 https://www.51job.com/ 2.可根据工作关键字采集不同的工作类别.如"工程师","教师" 3.采集字 ...
- 手把手教你使用Python网络爬虫获取招聘信息
1.前言 现在在疫情阶段,想找一份不错的工作变得更为困难,很多人会选择去网上看招聘信息.可是招聘信息有一些是错综复杂的.而且不能把全部的信息全部罗列出来,以外卖的58招聘网站来看,资料整理的不清晰. ...
- requests+bs4+正则爬取前程无忧招聘信息进阶版
整理思路 获取所有职位信息的url 通过正则去掉不符合要求的url 爬取详情页信息 解析详情页 写入txt文件 循环抓取 提高速度多线程爬取 先放上url:https://search.51job.c ...
- 前程无忧招聘信息可视化(python)
一.爬虫 通过对比各个比较知名的招聘网站,发现有些网站反爬真的啥也爬不到,然后找到了前程无忧的手机端的网页. 分析网址(网址在爬虫代码中) 通过更新pageno的参数,进行分页爬取. 爬虫思路: 利用 ...
最新文章
- Linux内核网络协议栈
- JavaEE 资源注入
- python连不上树莓派_Python实现树莓派WiFi断线自动重连
- Android官方开发文档Training系列课程中文版:添加ActionBar之设置ActionBar
- python sqlite并发处理_python sqlite大数据 处理
- 通信原理实验c语言,基于LabVIEW软件的通信原理实验教学平台设计方案
- java设计一个user类_java – 如何使用两种不同类型的用户组织OO设计
- 微信公众账号调取用户昵称和用户头像
- 七年级计算机上册知识树,七年级上知识树.doc
- python图灵机器人微信号_IT之家学院:让你的微信号变成自动聊天机器人
- 11.Python初窥门径(函数名,可迭代对象,迭代器)
- 如何为物联网解决方案选择合适的物联网模块
- 蓝牙BQB认证所需资料和流程
- 城市区域二手房信息python爬取、保存和初步分析—笔记
- 【每天学点管理】——RACI责任制(快速解决责任分配问题)
- 天轰川 推荐的Javscript大收集 大集锦
- windows系统克隆虚拟机
- 浅析基于AI烟火识别的森林防火风险监测预警系统设计方案
- HarmonyOS系统中内核实现NFC无线通信的方法
- 【从本人QQ空间迁移】重构“依恋情结”(以黑名单的新增编辑为例)