Python实战:使用selenium及BeautifulSoup4进行BOOS直聘信息爬取与数据累积【附源码】

这篇具有很好参考价值的文章主要介绍了Python实战:使用selenium及BeautifulSoup4进行BOOS直聘信息爬取与数据累积【附源码】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

运行环境要求

  • 操作系统:适用于Windows、macOS、Linux。
  • Python版本:Python 3.6及以上。
  • 依赖库
    • selenium:用于模拟浏览器操作。
    • webdriver_manager:自动管理驱动程序。
    • BeautifulSoup4:解析HTML页面。
    • pandas:数据处理和CSV文件操作。
    • logging:日志记录。
      pip install selenium webdriver_manager beautifulsoup4 pandas

设计思路

本项目旨在通过Selenium模拟用户浏览器行为,获取特定网站(如Boss直聘)上的职位信息,并利用BeautifulSoup解析这些信息。为了实现数据的持续累积而不是每次运行都覆盖原有数据,采用pandas进行数据合并和去重,最终将更新后的数据保存到CSV文件中。文章来源地址https://www.toymoban.com/news/detail-859556.html

具体实践

  1. 初始化Selenium WebDriver:配置ChromeDriver,启动Chrome浏览器实例。
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from webdriver_manager.chrome import ChromeDriverManager
    
    options = webdriver.ChromeOptions()
    try:
        driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    except Exception as e:
        logging.error(f"创建WebDriver时出错: {e}")
        raise
  2. 获取并保存Cookies:访问目标网站并手动登录,然后保存Cookies以便后续自动登录使用。
    def 获取cookie(driver, url):
        logging.info("开始获取cookie")
        driver.get(url)
        time.sleep(30)  # 等待足够的时间手动登录并保存cookies
        cookies = driver.get_cookies()
        with open('cookies.json', 'w') as f:
            json.dump(cookies, f)
        logging.info("Cookie获取完毕并已保存")
  3. 加载Cookies实现自动登录:在后续的会话中加载之前保存的Cookies,实现自动登录。
    def 加载cookie(driver, cookie_file='cookies.json'):
        logging.info("开始加载cookie")
        with open(cookie_file, 'r') as f:
            cookies = json.load(f)
            for cookie in cookies:
                if 'expiry' in cookie:
                    del cookie['expiry']  # 删除过期时间,避免格式错误
                driver.add_cookie(cookie)
        logging.info("Cookie加载完毕")
  4. 爬取职位信息:访问职位列表页面,使用BeautifulSoup解析页面,提取职位相关信息。
    from bs4 import BeautifulSoup
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    def 获取职位信息(driver, base_url, pages=1):
        logging.info("开始获取职位信息")
        职位信息_list = []  
        for i in range(1, pages + 1):
            url = f'{base_url}&page={i}'
            driver.get(url)
            WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "job-card-wrapper")))
            soup = BeautifulSoup(driver.page_source, 'html.parser')
            jobs = soup.find_all('li', class_='job-card-wrapper')
            # 提取并添加职位信息到列表中...
        return pd.DataFrame(职位信息_list)
  5. 数据去重与累积:读取已有的数据文件(如果存在),将新抓取的数据与旧数据合并,去除重复项,然后保存更新后的数据。
    import pandas as pd
    
    if os.path.exists(data_file):
        existing_data = pd.read_csv(data_file)
    else:
        existing_data = pd.DataFrame()
    
    新职位信息 = 获取职位信息(driver, base_url, pages=5)  
    更新后的职位信息 = pd.concat([existing_data, 新职位信息], ignore_index=True).drop_duplicates(subset=['职位名称', '公司名称'])
    更新后的职位信息.to_csv(data_file, index=False, encoding='utf-8-sig')

技术要点

  • Selenium的高级应用:包括但不限于Cookies的处理、显式等待(WebDriverWait)等技巧,以确保页面加载完成并成功获取数据。
  • BeautifulSoup的灵活运用:精确地定位和提取所需的HTML元素。
  • Pandas的数据处理能力:有效地合并、去重和保存数据。

项目复盘

  • 挑战
    • 页面结构变化导致的数据提取失败。
    • 网站反爬虫机制的应对。
    • 数据去重逻辑的设计。
  • 解决方案
    • 定期检查目标网站的页面结构,及时更新选择器。
    • 合理设置请求间隔,使用Cookies模拟登录状态,减少被封概率。
    • 利用pandas强大的数据处理功能,根据特定字段进行去重。

 完整源码

import logging
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import pandas as pd
import os
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
import json

# 设置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def 获取cookie(driver, url):
    # 访问指定的URL并等待用户手动登录,然后保存cookies
    logging.info("开始获取cookie")
    driver.get(url)
    time.sleep(30)  # 等待足够的时间手动登录并保存cookies
    cookies = driver.get_cookies()
    with open('cookies.json', 'w') as f:
        json.dump(cookies, f)
    logging.info("Cookie获取完毕并已保存")

