2024爬虫 用selenium 爬取 51job(前程无忧)代码

本文讲述了如何使用Selenium框架和XPath在51job网站上爬取职位信息,包括设置无界面Chrome驱动、获取和操作XPath地址,以及处理数据抓取和存储的过程。
摘要由CSDN通过智能技术生成

       最近想要练习一下爬虫,但是打开51job的页进行操作发现,url地址基本不怎么变化,不太容易提取url地址,发现无论是搜索 java 还是 python 地址是不变的,点击页码地址也不会变化。所以用操作地址的爬虫框架就不太容易操作了,下面是使用selenium爬取51job的具体流程,代码部分几乎每一行都有注释

一、在操作之前需要先下载一下与本机chrome版本基本一致的chrome驱动

驱动下载地址icon-default.png?t=N7T8http://chromedriver.storage.googleapis.com/index.html

  谷歌浏览器版本

驱动版本 

二、 xpath地址的获取方式

以下边第一行代码为例

# 向搜索框传入关键字
web.find_element(By.XPATH, '//*[@id="keywordInput"]').send_keys(keyword)
# 点击搜索
web.find_element(By.XPATH, '//*[@id="search_btn"]').click()

 经过上边三步就可以获得xpath地址了,是不是很简单!


一级页面

观察页面发现有用的数据基本都在这个地方,除了公司名称公司性质公司规模

公司名称公司性质公司规模 在这个地方

二级页面 

三、完整代码

from datetime import datetime
from time import sleep
import json
import ktool
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from mysql_util import MysqlUtil
 
url = 'https://we.51job.com/pc/search?keyword=&searchType=2&sortType=0&metro=' #初始url地址
opt = Options()
opt.add_argument("--headless")  # 无界面启动
opt.add_experimental_option('useAutomationExtension', False)  # 禁用Chrome的自动化拓展程序
opt.add_experimental_option('excludeSwitches', ['enable-automation'])  # 确保浏览器不会因为启用自动化模式而出现不必要的错误或异常。
opt.add_argument('--disable-blink-features=AutomationControlled')  # 禁用由自动化测试或脚本控制的 Blink 功能。
#chrome驱动 这里需要换成自己的驱动位置
web = Chrome(options=opt, executable_path=r'C:\Program Files (x86)\ESBrowser\chromedriver.exe') 
web.get(url)
# 网速快的可以把时间调到小一点
sleep(2)
# 搜索关键字,可以自己定义想爬取的职位
keyword = "python"
c_name = '_%s_%s' % (keyword, datetime.now().strftime('%Y_%m_%d'))
# 实例化数据库创建数据表
db = MysqlUtil()
sql = "CREATE TABLE IF NOT EXISTS {} " \
      "(id INT AUTO_INCREMENT PRIMARY KEY,jobTitle VARCHAR(50)," \
      "company_name VARCHAR(50),jobArea VARCHAR(20),jobDegree VARCHAR(50)," \
      "company_nature VARCHAR(50),company_scale VARCHAR(50),jobTime datetime," \
      "job_information TEXT,createDatetime datetime)".format(c_name)
