python爬虫爬取前程无忧上关于python岗位的信息

python爬虫爬取前程无忧上关于python岗位的信息

redballoon
2022-10-10 / 0 评论 / 15 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年02月20日,已超过36天没有更新,若内容或图片失效,请留言反馈。

介绍

爬取前程无忧的招聘信息,代码的实验过程中如果re解析报 “超出索引范围” 且索引是正确的,那就是你的响应数据可能出现问题(滑块验证什么的...)解决 --> 换浏览器来重新得到新的cookie,加随机的UA,加代理(这个可有可无),还可以可以清理cookie缓存

1.jpg

开发环境:

  • 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地址 请求方式 以及 请求参数

代码实现过程:

  1. 发送请求, 用python代码模拟浏览器对于url地址发送请求
  2. 获取数据, 获取服务器返回response响应数据
  3. 解析数据, 提取我们想要招聘信息数据 (定位到需要的内容)
  4. 保存数据, 保存到表格文件里面

代码如下:

# -*- 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&degreefrom=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}页的抓取')

运行结果:

Snipaste_2022-10-10_17-10-00.png
Snipaste_2022-10-10_17-10-58.png

0

评论 (0)

取消