selenium无登录状态爬取Boss直聘

2023-10-27

BOSS是我很早就实现数据爬取的网站,那会直接用request即可,最近再次尝试以前的代码发现,它做了一些反爬处理,当你直接访问例如https://www.zhipin.com/c101210100/b_西湖区/?query=数据分析杭州这样的网址,会进行一个二次跳转,就算获取跳转后的网址再访问也是不行的,因为它的cookies里有一个_zp_stoken_,是js加密生成的,尽力一番之后宣告难以破解,直接祭出大杀器selenium+随机user-agent,轻松解决

代码已更新2020.3.18

思路就是用selenium进入要爬取的页面,通过随机的user-agent高效爬取数据,我这边随机的user-agent是保存在本地文件headers.csv中的,需要自取https://pan.baidu.com/s/11lBIclOHvVpBdgp3NyY0nA提取码 ar5z

# -*- coding: utf-8 -*-
import json
import os
import re
from urllib.parse import urlencode
import fake_useragent
from scrapy.selector import Selector
import requests
import time
from lxml import etree
from selenium import webdriver
import pandas as pd


'''
爬取BOSS职位
'''
# 方法二,从本地文件夹获取
location = os.getcwd() + 'headers.csv'
ka = fake_useragent.UserAgent(path=location, verify_ssl=False, use_cache_server=False)

# 构造请求头User-Agent
headers = {
		'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
		'accept-encoding':'gzip, deflate, br',
		'accept-language':'zh-CN,zh;q=0.9',
		'cache - control': 'max - age = 0',
		'referer':'https://www.zhipin.com/',
		'sec-fetch-mode':'navigate',
		'sec-fetch-site':'same-origin',
		'sec-fetch-user':'?1',
		'upgrade-insecure-requests':'1',
		'user-agent': ka.random,
		'X-Requested-With': 'XMLHttpRequest'
		}
data_my = []
get_url = 'https://www.zhipin.com/wapi/zpgeek/view/job/card.json?'


def main():
	'https://www.zhipin.com/c101210100/b_西湖区/?query=数据分析杭州'

	area_list ={'西湖区','余杭区','滨江区','江干区','萧山区','拱墅区','下城区','上城区'}

	chromedriver_path = 'C:/Users/machenike/Anaconda3/Scripts/chromedriver.exe'
	# 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium
	options = webdriver.ChromeOptions()
	options.add_experimental_option('excludeSwitches', ['enable-automation'])
	driver = webdriver.Chrome(executable_path=chromedriver_path, options=options)
	driver.maximize_window()

	for area in area_list:

		loginurl = 'https://www.zhipin.com/c101210100/b_' +area+'/?query=数据分析杭州'
		driver.get(loginurl)
		time.sleep(3.5)
		# Selenium为我们提供了get_cookies来获取登录cookies
		cookies = driver.get_cookies()
		jsonCookies = json.dumps(cookies)
		# 把cookies保存在本地
		with open('bossCookies.json', 'w') as f:
			f.write(jsonCookies)

		#获取信息
		get_detail(driver,area)
	# 写入本地CSV文件
	df = pd.DataFrame(data_my)
	df.to_csv('./shuju.csv', index=None, encoding='utf-8-sig', mode='a')
	time.sleep(0.5)
	print('已保存该数据到本地HR.csv文件夹')
	driver.close()

