当前位置: 首页 > news >正文

网站建立网络优化企点怎么群发消息

网站建立网络优化,企点怎么群发消息,wordpress中文网站优化,静态化网站和app的区别爬取时间#xff1a;2020-07-11#xff08;2020年10月测试#xff0c;增加了反爬#xff0c;此代码已失效#xff01;#xff01;#xff01;#xff09;实现目标#xff1a;根据用户输入的关键字爬取相关职位信息存入 MongoDB#xff0c;读取数据进行可视化展示。涉… 爬取时间2020-07-112020年10月测试增加了反爬此代码已失效实现目标根据用户输入的关键字爬取相关职位信息存入 MongoDB读取数据进行可视化展示。涉及知识请求库 requests、Xpath 语法、数据库 MongoDB、数据处理 Numpy、Pandas、数据可视化 Matplotlib。完整代码https://github.com/TRHX/Python3-Spider-Practice/tree/master/SpiderDataVisualization/51job其他爬虫实战代码合集持续更新https://github.com/TRHX/Python3-Spider-Practice爬虫实战专栏持续更新https://itrhx.blog.csdn.net/article/category/9351278 文章目录【1x00】获取数据 get_51job_data.py【01x01】构建请求地址【01x02】获取总页数【01x03】提取详情页 URL【01x04】提取职位信息【01x05】保存数据到 MongoDB【2x00】数据可视化 draw_bar_chart.py【02x01】数据初处理【02x02】数据清洗【02x03】绘制经验与平均薪资关系图【02x04】绘制学历与平均薪资关系图【3x00】数据截图【4x00】完整代码【1x00】获取数据 get_51job_data.py 【01x01】构建请求地址 以 Python 职位为例请求地址如下 第一页https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,1.html 第二页https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,2.html 第三页https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,3.html 初始化函数 def __init__(self):self.base_url https://search.51job.com/list/000000,000000,0000,00,9,99,%s,2,%s.htmlself.headers {user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.13 Safari/537.36}self.keyword input(请输入关键字)【01x02】获取总页数 在页面的下方给出了该职位一共有多少页使用 Xpath 和正则表达式提取里面的数字方便后面翻页爬取使用注意页面编码为 gbk。 def tatal_url(self):url self.base_url % (self.keyword, str(1))response requests.get(urlurl, headersself.headers)tree etree.HTML(response.content.decode(gbk))# 提取一共有多少页text tree.xpath(//div[classp_in]/span[1]/text())[0]number re.findall([0-9], text)number int(.join(number))print(%s职位共有%d页 % (self.keyword, number))return number【01x03】提取详情页 URL 定义一个 detail_url() 方法传入总页数循环提取每一页职位详情页的 URL将每一个详情页 URL 传递给 parse_data() 方法用于解析详情页内的具体职位信息。 提取详情页时有以下几种特殊情况 特殊情况一如果有前程无忧自己公司的职位招聘信息掺杂在里面他的详情页结构和普通的不一样页面编码也有差别。 页面示例https://51rz.51job.com/job.html?jobid115980776 页面真实数据请求地址类似于https://coapi.51job.com/job_detail.php?jsoncallbackkeysignparams{“jobid”:} 请求地址中的各参数值通过 js 加密https://js.51jobcdn.com/in/js/2018/coapi/coapi.min.js 特殊情况二部分公司有自己的专属页面此类页面的结构也不同于普通页面 页面示例http://dali.51ideal.com/jobdetail.html?jobid121746338 为了规范化本次爬取将去掉这部分特殊页面仅爬取 URL 带有 jobs.51job.com 的数据 def detail_url(self, number):for num in range(1, number1):url self.base_url % (self.keyword, str(num))response requests.get(urlurl, headersself.headers)tree etree.HTML(response.content.decode(gbk))detail_url1 tree.xpath(//div[classdw_table]/div[classel]/p/span/a/href)深拷贝一个 url 列表如果有连续的不满足要求的链接若直接在原列表里面删除则会漏掉一些链接因为每次删除后的索引已改变因此在原列表中提取不符合元素后在深拷贝的列表里面进行删除。最后深拷贝的列表里面的元素均符合要求。detail_url2 copy.deepcopy(detail_url1)for url in detail_url1:if jobs.51job.com not in url:detail_url2.remove(url)self.parse_data(detail_url2)print(第%d页数据爬取完毕 % num)time.sleep(2)print(所有数据爬取完毕)【01x04】提取职位信息 解析详情页时页面编码是 gbk但是某些页面在解析时仍然会报编码错误因此使用 try-except 语句捕捉编码错误UnicodeDecodeError如果该页面有编码错误则直接 return 结束函数。 def parse_data(self, urls):position: 职位wages: 工资region: 地区experience: 经验education: 学历need_people: 招聘人数publish_date: 发布时间english: 英语要求welfare_tags: 福利标签job_information: 职位信息work_address: 上班地址company_name: 公司名称company_nature: 公司性质company_scale: 公司规模company_industry: 公司行业company_information: 公司信息for url in urls:response requests.get(urlurl, headersself.headers)try:text response.content.decode(gbk)except UnicodeDecodeError:returntree etree.HTML(text)提取内容时使用 join 方法将列表转为字符串而不是直接使用索引取值这样做的好处是遇到某些没有的信息直接留空而不会报错position .join(tree.xpath(//div[classcn]/h1/text()))wages .join(tree.xpath(//div[classcn]/strong/text()))# 经验、学历、招聘人数、发布时间等信息都在一个标签里面逐一使用列表解析式提取content tree.xpath(//div[classcn]/p[2]/text())content [i.strip() for i in content]if content:region content[0]else:region experience .join([i for i in content if 经验 in i])education .join([i for i in content if i in 本科大专应届生在校生硕士])need_people .join([i for i in content if 招 in i])publish_date .join([i for i in content if 发布 in i])english .join([i for i in content if 英语 in i])welfare_tags ,.join(tree.xpath(//div[classjtag]/div//text())[1:-2])job_information .join(tree.xpath(//div[classbmsg job_msg inbox]/p//text())).replace( , )work_address .join(tree.xpath(//div[classbmsg inbox]/p//text()))company_name .join(tree.xpath(//div[classtCompany_sidebar]/div[1]/div[1]/a/p/text()))company_nature .join(tree.xpath(//div[classtCompany_sidebar]/div[1]/div[2]/p[1]//text()))company_scale .join(tree.xpath(//div[classtCompany_sidebar]/div[1]/div[2]/p[2]//text()))company_industry .join(tree.xpath(//div[classtCompany_sidebar]/div[1]/div[2]/p[3]/title))company_information .join(tree.xpath(//div[classtmsg inbox]/text()))job_data [position, wages, region, experience, education, need_people, publish_date,english, welfare_tags, job_information, work_address, company_name,company_nature, company_scale, company_industry, company_information]save_mongodb(job_data)【01x05】保存数据到 MongoDB 指定一个名为 job51_spider 的数据库和一个名为 data 的集合依次将信息保存至 MongoDB。 def save_mongodb(data):client pymongo.MongoClient(hostlocalhost, port27017)db client.job51_spidercollection db.datasave_data {职位: data[0],工资: data[1],地区: data[2],经验: data[3],学历: data[4],招聘人数: data[5],发布时间: data[6],英语要求: data[7],福利标签: data[8],职位信息: data[9],上班地址: data[10],公司名称: data[11],公司性质: data[12],公司规模: data[13],公司行业: data[14],公司信息: data[15]}collection.insert_one(save_data)【2x00】数据可视化 draw_bar_chart.py 【02x01】数据初处理 从 MongoDB 里面读取数据为 DataFrame 对象本次可视化只分析工资与经验、学历的关系所以只取这三项由于获取的数据有些是空白值因此使用 replace 方法将空白值替换成缺失值NaN然后使用 DataFrame 对象的 dropna() 方法删除带有缺失值NaN的行。将工资使用 apply 方法将每个值应用于 wish_data 方法即对每个值进行清洗。 def processing_data():# 连接数据库从数据库读取数据也可以导出后从文件中读取client pymongo.MongoClient(hostlocalhost, port27017)db client.job51_spidercollection db.data# 读取数据并转换为 DataFrame 对象data pd.DataFrame(list(collection.find()))data data[[工资, 经验, 学历]]# 使用正则表达式选择空白的字段并填充为缺失值然后删除带有缺失值的所有行data.replace(to_replacer^\s*$, valuenp.nan, regexTrue, inplaceTrue)data data.dropna()# 对工资数据进行清洗处理后的工作单位元/月data[工资] data[工资].apply(wish_data)return data【02x02】数据清洗 def wish_data(wages_old):数据清洗规则分为元/天千(以上/下)/月万(以上/下)/月万(以上/下)/年若数据是一个区间的则求其平均值最后的值统一单位为元/月if 元/天 in wages_old:if - in wages_old.split(元)[0]:wages1 wages_old.split(元)[0].split(-)[0]wages2 wages_old.split(元)[0].split(-)[1]wages_new (float(wages2) float(wages1)) / 2 * 30else:wages_new float(wages_old.split(元)[0]) * 30return wages_newelif 千/月 in wages_old or 千以下/月 in wages_old or 千以上/月 in wages_old:if - in wages_old.split(千)[0]:wages1 wages_old.split(千)[0].split(-)[0]wages2 wages_old.split(千)[0].split(-)[1]wages_new (float(wages2) float(wages1)) / 2 * 1000else:wages_new float(wages_old.split(千)[0]) * 1000return wages_newelif 万/月 in wages_old or 万以下/月 in wages_old or 万以上/月 in wages_old:if - in wages_old.split(万)[0]:wages1 wages_old.split(万)[0].split(-)[0]wages2 wages_old.split(万)[0].split(-)[1]wages_new (float(wages2) float(wages1)) / 2 * 10000else:wages_new float(wages_old.split(万)[0]) * 10000return wages_newelif 万/年 in wages_old or 万以下/年 in wages_old or 万以上/年 in wages_old:if - in wages_old.split(万)[0]:wages1 wages_old.split(万)[0].split(-)[0]wages2 wages_old.split(万)[0].split(-)[1]wages_new (float(wages2) float(wages1)) / 2 * 10000 / 12else:wages_new float(wages_old.split(万)[0]) * 10000 / 12return wages_new【02x03】绘制经验与平均薪资关系图 def wages_experience_chart(data):# 根据经验分类求不同经验对应的平均薪资wages_experience data.groupby(经验).mean()# 获取经验和薪资的值将其作为画图的 x 和 y 数据w wages_experience[工资].index.valuese wages_experience[工资].values# 按照经验对数据重新进行排序薪资转为 int 类型也可以直接在前面对 DataFrame 按照薪资大小排序wages [w[6], w[1], w[2], w[3], w[4], w[5], w[0]]experience [int(e[6]), int(e[1]), int(e[2]), int(e[3]), int(e[4]), int(e[5]), int(e[0])]# 绘制柱状图plt.rcParams[font.sans-serif] [Microsoft YaHei]plt.figure(figsize(9, 6))x wagesy experiencecolor [#E41A1C, #377EB8, #4DAF4A, #984EA3, #FF7F00, #FFFF33, #A65628]plt.bar(x, y, colorcolor)for a, b in zip(x, y):plt.text(a, b, b, hacenter, vabottom)plt.title(Python 相关职位经验与平均薪资关系, fontsize13)plt.xlabel(经验, fontsize13)plt.ylabel(平均薪资元 / 月, fontsize13)plt.savefig(wages_experience_chart.png)plt.show()【02x04】绘制学历与平均薪资关系图 def wages_education_chart(data):# 根据学历分类求不同学历对应的平均薪资wages_education data.groupby(学历).mean()# 获取学历和薪资的值将其作为画图的 x 和 y 数据wages wages_education[工资].index.valueseducation [int(i) for i in wages_education[工资].values]# 绘制柱状图plt.rcParams[font.sans-serif] [Microsoft YaHei]plt.figure(figsize(9, 6))x wagesy educationcolor [#E41A1C, #377EB8, #4DAF4A]plt.bar(x, y, colorcolor)for a, b in zip(x, y):plt.text(a, b, b, hacenter, vabottom)plt.title(Python 相关职位学历与平均薪资关系, fontsize13)plt.xlabel(学历, fontsize13)plt.ylabel(平均薪资元 / 月, fontsize13)plt.savefig(wages_education_chart.png)plt.show()【3x00】数据截图 一共有 34009 条数据完整数据已放在 github可自行下载。 MongoDB CSV 文件 JSON 文件 【4x00】完整代码 完整代码地址点亮 star 有 buff 加成https://github.com/TRHX/Python3-Spider-Practice/tree/master/SpiderDataVisualization/51job 其他爬虫实战代码合集持续更新https://github.com/TRHX/Python3-Spider-Practice 爬虫实战专栏持续更新https://itrhx.blog.csdn.net/article/category/9351278
http://wiki.neutronadmin.com/news/339300/

