嗨喽~大家好呀,这里是魔王呐 ❤ ~!
[python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取](#python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取)
环境使用:
Python
Pycharm
模块使用:
selenium --> pip install selenium==3.141.0
time
csv
驱动下载地址: https://googlechromelabs.github.io/chrome-for-testing/#stable
小思路
今天案例使用: 谷歌浏览器
selenium 模拟人的行为操作浏览器:
自动打开浏览器, 获取网页上面数据内容
多页数据采集: 需要登陆账号才能实现翻页
通过selenium实现免登陆操作:
使用selenium访问网址的时候, 网页状态是登陆的状态
智联招聘如果你想要通过requests获取数据:
需要学习JS逆向 --> 瑞数5
js逆向比较复杂 --> 通过selenium去获取数据 但是效率很低
获取数据代码
"""导入模块"""
dart
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 导入自动化测试模块
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 导入csv模块
import csv
# 导入时间模块
import time
"""创建文件对象"""
dart
options = Options()
options.add_argument("--user-data-dir=C:\\Users\\shanhe\\AppData\\Local\\Google\\Chrome\\User Data")
f = open('data.csv', mode='w', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
'职位',
'公司',
'薪资',
'年薪',
'城市',
'区域',
'经验',
'学历',
'公司性质',
'公司规模',
'标签',
])
csv_writer.writeheader()
打开浏览器
dart
driver = webdriver.Chrome(options=options) # 实例化一个浏览器对象
访问目标网址
dart
driver.get('https://sou.zhaopin.com/?jl=538&kw=python&p=1')
"""页面下滑操作"""
dart
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def drop_down():
"""执行页面滚动的操作""" # javascript
for x in range(1, 12, 2): # 1 3 5 7 9 在你不断的下拉过程中, 页面高度也会变的
time.sleep(1)
j = x / 9 # 1/9 3/9 5/9 9/9
# document.documentElement.scrollTop 指定滚动条的位置
# document.documentElement.scrollHeight 获取浏览器页面的最大高度
js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
driver.execute_script(js)
"""
定位元素 <元素面板上面>
driver.find_element_by_css_selector() 通过css选择定位元素
driver.find_element_by_xpath() 通过xpath定位元素
driver.find_element_by_id() 通过 ID 定位元素
driver.find_element_by_class_name() 通过 class类 名定位元素
- find_elements 表示提取多个
- find_element 表示提取一个
网页元素内容还没有加载完成, 就直接获取相关数据, 可能得不到内容
"""
dart
def get_content():
# 延时等待 等元素内容加载完成
driver.implicitly_wait(10)
drop_down()
# 获取整页20条 职位信息标签
divs = driver.find_elements_by_css_selector('.joblist-box__item')
# for循环遍历
for div in divs:
"""提取具体数据
- get_attribute 表示获取标签属性
- text 表示获取标签文本
"""
dart
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
title = div.find_element_by_class_name('iteminfo__line1__jobname__name').get_attribute('title')
name = div.find_element_by_class_name('iteminfo__line1__compname__name').get_attribute('title')
salary = div.find_element_by_class_name('iteminfo__line2__jobdesc__salary').text
salary_info = salary.split(' · ')
if len(salary_info) == 2:
year_salary = salary_info[-1].replace('薪', '')
money = salary_info[0]
else:
year_salary = '12'
money = salary_info[0]
info = [i.text for i in div.find_elements_by_class_name('iteminfo__line2__jobdesc__demand__item')]
area_info = info[0].split('-') # 城市信息
# len(area_info) 统计元素个数 area_info==2 直接判断 area_info是否等于2
if len(area_info) == 2:
city = area_info[0] # 城市
area = area_info[1] # 区域
else:
city = area_info[0] # 城市
area = '未知'
exp = info[1] # 经验
edu = info[2] # 学历
tags = ','.join([j.text for j in div.find_elements_by_class_name('iteminfo__line3__welfare__item')])
cop_info = [x.text for x in div.find_elements_by_class_name('iteminfo__line2__compdesc__item')]
cop_type = cop_info[0]
cop_num = cop_info[1]
dit = {
'职位': title,
'公司': name,
'薪资': money,
'年薪': year_salary,
'城市': city,
'区域': area,
'经验': exp,
'学历': edu,
'公司性质': cop_type,
'公司规模': cop_num,
'标签': tags,
}
# 写入数据
csv_writer.writerow(dit)
print(dit)
for page in range(5):
get_content()
driver.find_element_by_css_selector('.soupager button:nth-child(7)').click()
可视化代码
dart
import pandas as pd
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
dart
df = pd.read_csv('data.csv')
df.head()
pyecharts官方文档链接: https://gallery.pyecharts.org/#/README
dart
info = df['区域'].value_counts().index.to_list()
num = df['区域'].value_counts().to_list()
dart
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 导入配置
from pyecharts import options as opts
# 导入饼图
from pyecharts.charts import Pie
# 随机生成数据
from pyecharts.faker import Faker
info = df['区域'].value_counts().index.to_list()
num = df['区域'].value_counts().to_list()
c = (
Pie()
.add(
"",
[
list(z)
for z in zip(
info,
num,
)
],
center=["40%", "50%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="上海python招聘区域分布情况"),
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
# 保存到html文件
# .render("上海python招聘区域分布情况.html")
)
print(Faker.choose()) # ['草莓', '芒果', '葡萄', '雪梨', '西瓜', '柠檬', '车厘子']
print(Faker.values()) # [116, 118, 134, 44, 62, 53, 31]
# 展示在jupyter上面
c.load_javascript()
dart
c.render_notebook()
dart
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 导入配置
from pyecharts import options as opts
# 导入饼图
from pyecharts.charts import Pie
# 随机生成数据
from pyecharts.faker import Faker
info = df['学历'].value_counts().index.to_list()
num = df['学历'].value_counts().to_list()
c = (
Pie()
.add(
"",
[
list(z)
for z in zip(
info,
num,
)
],
center=["40%", "50%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="上海python招聘学历分布情况"),
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
# 保存到html文件
# .render("上海python招聘区域分布情况.html")
)
c.render_notebook()
dart
# 导入配置
from pyecharts import options as opts
# 导入饼图
from pyecharts.charts import Pie
# 随机生成数据
from pyecharts.faker import Faker
info = df['经验'].value_counts().index.to_list()
num = df['经验'].value_counts().to_list()
c = (
Pie()
.add(
"",
[
list(z)
for z in zip(
info,
num,
)
],
center=["40%", "50%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="上海python招聘经验分布情况"),
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
# 保存到html文件
# .render("上海python招聘区域分布情况.html")
)
c.render_notebook()
dart
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker
info = df['经验'].value_counts().index.to_list()
num = df['经验'].value_counts().to_list()
c = (
Line()
.add_xaxis(info)
.add_yaxis("", num, is_smooth=True)
.set_global_opts(title_opts=opts.TitleOpts(title="上海python招聘经验分布情况"))
)
c.render_notebook()
尾语
最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬
希望本篇文章有对你带来帮助 🎉,有学习到一点知识~
躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。
最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