db.create_table(sql)
# 向搜索框传入关键字
web.find_element(By.XPATH, '//*[@id="keywordInput"]').send_keys(keyword)
# 点击搜索
web.find_element(By.XPATH, '//*[@id="search_btn"]').click()
sleep(1)
# 原始窗口柄
original_window = web.current_window_handle
# 需要爬取的页数,现在的51job最大也只有50页
total_page = 5
for page in range(total_page):
    # 获取每一页的职位信息对象 [list]
    job_info = web.find_elements(By.XPATH,
                                 '//*[@id="app"]/div/div[2]/div/div/div[2]/div/div[2]/div/div[2]/div[1]/div')
    for one_job in job_info:
        # 获取存有关键内容的数据
        job_attributes = one_job.get_attribute('sensorsdata')
        # 转换成json格式
        job_attributes = json.loads(job_attributes)
        # 定义一个字典存储需要的关键信息
        search_result = {}
        # 工作名称
        search_result['jobTitle'] = job_attributes['jobTitle']
        # 公司名称
        try:
            search_result['company_name'] = one_job.find_element(By.XPATH, './div[4]/div[1]/a').text
        except Exception:
            search_result['company_name'] = "null"
        # 工作地点
        search_result['jobArea'] = job_attributes['jobArea']
        # 学历要求
        search_result['jobDegree'] = job_attributes['jobDegree']
        # 公司性质
        try:
            search_result['company_nature'] = one_job.find_element(By.XPATH, './div[4]/div[1]/span[2]').text
        except Exception:
            search_result['company_nature'] = "null"
        # 公司规模
        try:
            search_result['company_scale'] = one_job.find_element(By.XPATH, './div[4]/div[1]/span[3]').text
        except Exception:
            search_result['company_scale'] = "null"
        # 发布时间
        search_result['jobTime'] = job_attributes['jobTime']

        # 跳转到二级页面
        one_job.find_element(By.XPATH, './div[2]').click()
        sleep(2)
        # 获取二级页面窗口柄
        for window_handle in web.window_handles:
            if window_handle != original_window:
                web.switch_to.window(window_handle)
                break
        sleep(2)
        # 二级页面url
        url = web.current_url
        # 把二级页面的信息整合到一起,如果没有默认为地址
        job_information = ktool.xpath.xpath_union(
            web.page_source, '/html/body/div[2]/div[2]/div[3]/div[1]/div/text()',
            default=url
        )
        # 关闭二级页面
        web.close()
        # 返回一级页面
        web.switch_to.window(original_window)
        # 创建时间
        createDatetime = ktool.date.get_datetime()
        # 工作要求
        search_result['job_information'] = job_information
        search_result['createDatetime'] = createDatetime
        print(search_result)
        db = MysqlUtil()
        sql = "INSERT INTO %s (jobTitle, company_name, jobArea, jobDegree, " \
              "company_nature, company_scale, jobTime, job_information, createDatetime)" \
              "VALUES ('%s', '%s','%s','%s','%s','%s','%s','%s','%s')"\
            % (c_name,search_result['jobTitle'],search_result['company_name'],search_result['jobArea'],
                    search_result['jobDegree'],search_result['company_nature'],search_result['company_scale'],
                    search_result['jobTime'],search_result['job_information'],search_result['createDatetime'])
        # 插入数据库
        db.insert(sql)

    # 下一页按钮
    web.find_element(By.XPATH,
                     '//*[@id="app"]/div/div[2]/div/div/div[2]/div/div[2]/div/div[3]/div/div/div/button[2]').click()
    sleep(1)

web.quit()

数据库部分

import pymysql
class MysqlUtil():
    def __init__(self):
        '''
            初始化方法,连接数据库
        '''
        host = '127.0.0.1'  # 主机名
        user = 'root'  # 数据库用户名
        password = '123456'  # 数据库密码
        database = '51job'  # 数据库名称
        self.db = pymysql.connect(host=host, user=user, password=password, db=database)  # 建立连接
        self.cursor = self.db.cursor(cursor=pymysql.cursors.DictCursor)  # 设置游标,并将游标设置为字典类型
    # 创建表
    def create_table(self,sql):
        try:
            self.cursor.execute(sql)
            self.db.commit()
        except Exception as e:
            print("发生异常", e)
            self.db.rollback()
        finally:
            self.db.close()
    # 插入数据 
    def insert(self,sql):
        try:
            self.cursor.execute(sql)
            self.db.commit()
        except Exception as e:
            print("发生异常", e)
            self.db.rollback()
        finally:
            self.db.close()

