目录

引入包

模拟登陆京东网

利用XPath对网页源代码进行解析

数据清洗

每页数据以追加形式保存至csv文件

保存数据到MongoDB数据库,参数为字典组成的列表

数据分析与可视化

总函数


引入包

from selenium import webdriver
from selenium.webdriver.common.by import By
#WebDriverWait类,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
#expected_contions类,负责条件触发
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
from lxml import etree
import pandas as pd
import time
import os
import re
from pymongo import *
import numpy as np
import matplotlib.pyplot as plt
from collections import Counter
from matplotlib.pyplot import MultipleLocator
import wordcloud
import jieba
import imageio
import csv
import re

模拟登陆京东网

def login(url, user, password):driver.get(url)driver.maximize_window()# 进入登录页面driver.find_element_by_link_text('登录').click()# 选择账户登录方式driver.find_element_by_link_text('账户登录').click()# 输入框输入账号和密码driver.find_element_by_id('loginname').send_keys(user)driver.find_element_by_id('nloginpwd').send_keys(password)driver.find_element_by_id('loginsubmit').click()#手动滑动验证码time.sleep(8)#切换界面后选择职位类别:研发类search_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//i[@class="arrow-down"]')))search_btn.click()driver.find_element_by_id('YANFA').click()#点击搜索driver.find_element_by_link_text('搜索').click()time.sleep(8)#进入到京东研发类招聘界面#可能进入界面后,研发类仍旧没有选出来,再次选择一下search_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//div[@class="suggess-sel"]/i')))search_btn.click()driver.find_element_by_xpath('//input[@value="YANFA"]').click()search_btn.click()time.sleep(5)return driver.page_source# 通过点击下一页按钮,获取出第1页外其它页网页源代码
def get_next_page():# 将滚动条拖动至页面底端,使下一页按钮显露出来driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")# 查找下一页按钮next_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.next')))# 单击按钮next_button.click()time.sleep(5)return driver.page_source

利用XPath对网页源代码进行解析

def parse_page(html):dom = etree.HTML(html)# 点击下拉框查看岗位描述和任职要求,以爬取信息for i in range(1, 11):driver.find_element_by_xpath('//div[@class="line"][{}]/div/span/b[@class="drop-down"]'.format(i)).click()# 职位名称careers_name = dom.xpath('//div[@class="info"]/span[1]/text()')# print(careers_name)# print(len(careers_name))# 职位类别careers_class = dom.xpath('//span[@class="sel"][1]/text()')# print(careers_class)# print(len(careers_class))# 工作地点careers_place = dom.xpath('//span[@class="sel"][2]/text()')# print(careers_place)# print(len(careers_place))# 发布时间published_time = dom.xpath('//div[@class="info"]/span[4]/text()')# print(published_time)# print(len(published_time))# 岗位描述published_info = []for p in range(1, 11):#需要获取每一个父节点内所有的子节点信息info = dom.xpath('string(//div[@class="line"][{}]/div[@class="detail"]/div[@class="par"][1])'.format(p))#正则表达式去除“岗位描述”多余字published=re.findall(r"岗位描述:(.*)",info,re.S)[0]published_info.append(published)# published_info = dom.xpath('//div[@class="detail"][1]/div[@class="par"]/p/string()')# print(published_info)# print(len(published_info))# 任职要求careers_requirement = []for p in range(1, 11):#同理岗位描述requirement = dom.xpath('string(//div[@class="line"][{}]/div[@class="detail"]/div[@class="par"][2])'.format(p))careers = re.findall(r"任职要求:(.*)", requirement,re.S)[0]careers_requirement.append(careers)# print(careers_requirement)# print(len(careers_requirement))data = pd.DataFrame({'职位名称': careers_name,'职位类别': careers_class,'工作地点': careers_place,'发布时间': published_time,'岗位描述': published_info,'任职要求': careers_requirement})return data

数据清洗

def data_cleaning(data):# 查看索引,维度print(result.shape)# 重复值data.drop_duplicates()#缺失值data.fillna("无",inplace=True)#异常值处理plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.figure() # 建立图像p=data.boxplot(return_type = 'dict')x = p['fliers'][0].get_xdata()y = p['fliers'][0].get_ydata()y.sort()print(x)print(y)# 使用annotate添加加标注,y[i]为标注的内容,xy表示标注点坐标,xytert表示注释坐标for i in range(len(x)):plt.annotate(y[i],xy = (x[i],y[i]), xytext = (x[i] + 0.05,y[i]))plt.show()#展示箱线图#按照列值进行排序data.sort_values("发布时间",ascending=False)return data