def 加载cookie(driver, cookie_file='cookies.json'):
    # 从文件中加载cookies并添加到driver
    logging.info("开始加载cookie")
    with open(cookie_file, 'r') as f:
        cookies = json.load(f)
        for cookie in cookies:
            if 'expiry' in cookie:
                del cookie['expiry']  # 删除过期时间,避免格式错误
            driver.add_cookie(cookie)
    logging.info("Cookie加载完毕")

def 安全获取文本(job, selector, default='未知'):
    """尝试从job对象中获取指定选择器的文本,如果失败则返回默认值"""
    try:
        return job.find(selector[0], class_=selector[1]).text.strip()
    except AttributeError:
        return default

def 获取职位信息(driver, base_url, pages=1):
    logging.info("开始获取职位信息")
    职位信息_list = []  
    for i in range(1, pages + 1):
        url = f'{base_url}&page={i}'
        
        加载成功 = False
        for 尝试次数 in range(3):  
            try:
                driver.get(url)
                WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "job-card-wrapper")))
                加载成功 = True
                break  
            except Exception as e:
                logging.error(f"尝试 {尝试次数+1} 次访问 {url} 失败: {e}")
                time.sleep(5)  
        
        if not 加载成功:
            logging.error(f"无法加载页面: {url}")
            continue  
        
        soup = BeautifulSoup(driver.page_source, 'html.parser')
        jobs = soup.find_all('li', class_='job-card-wrapper')
        for job in jobs:
            # 获取每个职位的信息,并添加到列表中
            职位名称 = 安全获取文本(job, ('span', 'job-name'))
            工作地点 = 安全获取文本(job, ('span', 'job-area'))
            薪资 = 安全获取文本(job, ('span', 'salary'), '面议')
            标签列表 = [li.text for li in job.find('ul', class_='tag-list').find_all('li')]
            经验要求 = 标签列表[0] if len(标签列表) > 0 else '未知'
            教育要求 = 标签列表[1] if len(标签列表) > 1 else '未知'
            联系人 = 安全获取文本(job, ('div', 'info-public'))
            公司名称 = 安全获取文本(job, ('h3', 'company-name'))
            公司标签列表 = [li.text for li in job.find('ul', class_='company-tag-list').find_all('li')]
            公司类型 = 公司标签列表[0] if len(公司标签列表) > 0 else '未知'
            公司规模 = 公司标签列表[1] if len(公司标签列表) > 1 else '未知'
            详情 = ','.join([li.text for li in job.find('div', class_='job-card-footer').find('ul', class_='tag-list').find_all('li')])
            职位详情链接 = "https://www.zhipin.com" + job.find('a')['href']
             # 直接将字典添加到列表中
            职位信息_list.append({
                '职位名称': 职位名称, 
                '工作地点': 工作地点, 
                '薪资': 薪资, 
                '经验要求': 经验要求, 
                '教育要求': 教育要求, 
                '联系人': 联系人, 
                '公司名称': 公司名称, 
                '公司类型': 公司类型, 
                '公司规模': 公司规模, 
                '详情': 详情,
                '职位详情链接': 职位详情链接
            })
              
    # 循环结束后,使用收集到的职位信息列表创建DataFrame
    职位信息 = pd.DataFrame(职位信息_list)
    logging.info(f"获取到 {len(职位信息)} 个职位信息")
    return 职位信息    

if __name__ == '__main__':
    base_url = 'https://www.zhipin.com/web/geek/job?query=&city=101240100'
    data_file = '职位信息.csv'  # 数据文件路径
    
    # 初始化webdriver,并设置Chrome Driver
    options = webdriver.ChromeOptions()
    try:
        driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
        driver.set_window_size(1920, 1080)  # 调整为合适的大小
    except Exception as e:
        logging.error(f"创建WebDriver时出错: {e}")
        raise

    # 第一次运行时获取cookie,之后可以注释掉这行代码
    # 获取cookie(driver, 'https://www.zhipin.com')
    
     # 加载已有数据(如果文件存在)
    if os.path.exists(data_file):
        existing_data = pd.read_csv(data_file)
    else:
        existing_data = pd.DataFrame()

    try:
        # 加载cookie,必须先访问网站才能设置cookie
        driver.get("https://www.zhipin.com")  
        加载cookie(driver)
        
        # 获取职位信息,可以根据需要调整页数
        新职位信息 = 获取职位信息(driver, base_url, pages=10)  
        
        # 合并新旧数据,并去除重复项
        更新后的职位信息 = pd.concat([existing_data, 新职位信息], ignore_index=True).drop_duplicates(subset=['职位名称', '公司名称'])
        
    except Exception as e:
        logging.error(f"获取职位信息时出错: {e}")
        driver.quit()
        raise

    # 输出或保存职位信息到CSV文件
    print(更新后的职位信息)
    更新后的职位信息.to_csv(data_file, index=False, encoding='utf-8-sig')

    # 关闭driver
    driver.quit()

