模块使用介绍:
1. requests
- 作用: 用于发送HTTP请求,获取Web页面的内容。
- 重要性: 在网络爬虫中广泛使用,可方便地获取并处理网页数据。
2. DrissionPage(自动化模块)
- 作用: 提供自动化操作浏览器的功能,如模拟浏览器行为、填写表单等。
- 重要性: 在网页数据爬取和交互方面非常有用,可以自动执行网页操作,节省时间和精力。
3. csv
- 作用: 用于读写CSV(逗号分隔值)文件,以便存储和处理表格数据。
- 重要性: 在数据处理和导出方面十分实用,可将数据保存为CSV格式,便于后续分析或共享。
4. pandas -- 未使用
- 作用: 提供数据结构和数据分析工具,支持数据索引、数据操作和数据可视化。
- 重要性: 在数据处理和分析中常用,可以高效地处理大型数据集和进行统计分析。
5. pyecharts -- 未使用
- 作用: 用于生成交互式的图表和数据可视化。
- 重要性: 提供丰富的图表类型和交互功能,能够让数据更加直观地展现给用户。
代码逻辑描述:
-
导入模块和工具:
- 首先,导入所需的模块和工具,包括requests、DrissionPage、csv等。
-
创建CSV文件对象:
- 使用csv模块创建一个CSV文件对象,设置字段名称,并写入文件头部。
-
打开浏览器并访问网站:
- 利用DrissionPage库创建浏览器对象(driver),并使用get()方法访问目标网站,此处为前程无忧招聘信息页面。
-
循环遍历网页:
- 设定循环,遍历每一页的招聘信息,以提取所需数据。
-
提取招聘信息:
- 在循环内部,通过定位页面元素的方式,提取每条招聘信息中的职位、薪资、地区、经验、学历、公司、领域、标签等信息。
-
保存数据到CSV文件:
- 将提取的数据存储到一个字典中,然后使用csv模块将字典写入CSV文件中。
-
翻页操作:
- 在每一页数据提取完成后,通过翻页功能继续采集下一页的招聘信息,直至采集完所有页面的数据。
-
关闭浏览器和文件:
- 最后,关闭浏览器对象(driver)和CSV文件对象,并完成数据采集和保存过程。
代码部分:
"""
模块使用
requests
DrissionPage(自动化模块)
csv
pandas
pyecharts
"""
# 导入自动化模块
from DrissionPage import ChromiumPage
import json
import csv
import time
# 创建文件对象
f = open('前程无忧.csv',mode='w',encoding='utf-8',newline='')
# 字典方式写入
csv_write=csv.DictWriter(f,fieldnames=[
'职位',
'薪资',
'年薪',
'城市',
'区域',
'经验',
'学历',
'公司',
'领域',
'标签'
])
# 写入表头
csv_write.writeheader()
# 打开浏览器
driver = ChromiumPage()
# 访问网站
driver.get('https://we.51job.com/pc/search?jobArea=010000,020000&keyword=python%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88&searchType=2&sortType=0&metro=')
# 元素定位获取相关内容
'''
css:标签属性提取数据内容->查看数据标签位置
xpath:标签节点提取数据内容
'''
for page in range(1,51):
print(f'正在采集第{page}页数据。')
# 下滑页面
driver.scroll.to_bottom()
divs=driver.eles('css:.joblist-item')
for div in divs:
info=div.ele('css:.joblist-item-job').attr('sensorsdata')
# 把json字符串数据,转换成json字典
json_data=json.loads(info)
'''通过字典键值对取值,提取数据内容'''
jobTittle=json_data['jobTitle'] #职位
jobSalary=json_data['jobSalary'].split('·')# 薪资
jobArea=json_data['jobArea'].split('·') # 地区
jobYear=json_data['jobYear'] # 经验
jobDegree=json_data['jobDegree'] # 学历
# 判断元素
if len(jobSalary) == 2:
money = jobSalary[0]
money_year = jobSalary[1]
else:
money=jobSalary[0]
money_year= '12薪'
if len(jobArea) == 2:
city = jobArea[0]
Area = jobArea[1]
else:
city = jobArea[0]
Area = '未知'
cname=div.ele('css:.cname').attr('title') # 提取标签属性 公司
try:
cname_text = div.ele('css:.dc.text-cut').text # 提取标签文字 领域
except:
cname_text = div.ele('css:.dc.shrink-0').text # 提取标签文字 领域
# 提取多个标签内容 ->返回列表
tags=div.eles('css:.tag')
# 提取标签里面内容 通过列表推导式 .join()
tage_info=' '.join([i.text for i in tags])
# 保存数据到字典中
dit={
'职位':jobTittle,
'薪资':money,
'年薪':money_year,
'城市':city,
'区域':Area,
'经验':jobYear,
'学历':jobDegree,
'公司':cname,
'领域':cname_text,
'标签':tage_info,
}
# 写入数据
csv_write.writerow(dit)
print(dit)
# 点击下一页
driver.ele('css:.btn-next').click()