def get_detail(driver,area):
	source = etree.HTML(driver.page_source)
	node_list =source.xpath("//div[@class='job-list']/ul/li")
	# 用来存储所有的item字段\

	for node in node_list:
		item = {}
		# extract() 将xpath对象转换为Unicode字符串
		item['链接'] = node.xpath(".//div[@class='info-primary']/div[@class='primary-wrapper']/a/@href")[0]
		item['职位'] = node.xpath(".//div[@class='info-primary']/div[@class='primary-wrapper']/a/div[@class='job-title']/span[1]")[0].text
		item['薪资'] = node.xpath(".//div[@class='info-primary']/div[@class='primary-wrapper']/a/div[@class='job-limit clearfix']/span[1]")[0].text
		item['工作地点'] = area
		item['工作经验'] = node.xpath(".//div[@class='info-primary']/div[@class='primary-wrapper']/a/div[@class='job-limit clearfix']//p/text()[1]")[0]
		item['公司名称'] = node.xpath(".//div[@class='info-primary']/div[@class='info-company']/div[@class='company-text']/h3/a")[0].text
		item['所处行业'] = node.xpath(".//div[@class='info-primary']/div[@class='info-company']/div[@class='company-text']//p/text()[1]")[0]
		rong= node.xpath(".//div[@class='info-primary']/div[@class='info-company']/div[@class='company-text']//p/text()[2]")[0]
		if '人' in rong:
			item['融资轮']=''
		else:
			item['融资轮']=rong
		try:
			item['规模']=node.xpath(".//div[@class='info-primary']/div[@class='info-company']/div[@class='company-text']//p/text()[3]")[0]
		except:
			gui = node.xpath(".//div[@class='info-primary']/div[@class='info-company']/div[@class='company-text']//p/text()[2]")[0]
			if '人' in gui:
				item['融资轮'] = gui
			else:
				item['融资轮'] = ''



		item['jid'] = node.xpath(".//div[@class='info-primary']/div[@class='primary-wrapper']/a/@data-jid")[0]
		item['lid'] = node.xpath(".//div[@class='info-primary']/div[@class='primary-wrapper']/a/@data-lid")[0]
		ajson = get_info(item['jid'], item['lid'])
		item['岗位职责'] = get_json(ajson)
		print(item)
		data_my.append(item)

	#翻页
	if  source.xpath('//*[@id="main"]/div/div[3]/div[3]//a[@class="next"]'):
		next_page=driver.find_element_by_xpath('//*[@id="main"]/div/div[3]/div[3]//a[@class="next"]')
		driver.execute_script("arguments[0].click();", next_page)
		time.sleep(3.5)
		# Selenium为我们提供了get_cookies来获取登录cookies
		cookies = driver.get_cookies()
		jsonCookies = json.dumps(cookies)
		# 把cookies保存在本地
		with open('bossCookies.json', 'w') as f:
			f.write(jsonCookies)
		get_detail(driver,area)

def get_info(jid, lid):
	params = {
		'jid': jid,
		'lid': lid
	}

	# 获取cookies
	with open('bossCookies.json', 'r', encoding='utf-8') as f:
		listcookies = json.loads(f.read())

	# 把获取的cookies处理成dict类型
	cookies_dict = dict()
	for cookie in listcookies:
		# 在保存成dict时,只要cookies中的name和value
		cookies_dict[cookie['name']] = cookie['value']

	requests.adapters.DEFAULT_RETRIES = 5
	s = requests.session()
	# 关闭多余进程
	s.keep_alive = False
	#请求ajax获取岗位职责
	re = requests.get(get_url + urlencode(params), headers=headers, cookies=cookies_dict)
	time.sleep(0.2)
	if re.status_code == 200:
		vjson = re.json()
		return vjson
	else:
		print("获取失败")


def get_json(js):
	#处理字符串,由于返回的岗位职责是一个包含html的json数据,需要处理一下
	if js:
		json_content = js.get('zpData').get('html')
		content = Selector(text=json_content)
		content_text = content.css(".detail-bottom-text::text").re("[\u4e00-\u9fa5_a-zA-Z0-9]+")
		cont=''.join(content_text)
		return cont
	else:
		print("未获取数据")

if __name__ == '__main__':
	main()

	print("结束---------------------------------")

最后是这样的
在这里插入图片描述

补充:对于一直在加载中的情况,可能是webdriver的版本比较新吧,被检测出什么了,可以用以下方式打开网页,记得先配置环境变量中的path,改成自己电脑里谷歌浏览器chrome.exe所在路径,亲测可行