到了这里,关于Python实战:使用selenium及BeautifulSoup4进行BOOS直聘信息爬取与数据累积【附源码】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬虫实现(requests、BeautifulSoup和selenium)

    Python requests 是一个常用的 HTTP 请求库,可以方便地向网站发送 HTTP 请求,并获取响应结果。 下载requests库 pip install requests 实例: 属性和方法 属性或方法 说明 content 返回响应的内容,以字节为单位 headers 返回响应头,字典格式 json() 返回结果的 JSON 对象 request 返回请求此响应

    2024年02月07日
    浏览(28)
  • 一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium

    大家好,我是python222小锋老师。前段时间卷了一套  Python3零基础7天入门实战  以及1小时掌握Python操作Mysql数据库之pymysql模块技术 近日锋哥又卷了一波课程,python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium,文字版+视频版。1天掌握。 视频版教程:一天掌握python爬虫【

    2024年02月07日
    浏览(31)
  • 【 Python足彩网站赔率数据文件自动下载(Tkinter+BeautifulSoup+Selenium隐藏浏览器界面,双线程)】

    朋友为了分析足彩的实时赔率,需要每隔一段时间自动下载网站上的excel数据。因此开发了这款软件。 总共就3个代码块,以下是完整源代码。 1.第一步 :创建应用程序界面 2第二步 :获所有需要下载的URL并添加到列表。循环列表。 3第三步 :下载Excel文件。因为是无头浏览器

    2024年01月18日
    浏览(80)
  • 使用爬虫爬取百度搜索结果及各网站正文(request库、selenium库和beautifulsoup库)

    任务: 给定搜索词,获取百度搜索结果 根据各项结果获取对应网站正文部分 header实际为一个字典,为访问百度时提供必要的信息。 一般来讲只需要提供 Cookie 就可以访问大多数网站,其余可能需要的还有 Host 、 User-Agent 等 通过分析百度搜索url可以发现 https://www.baidu.com/s?wd=茅

    2024年03月27日
    浏览(39)
  • 爬虫入门指南(7):使用Selenium和BeautifulSoup爬取豆瓣电影Top250实例讲解【爬虫小白必看】

    在本篇博客中,我们将使用 Python 的 Selenium 和 BeautifulSoup 库来实现一个简单的网页爬虫,目的是爬取豆瓣电影TOP250的数据,并将结果保存到Excel文件中。 Selenium 是一个自动化测试工具,可以模拟用户在浏览器中的交互操作。我们将使用 Selenium 来打开网页、获取网页源码。 B

    2024年02月12日
    浏览(32)
  • 21.8 Python 使用BeautifulSoup库

    BeautifulSoup库用于从HTML或XML文件中提取数据。它可以自动将复杂的HTML文档转换为树形结构,并提供简单的方法来搜索文档中的节点,使得我们可以轻松地遍历和修改HTML文档的内容。广泛用于Web爬虫和数据抽取应用程序中。 读者如果需要使用这个库,同样需要执行pip命令用以

    2024年02月08日
    浏览(25)
  • python使用selenium控制浏览器进行爬虫

    这里以谷歌浏览器为例,需要安装一下chromedriver,其他浏览器也有相对应的driver,chromedriver下载地址:https://googlechromelabs.github.io/chrome-for-testing/ 然后是打开python环境安装一下依赖 pip install selenium ,验证一下控制浏览器是否成功 点击运行脚本可以看到以下页面就成功了。 爬虫

    2024年02月04日
    浏览(40)
  • python爬虫request和BeautifulSoup使用

    1.安装request 2.引入库 3.编写代码 发送请求 我们通过以下代码可以打开豆瓣top250的网站 但因为该网站加入了反爬机制,所以我们需要在我们的请求报文的头部加入User-Agent的信息 User-Agent可以通过访问网站时按f12查看获取 我们可以通过response的ok属性判断是否请求成功 此时如果

    2024年02月08日
    浏览(31)
  • selenium+beautifulsoup数据爬取

    ## 准备工作 ### 1、安装selenium ``` pip install selenium ``` ### 2、安装浏览器driver(以Edge浏览器为例)   * 打开edge浏览器,然后“帮助和反馈”-“关于Microsoft Edge”,查看浏览器版本,根据版本号下载driver       ![Micro.png](https://tva1.sinaimg.cn/large/005T39qaly1h3g2mw4k5gj30qo0ba41d.jpg) * 打开网站

    2024年03月21日
    浏览(26)
  • 爬虫框架有Scrapy、BeautifulSoup、Selenium

    爬虫框架有Scrapy、BeautifulSoup、Selenium BeautifulSoup比Scrapy相对容易学习。 Scrapy的扩展,支持和社区比BeautifulSoup更大。 Scrapy应被视为蜘蛛,而BeautifulSoup则是Parser。 1.爬虫基础知识 在开始Python爬虫之前,需要先掌握一些基础知识。首先了解一下HTTP协议,掌握常见的请求方法和状

    2024年02月07日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包