获取boss直聘的岗位信息--2023年7月份

在本篇博客中,我将分享如何使用Selenium进行网页数据采集,并展示一个具体的代码示例。我们将通过Selenium访问一个招聘网站,抓取招聘信息,并将数据保存到CSV文件中。

环境配置

首先,我们需要确保Selenium和其他依赖库的安装。此示例中使用的是Selenium 3.141.0版本和urllib3 1.26.0版本。以下是代码完整示例:

​
from selenium import webdriver
#selenium版本是3.141.0配合urlib3的版本是1.26.0
import time
from selenium.webdriver.common.by import By
import random
import pandas as pd
def Chrome():
    """selenium制作请求"""
    chrome_driver = './chromedriver.exe'
    option = webdriver.ChromeOptions()  # 配置Chrome驱动
    # option.add_argument("--headless")  # 无界面启动
    option.add_experimental_option('useAutomationExtension', False)  # 禁用Chrome的自动化拓展程序
    option.add_experimental_option('excludeSwitches', ['enable-automation'])  # 确保浏览器不会因为启用自动化模式而出现不必要的错误或异常。
    option.add_argument("--disable-blink-features=AutomationControlled")  # 禁用由自动化测试或脚本控制的 Blink 功能。
    bs = webdriver.Chrome(chrome_options=option, executable_path=chrome_driver)

    # webdriver防屏蔽,不加这个就会出现滑动失败
    bs.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
           Object.defineProperty(navigator, 'webdriver', {
             get: () => false
           })
         """
    })
    return bs
hhh = 'https://www.zhipin.com/web/geek/job?query=java&city=101280100&'
def PQ(bs):
    """数据解析与请求链接查询"""
    qwer = []
    for i in range(1, 11):
        bs.get(url=hhh + "page=%d" % i)
        num = random.randint(10, 15)
        print("在第%d页停止时间"%i, num)
        time.sleep(num)
        bs.page_source
        print("当前正在采集的是第%d页数据" % i)
        print()
        if i == 1:
            for j in range(1, 31):
                name = bs.find_element(by=By.XPATH,
                                       value='//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[2]/ul/li[%d]/div[1]/a/div[1]/span[1]' % j)
                dz = bs.find_element(by=By.XPATH,
                                     value='//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[2]/ul/li[%d]/div[1]/a/div[1]/span[2]/span' % j)
                xz = bs.find_element(by=By.XPATH,
                                     value='//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[2]/ul/li[%d]/div[1]/a/div[2]/span[1]' % j)
                gs = bs.find_element(by=By.XPATH,
                                     value='//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[2]/ul/li[%d]/div[1]/div/div[2]/h3/a' % j)
                fl = bs.find_element(by=By.XPATH,
                                     value='//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[2]/ul/li[%d]/div[2]/div' % j)
                jy = bs.find_element(by=By.XPATH,
                                     value='//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[2]/ul/li[%d]/div[1]/a/div[2]/ul/li[1]' % j)
                time.sleep(1)
                print(name.text, dz.text, xz.text, gs.text, fl.text, jy.text)
                www=[name.text, dz.text, xz.text, gs.text, fl.text, jy.text]
                qwer.append(www)
        else:
            for j in range(1, 31):
                name = bs.find_element(by=By.XPATH,
                                       value='//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[1]/ul/li[%d]/div[1]/a/div[1]/span[1]' % j)
                dz = bs.find_element(by=By.XPATH,
                                     value='//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[1]/ul/li[%d]/div[1]/a/div[1]/span[2]/span' % j)
                xz = bs.find_element(by=By.XPATH,
                                     value='//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[1]/ul/li[%d]/div[1]/a/div[2]/span[1]' % j)
                gs = bs.find_element(by=By.XPATH,
                                     value='//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[1]/ul/li[%d]/div[1]/div/div[2]/h3/a' % j)
                fl = bs.find_element(by=By.XPATH,
                                     value='//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[1]/ul/li[%d]/div[2]/div' % j)
                jy = bs.find_element(by=By.XPATH,
                                     value='//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[1]/ul/li[%d]/div[1]/a/div[2]/ul/li[1]' % j)
                time.sleep(1)
                print(name.text, dz.text, xz.text, gs.text, fl.text, jy.text)
                www = [name.text, dz.text, xz.text, gs.text, fl.text, jy.text]
                qwer.append(www)
        time.sleep(2)
        return qwer
def down_load(qwer):
    """保存数据"""
    columns = ['a', 'b', 'c', 'd', 'e', 'f']
    df = pd.DataFrame(qwer, columns=columns)
    df.to_csv('Boss直聘.csv', index=False)
if __name__=="__main__":
    bs=Chrome()
    qwer=PQ(bs)
    down_load(qwer)
    bs.quit()

​

代码解析

  1. 浏览器初始化

    • 函数 Chrome() 初始化并配置Chrome浏览器,以避免被网站检测到是自动化脚本。
    • 配置选项包括禁用自动化扩展、避免显示自动化模式警告等。
  2. 数据采集与解析

    • 函数 PQ(bs) 通过循环访问指定的招聘页面,抓取职位名称、地点、薪资、公司、领域和经验要求等信息。
    • 采用随机等待时间来模拟人类行为,避免被反爬虫机制检测。
    • 处理每一页的数据,捕捉可能的异常。
  3. 数据保存

    • 函数 down_load(data) 将采集到的数据保存到CSV文件中,便于后续分析和处理。

使用体验与感想

在使用这些大模型和自动化工具时,我发现它们极大地提升了数据采集和处理的效率,特别是在面对大量重复性任务时。此外,随着技术的进步和工具的不断优化,AIGC产品在精确度、稳定性和用户体验方面有了显著的提升。

展望未来

未来,大模型产品将在个性化定制、多模态处理、实时互动、安全性和跨领域应用等方面取得更多突破。随着技术的不断发展,我们可以期待这些工具在各个行业中发挥更大的作用,为我们的工作和生活带来更多便利和创新。

希望这篇博客对大家在使用Selenium进行网页数据采集时有所帮助,也欢迎大家分享自己的使用体验和看法!

获取Boss的`__zp_stoken` cookie,你需要模拟浏览器行为并解析JavaScript加密的cookie。这里是一个基本步骤概述: 1. **设置网络代理**[^1]: 使用如Selenium、Scrapy-Splash或单纯的浏览器自动化工具(如ChromeDriver)来设置网络代理,以便捕获实际发送到服务器的请求。 2. **登录并访问页面**: 通过上述工具加载Boss的网页,比如初始的求职搜索页面,这通常会触发对`__zp_stoken` cookie的获取。 3. **分析网络请求**: 查看浏览器开发者工具(如Chrome的Network或Firefox的Developer Tools)中的网络请求,找到与登录相关的POST请求,特别是那些带着`__zp_stoken`参数的。 4. **识别加密逻辑**: JavaScript可能会加密cookie值,观察返回的响应头中的Set-Cookie字段,注意其中可能包含了加密算法和初始化向量(IV)。 5. **解密cookie**: 根据JavaScript加密代码,通常涉及Base64编码、哈希或加盐哈希等,尝试重现加密过程。可以使用Python的`requests`库配合`jsbeautifier`或`CryptoJS`等库来帮助解密。 ```python # 示例代码片段(可能需要根据实际情况调整) from requests import get from jsbeautifier import js_beautify # 假设你已经有了加密后的cookie值和加密相关配置 encrypted_cookie = "..." # 从网络抓包得到的加密值 encryption_config = {"algorithm": ..., "salt": ...} # 解析网页源码获得的配置 # 可能的解密过程(基于CryptoJS的AES-256-CBC示例) def decrypt_cookie(encrypted_value, config): # 加载加密代码并美化以提取关键信息 decrypted_code = js_beautify(your_encryption_script) # 使用BeautifulSoup或其他方式从解构的JS代码中提取解密函数和参数 decryption_func, params = extract_function_and_params(decrypted_code) # 调用解密函数 decrypted_value = decryption_func(encrypted_value, *params, **config) return decrypted_value decrypted_stoken = decrypt_cookie(encrypted_cookie, encryption_config) ``` 请注意,实际操作中可能需要对加密逻辑有深入理解,也可能需要针对不同版本或实现做定制化处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值