每页数据以追加形式保存至csv文件

#每页数据以追加形式保存至csv文件
def save_file(data):  # 参数为DataFramecolumns = ['职位名称', '职位类别', '工作地点', '发布时间','岗位描述', '任职要求']filename = './../data/京东研发类招聘信息.csv'if os.path.exists(filename):data.to_csv(filename, mode='a', encoding='utf_8_sig', columns=columns, index=False, header=False)else:data.to_csv(filename, mode='a', encoding='utf_8_sig', columns=columns, index=False)print("csv保存成功!")

保存数据到MongoDB数据库,参数为字典组成的列表

# 保存数据到MongoDB数据库,参数为字典组成的列表
def save_to_mongo(data):try:#dataframe转为字典data= data.to_dict(orient='records')collection.insert_many(data)print('Saved to Mongo')except Exception as e:print(e)

数据分析与可视化

# 数据分析与可视化
def analysis_visualization():#统计职位名称并画柱形图plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falsedata_path = "./../data/京东研发类招聘信息.csv"train_data = pd.read_csv(data_path)article = train_data["职位名称"]f = lambda x: x.split(" ")article_list = article.apply(f)word_counts = Counter()for line in article_list:word_counts.update(line)counter_list = sorted(word_counts.items(), key=lambda x: x[1], reverse=True)x = list(map(lambda x: x[0], counter_list[:5]))y = list(map(lambda y: y[1], counter_list[:5]))ax = plt.gca()# ax为两条坐标轴的实例x_major_locator = MultipleLocator(1)# 把x轴的刻度间隔设置为1,并存在变量里ax.xaxis.set_major_locator(x_major_locator)plt.bar(x, y)plt.xlabel('职位名称')plt.ylabel('数目')# 添加数据标签plt.title('职位名称')for i in range(len(x)):plt.text(x[i], y[i], y[i])plt.show()#统计工作地点并画扇形图data = train_data['工作地点']num = data.value_counts()plt.figure(figsize=(8, 8))  # 设置画布plt.pie(num, autopct='%.2f%%', labels=num.index)plt.axis("equal")plt.title('工作地点')plt.show()#统计发布日期并画折线图article = train_data["发布时间"]f = lambda x: x.split(" ")article_list = article.apply(f)word_counts = Counter()for line in article_list:word_counts.update(line)counter_list = sorted(word_counts.items(), key=lambda x: x[1], reverse=True)x = list(map(lambda x: x[0], counter_list[:5]))y = list(map(lambda y: y[1], counter_list[:5]))plt.plot(x, y)plt.title('发布时间')plt.xlabel('发布时间')plt.ylabel('数目')plt.show()##统计岗位描述化为词云maskImag = imageio.imread('./../img/京东岗位描述原图.jpg')wordcloudString = ''with open(data_path, 'r', encoding='utf-8') as f:data = csv.reader(f)for item in data:career = ''.join(item[4])wordcloudString += careerls = jieba.lcut(wordcloudString)txt = " ".join(ls)wc = wordcloud.WordCloud(font_path=r'C:\Windows\Fonts\微软雅黑\msyhbd.ttc',mask=maskImag,width=1000, height=700,background_color='white',)wc.generate(txt)wc.to_file('./../img/岗位描述.png')wc.to_image().show()# 统计任职要求化为词云maskImag = imageio.imread('./../img/京东任职要求原图.jpg')wordcloudString = ''with open(data_path, 'r', encoding='utf-8') as f:data = csv.reader(f)for item in data:career = ''.join(item[5])wordcloudString += careerls = jieba.lcut(wordcloudString)txt = " ".join(ls)wc = wordcloud.WordCloud(font_path=r'C:\Windows\Fonts\微软雅黑\msyhbd.ttc',mask=maskImag,width=1000, height=700,background_color='white',)wc.generate(txt)wc.to_file('./../img/任职要求.png')wc.to_image().show()

总函数

if __name__ == '__main__':# 账号:xxxxxuser = input("请输入账号:")#密码:xxxxxxpassword = input("请输入密码:")driver = webdriver.Chrome()wait = WebDriverWait(driver, 10)url = "http://zhaopin.jd.com/"#存储至mangodbclient = MongoClient()  # 创建连接db = client.jingdong  # 访问数据库collection = db.zhaopin # 创建集合#模拟登陆账号并且登录到招聘页,并选择研发类html = login(url, user, password)for i in range(1, 75):#倘若不是第一页if i != 1:html = get_next_page()data = parse_page(html)if i ==1:result= dataif i != 1:result = result.append(data)#print(data)print("第{}页爬取完成!".format(i))#数据预处理result=data_cleaning(result)#保存为csvsave_file(result)#保存至mangodbsave_to_mongo(result)#数据分析与可视化analysis_visualization()driver.close()