# 打开本地chrome,!!!!!!!!需要提前配置环境变量path
os.system('cd "C:\\Program Files (x86)\\Google\\Chrome\\Application"&start chrome.exe --remote-debugging-port=9999 --user-data-dir="C:\selenum\AutomationProfile" "https://www.zhipin.com/job_detail/?ka=header-job"')
chrome_debug_port = 9999
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", f"127.0.0.1:{chrome_debug_port}")
# selenium接管当前网页
driver = webdriver.Chrome(options=chrome_options)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

selenium无登录状态爬取Boss直聘 的相关文章

  • 如何读取通过追加行不断更新的文件?

    在我的终端中我正在运行 curl user dhelm 12345 https stream twitter com 1 1 statuses sample json gt raw data txt curl 的输出是实时流式 Twitte
  • Python 异常 - args 属性如何自动设置?

    假设我定义了以下异常 gt gt gt class MyError Exception def init self arg1 pass 然后我实例化该类以创建异常对象 gt gt gt e MyError abc gt gt gt e ar
  • 管理 Tweepy API 搜索

    如果这是对之前在其他地方回答过的问题的粗略重复 请原谅我 但我不知道如何使用 tweepy API 搜索功能 是否有任何有关如何使用搜索推文的文档api search 功能 有什么方法可以控制返回的推文数量 结果类型等功能 由于某种原因 结
  • 使用 Pillow 和 Numpy 进行图像推导

    I have two images and 我想导出一个只有红色 Hello 的图像 例如 所以我正在运行一个简单的推导python脚本 from PIL import Image import numpy as np root root
  • 顶级棉花糖模式验证

    From 棉花糖 validation http marshmallow readthedocs org en latest quickstart html validation 我知道我可以在架构中的特定字段上注册验证器 如果验证器失败
  • 如何在 kubernetes 上使多个 pod 相互通信

    我是 Kubernetes 新手 我正在尝试通过 microk8s 将应用程序部署到 Kubernetes 该应用程序包含Python Flask后端 Angular前端 Redis和MySQL数据库 我将映像部署在多个 Pod 中 状态显
  • 是否可以在 Sphinx 中隐藏 Python 函数参数?

    假设我有以下函数 该函数记录在Numpydoc 风格 https github com numpy numpy blob master doc HOWTO DOCUMENT rst txt 并且文档是自动生成的Sphinx http sph
  • 查找 python 数据框中每行的最高值

    我想找到每行中的最高值并返回 python 中该值的列标题 例如 我想找到每行的前两个 df A B C D 5 9 8 2 4 1 2 3 我希望我的输出看起来像这样 df B C A D 您可以使用字典理解来生成largest n数据帧
  • S3 选择检索 CSV 中的标头

    我尝试使用以下代码从存储在 S 存储桶中的 CSV 中获取记录子集 s3 boto3 client s3 bucket bucket file name file sql stmt SELECT S FROM s3object S LIMI
  • Highcharts 奇怪的分组行为

    我正在使用延迟加载 http www highcharts com stock demo lazy loading加载 OHLC 数据的方法 在服务器端 我使用 Python MySQL 并有 4 个包含 OHLC 数据的表 时间间隔为 5
  • 使用Python进行图像识别[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个想法 就是我想识别图像中的字母 可能是 bmp或 jpg 例如 这是一个包含字母 S 的 bmp 图像 我想做的是使用Pyth
  • Numpy 通过一个数组的值总结另一个数组

    我正在尝试找到一种矢量化方法来完成以下任务 假设我有一个 x 和 y 值的数组 请注意 x 值并不总是整数并且可以为负数 import numpy as np x np array 1 1 1 3 2 2 2 5 4 4 dtype flo
  • 如何在 Python 中将 EXR 文件的 float16 转换为 uint8

    我正在使用 OpenEXR 读取 Python 中的 EXR 文件 我有带有半数据 float16 的 R G 和 B 通道 我尝试使用 Numpy 将数据从 float16 转换为 uint8 0 255 颜色 但没有成功 rCh get
  • django 中的“管理器”是什么?

    我已经阅读了Django官方中的定义文档 https docs djangoproject com en dev topics db managers 我仍然对什么感到困惑Manager does 文档说它们允许您操作数据库表 模型 但我仍
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • Python:使用for循环更改变量后缀

    我知道这个问题被问了很多 但到目前为止我无法使用 理解答案 我想改变for循环中变量的后缀 我尝试了 stackoverflow 搜索提供的所有答案 但很难理解提问者经常提出的具体代码 因此 为了清楚起见 我使用一个简单的示例 这并不意味着
  • 与 GNU Make 等 Python 相关的并行任务并发

    我正在寻找一种方法或者可能是一种哲学方法来如何在 python 中执行类似 GNU Make 的操作 目前 我们使用 makefile 来执行处理 因为 makefile 非常擅长通过更改单个选项 j x 进行并行运行 此外 gnu mak
  • 如何从外语线程调用Python函数(C++)

    我正在开发一个程序 使用 DirectShow 来抓取音频数据 媒体文件 DirectShow 使用线程将音频数据传递给回调 我的程序中的函数 然后我让该回调函数调用另一个函数 Python 中的函数 我使用 Boost Python 来包
  • 在Python中打开网站框架或图像

    所以我对 python 相当熟练 并且经常使用 urllib2 和 Cookies 来实现网站自动化 我刚刚偶然发现了 webbrowser 模块 它可以在默认浏览器中打开一个网址 我想知道是否可以从该 url 中仅选择一个对象并打开它 具
  • 如何有效地计算另一列中每个元素的较大元素的数量?

    我有以下内容df name created utc 0 t1 cqug90j 1430438400 1 t1 cqug90k 1430438400 2 t1 cqug90z 1430438400 3 t1 cqug91c 143043840

随机推荐

  • 头歌答案Python,001

    金宝 答案在这里 自己抄 1 第一关 计算机 num 1 int input 请输入第一个数 print num 1 num 2 int input 请输入第二个数 print num 2 alg input 请选择要执行的运算符 prin
  • 单测mock和stub

    A variety of different terms are used to refer to these custom objects In an effort to clarify the vocabulary Gerard Mes
  • Design1.CMOS工艺OD门,传输门,三态门原理应用浅析

    纲要 OD门 传输门 三态门 1 OD门 i 概念 在CMOS电路中为了满足输出电平变换 吸收大负载电流以及实现线与连接等需要 需要将输出级电路结构改为漏极开路输出的MOS管 构成漏极开路输出 Open Drain Output 门电路 简
  • Android中的Selector的用法

    Android中的Selector主要是用来改变ListView和Button控件的默认背景 其使用方法可以按一下步骤来设计 以在mylist view xml为例 1 创建mylist view xml文件 首先在res目录下新建draw
  • 栈与队列小总结

    思维导图 一 栈 栈 一种数据结构 具有后进先出的特点 有两种实现方式 第一种实现方式就是用数组结构来实现 第二种方式就是用链表的方式来实现 但是由于使用数组的方式来实现栈会更加的好 所以在这里我们用数组的方式来实现栈 栈的实现 1 栈的结
  • 红蓝对抗--蓝队

    2019年参加护网行动的时候 想着是信安专业 可以去赚点零花钱 蓝队的工作 后面总结了一下护网行动和蓝队的一些工作重心 刚刚换电脑的时候翻出来了这个文章 只是个人拙见 大佬勿喷 文章目录 一 团队组建 二 梳理资产 三 风险梳理 四 减少攻
  • 面试求职经历及遇到的部分问题

    转眼间已经工作一年多了 最近想换个工作环境 就选择了跳槽 跳槽对我们程序猿来说并没什么稀奇 但这是我第一次跳槽 也颇感激动 哈哈 总的来说 这次找工作还是相对去年来说比较容易的 毕竟已经工作一年了嘛 记得去年的时候投20份简历也不一定会有面
  • Lesson 7 Edge I

    一 图像分割与不连续 图像分割 segmentation 的目的是把图像中的像素分组 每组像素和图像中的物体强相关 图像分割需要确定图像中的不连续处 不连续处 discontinuity 包括孤立点 线段和边缘 edge 我们首先介绍edg
  • eclipse的new server里tomcat7.0根本选不上解决方法

    创建Tomcat v7 0 Server 不能进行下一步 解决方法 1 退出 eclipse 2 到 工程目录下 metadata plugins org eclipse core runtime 3 把org eclipse wst se
  • 查看函数和所在的行号

    查看Linux下 a库文件中文件 函数 变量等情况 2013 02 24 16 11 02 转载 在Linux 下经常需要链接一些 a的库文件 那怎么查看这些 a 中包 含哪些文件 函数 变量 1 查看文件 ar t a 2 查看函数 变量
  • 最全的Linux运维bash脚本常见用法总结

    删除重复的数组元素 创建临时关联数组 设置关联数组 值并发生重复赋值时 bash会覆盖该键 这 允许我们有效地删除数组重复 CAVEAT 需要bash4 示例功能 remove array dups Usage remove array d
  • 所有pyCharm2018或phpstorm2018版永久激活,亲测无问题

    注意 实际测试软件版本为phpstorm2018 2 3 破解补丁激活 到http idea lanyus com 这里下载补丁 下载 后并将 JetbrainsCrack release enc jar 放置到 D盘根目录 在 Pycha
  • [STM32F4]【把握住了】STM32F4驱动4路VL53L0测距你把握不住

    最近给朋友调试了STM32F407驱动VL53L0的激光测距 安装在机器人上的 遇到一些问题 这里发帖纪录一下 关于VL53L0的资料和代码在正点原子那里都有 但是正点原子只是驱动了一路VL53L0 很多问题都需要我们自己解决 一路的VL5
  • Pikachu靶场之XSS漏洞详解

    Pikachu靶场之XSS漏洞详解 前言 XSS漏洞简述 第1关 反射型xss get 第2关 反射性xss post 第3关 存储型xss 第4关 DOM型xss 第5关 DOM型xss x 第6关 xss盲打 第7关 xss之过滤 第8
  • ATM 网络安全:解决方案、技术和规格--网络大典

    比起 TCP IP 网络 异步传输模式 ATM 网络通常拥有较少的安全漏洞 因为它通常使用光纤作为媒介 并被当作骨干网络用于专用或半专用网络中 侵入 ATM 网络所需的投入是相当高的 然而在 ATM 网络中仍然存在着许多弱点 如信息嗅探 基
  • RTT-线程管理

    RTT 线程管理 官方API文档 https www rt thread org document api group thread html 概念 线程是竞争系统资源的最小运行单元 每个线程在自己的环境中运行 在任何时刻 只有一个线程得到
  • pip 安装 flask_sqlalchemy 报错

    报错一 Errno 13 Permission denied 报错二 ERROR After October 2020 you may experience errors when installing or updating packag
  • Mac电脑如何删除磁盘及双系统分区?

    对于一些新手来说 在使用Mac电脑时可能会选择对硬盘进行分区或者安装双系统 但是 如果后期不需要这些分区时 如何删除它们呢 首先在应用程序中找到实用工具并打开文件夹 然后选择磁盘工具打开 在左侧选中需要修改的磁盘 接着在右侧上方菜单中点击
  • 【当LINUX系统出现网络问题时该如何排查】

    当LINUX出现网络问题时该如何排查 具体问题具体分析 遵循相应的排查思路 一 网络不通时需要进行的处理 1 检测链路是否连通 2 网卡是否正常启用 3 检测路由与网关的配置 4 DNS工作状况 5 检测是否可以正常路由到远程主机 6 检查
  • selenium无登录状态爬取Boss直聘

    BOSS是我很早就实现数据爬取的网站 那会直接用request即可 最近再次尝试以前的代码发现 它做了一些反爬处理 当你直接访问例如https www zhipin com c101210100 b 西湖区 query 数据分析杭州这样的网