介绍
爬取前程无忧的招聘信息,代码的实验过程中如果re解析报 “超出索引范围” 且索引是正确的,那就是你的响应数据可能出现问题(滑块验证什么的...)解决 --> 换浏览器来重新得到新的cookie,加随机的UA,加代理(这个可有可无),还可以可以清理cookie缓存
开发环境:
- Python 3.8
- Pycharm 2020
模块的使用:
import requests
import re
import json
import csv
from fake_useragent import UserAgent
import time
import random
数据来源分析
- 网页开发者工具进行抓包分析…F12打开开发者工具, 刷新网页
- 通过关键字进行搜索, 找到相应的数据, 查看response响应数据
- 确定数据之后, 查看headers确定请求url地址 请求方式 以及 请求参数
代码实现过程:
- 发送请求, 用python代码模拟浏览器对于url地址发送请求
- 获取数据, 获取服务器返回response响应数据
- 解析数据, 提取我们想要招聘信息数据 (定位到需要的内容)
- 保存数据, 保存到表格文件里面
代码如下:
# -*- coding:utf-8 -*-
# @Author:🎈RedBalloon
# @Time:2022/10/10-15:07
# @File:hehe.py
import requests
import re
import json
import csv
from fake_useragent import UserAgent
import time
import random
# 创建文件
f = open('python招聘信息.csv', mode='a', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
'职位',
'公司名',
'薪资',
'城市',
'经验',
'学历',
'公司类型',
'公司规模',
'福利待遇',
'发布日期',
'公司详情页',
'职位详情页',
])
# 写入表头
csv_writer.writeheader()
for page in range(1, 11):
print(f'----------------正在采集第{page}页数据内容----------------')
time.sleep(random.randint(1, 2))
# 确定url地址 --> 可以直接复制
url = f'https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,{page}.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='
# 模拟浏览器 headers 请求头 伪装
headers = {
'Cookie': '', # 复制自己的
# User-Agent 用户代理, 表示浏览器基本身份标识
'User-Agent': UserAgent().random
}
# 设置代理
proxies = {
'http': 'http://222.22.22.12:6666',
}
"""注意,有时候返回的200也不一定会是想要的数据内容,那就是被反爬了呗。反爬手段很多,解决方法也不少,打铁还得自身硬。"""
# 发送请求 使用什么请求方式, 取决于开发者工具里的内容
response = requests.get(url=url, headers=headers, proxies=proxies)
response.encoding = response.apparent_encoding
# <Response [200]> 响应对象 200 状态码 请求成功
print(response)
# 获取数据, 获取服务器返回响应数据---> 获取文本数据 print(response.text)
"""
解析数据 ---> 提取我们想要数据内容
解析方法比较多: re css xpath json解析.... 如何选择方法 根据返回数据类型以及我想要数据内容情况
re.findall() 调用re模块里面findall方法
通过re模块找到所有我们想要数据内容 ---> 告诉它去哪里找, 找什么样数据
正则匹配提取出来数据, 返回列表 --->
"""
# 提取招聘数据 re.findall()
html_data = re.findall(r'window.__SEARCH_RESULT__ =(.*?)</script>', response.text, re.S)[0]
# 把字符串数据转成json字典数据
json_data = json.loads(html_data)
# 字典取值 ---> 根据键值对取值 根据冒号左边的内容[键], 提取冒号右边的内容[值]
# for循环遍历 把列表里面数据一个一个提取出来
for index in json_data['engine_jds']:
dit = {
'职位': index['job_name'],
'公司名': index['company_name'],
'薪资': index['providesalary_text'],
'城市': index['workarea_text'],
'经验': index['attribute_text'][1],
'学历': index['attribute_text'][-1],
'公司类型': index['companytype_text'],
'公司规模': index['companysize_text'],
'福利待遇': index['jobwelf'],
'发布日期': index['issuedate'],
'公司详情页': index['company_href'],
'职位详情页': index['job_href'],
}
# 写入数据
csv_writer.writerow(dit)
print(f'完成{page}页的抓取')
评论 (0)