[python爬虫]selenium模拟登录京东招聘网,爬取研发类,数据清洗,数据存储,终数据分析和可视化相关推荐

  1. python -- 使用selenium模拟登录淘宝,爬取商品信息

    目录 环境 谷歌驱动下载 解析 结果 代码 环境 windows10 python3.7.3 selenium 谷歌 谷歌驱动 谷歌驱动下载 http://chromedriver.storage.g ...

  2. python爬虫-selenium模拟登录豆瓣获取cookies给requests使用

    1. selenium如何切换到iframe中操作 import time from selenium import webdriverurl = "https://www.douban.c ...

  3. Python post请求模拟登录淘宝并爬取商品列表!

    一.前言 大概是一个月前就开始做淘宝的爬虫了,从最开始的用selenium用户配置到selenium模拟登录,再到这次的post请求模拟登录.一共是三篇博客,记录了我爬取淘宝网的经历.期间也有朋友向我 ...

  4. Python爬虫实战,requests+openpyxl模块,爬取手机商品信息数据(附源码)

    前言 今天给大家介绍的是Python爬取手机商品信息数据,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样的纯文本 ...

  5. Python爬虫之模拟登录某招聘平台(拉勾网)

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:用户2769421 ( 想要学习Python?Pyth ...

  6. python爬虫开发之“智联招聘”网页爬取

    先贴上需求: 1. 输入起始页 和结束页 爬取智联招聘上 与python相关职业2. 爬取的信息包括 就业岗位名称 薪资 地区 公司名称 需求{包括学历和经验}3. 爬取的信息以字典形式保存到mong ...

  7. Python爬虫实战,requests+parsel模块,爬取二手房房源信息数据

    前言 最近在尝试用Python爬虫二手房房源信息数据,在这里给需要的小伙伴们提供代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样的纯文本 ...

  8. python爬虫入门教程04:招聘信息爬取

    前言

  9. Python爬虫——Cookie模拟登录

    文章目录 Python爬虫--Cookie模拟登录 1.Cookie模拟登录 2.Handler处理器 Python爬虫--Cookie模拟登录 1.Cookie模拟登录 现在很多网站需要用户成功登录 ...

最新文章

  1. 干货 | MTCNN实时人脸检测网络详解与代码演示
  2. 国内第一本micropython的书出版《机器人Python极客编程入门与实战》
  3. JQuery 总结(7) index() data() each() 选项卡 表单验证
  4. 统计 表格_电商运营表格合集,运营统计绩效策划,全套excel表拿来就用
  5. 插图 引用 同一行两个插图_将图标变成插图的五个简单步骤
  6. kube-scheduler 磁盘调度源码分析
  7. iOS 开发常用链接总结
  8. 局域网电脑屏幕桌面监控怎么样
  9. python 频数分布,频率分布
  10. Android模拟器编程,Android模拟器入门[转]
  11. 简述Z-Stack的基本工作原理与流程(OSAL操作系统)
  12. JSP页面调用log4j写日志文件
  13. js点击网页背景特效和js打字状态特效代码
  14. CS231n 02 Loss Functions and Optimization
  15. 用友U8 ERP恢复账套
  16. three.js加载obj模型 键盘控制模型局部动作
  17. 2016百度之星 - 测试赛(热身,陈题)1001,1002,1003,1004
  18. uniapp开发微信小程序使用painter绘制海报
  19. Pandas 如何保存较大文件。‘ValueError: This sheet is too large! Your sheet size is: 16388602, 3 Max sheet size
  20. 勒索变种有不变的特征吗?有相应的防护手段吗?

热门文章

  1. webmail lite php,WebMail Lite - 从Gmail,Yahoo,Outlook和其他管理和下载邮件
  2. 火焰识别python_一种基于人工智能的火焰图像识别方法与流程
  3. 你不去PEACH区块链俱乐部太可惜了,90后的人才呀,佩服五体投地
  4. Sack Panic漏洞TCP MSS机制(二)(together with myself)
  5. fft 估计载波频率程序_fft频率估计
  6. 哈工大 编译原理 复习笔记
  7. CSS 自定义Radio样式
  8. 【操作系统】实验三 进程调度模拟程序
  9. 研究团队开发AI系统,仅通过足迹来识别身份
  10. python解多元多次方程组_Python求解多重或非线性方程,python,多元,多次,方程组,线性方程组...