相关文章:

  • seo刷网站wordpress屏蔽搜索引擎
  • 哈尔滨网站建设排行wordpress下载资源
  • 建立门户网站的程序钉钉企业邮箱收费标准
  • 宁波网站建设怎么建设昆明网站做的好的公司哪家好
  • 网站怎么快速做收录医院网站建设作用
  • 常用的网站开发工具国外电商网站有哪些
  • 郑州 互联网 公司网站昨天新闻联播一级战备
  • 制作商务网站杭州网站推广方式
  • 网站建设规划书的空间酒店网站建设哪家好
  • 普陀做网站价格腾讯云新人服务器
  • 建设网站为什么要虚拟主机网站建设推广话术开场白
  • 唐山建网站唯品会一家专门做特卖的网站
  • asp 网站 内容静态化娄底网站建设报价
  • 做外汇网站网站 建设平台分析报告
  • 建设银行广州分行网站互联网下的网络营销
  • 青海市建设局网站便民类网站 做
  • 网站维护报价表宠物网页设计模板
  • 企业网站的建设与管理论文wordpress添加时间轴
  • discuz建站教程丽水网站建设企业
  • 做百度移动网站排微商城科技
  • 南宁seo网站建设海外网站推广
  • 做一家视频网站知名设计品牌有哪些
  • 网站型营销东莞网站建设优化推广
  • 推广网站的文案个人网站开发平台有哪些
  • 济南网站建设seo优化抖音广告投放收费标准
  • dedecms 把自己的网站添加进去软考培训机构哪家好一点
  • 具有价值的做网站wordpress做引导页
  • 功能型网站设计新网站建设的工作
  • 个人网站 不用备案二建注册信息查询系统官网
  • 做html网站模板网站推广做多大尺寸