有什么问题,希望大家能够指教,共同学习,如果对你有帮助,留个赞再走呗!

  • 17
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: 好的,下面是关于使用PythonSelenium爬取51job的简要步骤: 1. 安装PythonSelenium 2. 下载Chrome浏览器和对应版本的ChromeDriver 3. 编写Python脚本,使用Selenium打开Chrome浏览器,访问51job网站,并输入关键词进行搜索 4. 使用Selenium模拟鼠标滚动,加载更多的职位信息 5. 使用BeautifulSoup或正则表达式等方法解析网页内容,提取所需信息 6. 将提取的信息保存到本地文件或数据库中 需要注意的是,爬取网站时需要遵守相关法律法规和网站的使用协议,不得进行恶意爬取和侵犯他人隐私等行为。 ### 回答2: Python Selenium是一个用于自动化测试的Python库。它可以模拟用户在网页上的操作并提取网页的信息。本篇文章将介绍如何使用Python Selenium爬取51job的招聘信息。以下是具体步骤: 1. 安装Selenium和Chrome浏览器 在Windows平台下,安装Selenium的命令为:pip install selenium。接着,安装Chrome浏览器,并在本地环境中安装ChromeDriver,它是Selenium的浏览器驱动程序。下载地址为:https://sites.google.com/a/chromium.org/chromedriver/home 2. 连接到51job网站 通过Selenium启动Chrome浏览器并连接到51job的招聘页面。查找“关键字”、“地点”、“职能类别”和“发布时间”的输入框并依次输入搜索条件。通过点击“搜索”按钮,进入到搜索结果页面。 3. 爬取搜索结果 从搜索结果页面获取每个招聘信息的标题、公司名称、薪酬、发布日期和详细链接。将提取的信息存储在列表中。 4. 翻页爬取结果 对于大量的搜索结果,需要翻页操作来获取全部招聘信息。对于51job网站,通过点击“下一页”按钮实现翻页。循环爬取多页的招聘信息并存储在列表中。 5. 存储数据 将提取的招聘信息存储在CSV文件或其他格式中,方便后续的分析和处理。 6. 结束程序 关闭浏览器和ChromeDriver,程序结束运行。 综上所述,使用Python Selenium可以方便地爬取51job的招聘信息,并用于后续的数据分析和处理。 ### 回答3: Python Selenium是一种基于Python的自动化测试工具,它主要用于模拟用户在浏览器上的操作,以此实现网络爬虫的功能。51job是一个国内较为知名的招聘网站,如果我们想要批量获取招聘信息,可以使用Python Selenium进行爬取。 为了使用Python Selenium爬取51job,我们需要安装Selenium库以及相应的web driver(如Chrome driver)。 首先,我们需要进入51job的招聘页面,分析其中的HTML结构,确定需要爬取的信息。通常招聘信息包括公司名称、职位、学历要求、薪资等信息。然后根据这些信息,编写Python脚本,使用Selenium模拟用户操作,依次打开网页、输入搜索条件、点击搜索按钮、获取每页的职位信息等。 具体实现步骤如下: 1. 首先,我们需要导入Selenium库和web driver。在本例中,我们使用Chrome driver作为web driver,并设置一些选项,以便快速打开和关闭浏览器。 import time from selenium import webdriver chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--no-sandbox') browser = webdriver.Chrome(chrome_options=chrome_options) browser.implicitly_wait(10) 2. 打开51job的招聘页面。 browser.get('https://www.51job.com/') 3. 模拟输入搜索条件。在51job的搜索页面,我们可以通过定位输入框并使用send_keys()方法进行模拟输入。 input_box = browser.find_element_by_id('kwdselectid') input_box.send_keys('Python') 4. 模拟点击搜索按钮。同样,我们可以通过定位按钮并使用click()方法模拟点击事件。 search_button = browser.find_element_by_css_selector('div[class="fltr"][id="searchbtn"]') search_button.click() 5. 遍历每一页并获取职位信息。在51job中,职位信息被包含在一个类名为“dw_table”的表格中。我们可以使用find_elements_by_css_selector()方法获取这个表格,再使用for循环遍历其中的每一行,获取并打印出每行的职位信息。 table = browser.find_elements_by_css_selector('div[class="el"]')[1:] for row in table: company = row.find_element_by_css_selector('span[class="t2"]').text position = row.find_element_by_css_selector('a').text education = row.find_element_by_css_selector('span[class="t3"]').text salary = row.find_element_by_css_selector('span[class="t4"]').text print(company, position, education, salary) 最后,我们可以关闭浏览器。 browser.quit() 综上所述,Python Selenium是一种功能强大的网络爬虫工具,可以帮助我们快速爬取网页上的大量招聘信息。它可以模拟用户在浏览器上的操作,让我们可以轻松爬取需要的信息,并在数据分析和处理中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值