selenium爬取网站示例

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
import xlwt

def login():
    try:
        # 初始化WebDriver
        service = Service("D:\chromedriver-win64\chromedriver.exe")
        driver = webdriver.Chrome(service=service)
        # 打开登录页面
        driver.get('https://www.xxx.com/Public/login.html')

        # page_source = driver.page_source
        # print(page_source)

        # 输入用户名
        username_input = driver.find_element(By.NAME, 'account')
        username_input.send_keys('username')

        # 输入密码
        password_input = driver.find_element(By.NAME, 'password')
        password_input.send_keys('password')

        # 等待手动输入验证码
        print("请查看浏览器中的验证码,并在此处输入后按回车键继续...")
        captcha_input = driver.find_element(By.NAME, 'verify')
        user_captcha = input()  # 暂停脚本等待用户输入
        captcha_input.send_keys(user_captcha)

        # 假设验证码已经被手动输入到输入框中
        # 提交表单或点击登录按钮
        login_button = driver.find_element(By.XPATH, "//button[@lay-filter='loginBtn']")
        login_button.click()

        # 等待登录完成后跳转至目标页面
        # Step 1: 等待第一次跳转 -> 提示页面(根据页面标题)
        WebDriverWait(driver, 10).until(
            EC.title_is("跳转页面")  # 或者使用 EC.title_contains 如果标题部分匹配即可
        )
        print("已进入跳转提示页面")

        # Step 2: 等待第二次跳转 -> 目标页面(根据页面标题)
        WebDriverWait(driver, 10).until(
            EC.title_is("填写个人基本资料")  # 替换为你的目标页面的实际标题
        )
        print("已进入目标页面")

        # Step 3: 在目标页面中查找并操作所需的元素
        idcard_input = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.NAME, 'idcardnumber'))
        )
        print("找到目标元素!")

        # 如果登录后未自动跳转,则手动导航到目标页面
        urls = []
        for number in range(82, 101):
            url = f"https://www.xxx.com/Jobs/index.html?page={number}"
            urls.append(url)

        page_data = get_page_data(driver, urls)
        # print(page_data)

        content_data = get_content_data(driver, page_data)
        # print(content_data)

        data_to_xls(content_data)

    except NoSuchElementException as e:
        print(f"异常信息: {e}")

    finally:
        # 根据需要决定是否关闭浏览器
        driver.quit()

def get_page_data(driver, urls):

    job_list = []
    company_list = []

    for url in urls:
        print(f"正在抓取页面: {url}")
        driver.get(url)

        job_datas = driver.find_elements(By.CSS_SELECTOR, '.jtitle h4 a.fl')
        for index, item in enumerate(job_datas, start=1):
            href = item.get_attribute("href")
            job_list.append(href)

        company_datas = driver.find_elements(By.CSS_SELECTOR, ".ctitle h5 a")
        for index, item in enumerate(company_datas, start=1):
            href = item.get_attribute("href")
            company_list.append(href)

    if (len(job_list) == len(company_list)):
        page_data = [[x, y] for x, y in zip(job_list, company_list)]
        return page_data

    print("职位数量和公司数量不相符")


def get_content_data(driver, urls):

    url_data = []
    for url in urls:
        data = []
        driver.get(url[0])
        print(f"正在抓取:{url[0]}")
        # 招聘职位
        job_name = get_element_attribute(driver, By.CSS_SELECTOR, ".layui-card > h1")
        data.append(job_name)

        # 工作地区,工作经验,学历,兼职/全职,招聘人数等
        ul_element = driver.find_element(By.CSS_SELECTOR, ".job-info > ul")
        li_elements = ul_element.find_elements(By.TAG_NAME, "li")
        detail = ['','','','','','','','','','','','','']
        for index, li in enumerate(li_elements, start=1):
            full_text = li.text.strip()
            span_text = li.find_element(By.TAG_NAME, "span").text.strip()
            value = full_text.replace(span_text, "").strip()
            if span_text == "公司规模:":
                detail[0] = value
            elif span_text == "公司性质:":
                detail[1] = value
            elif span_text == "所属行业:":
                detail[2] = value
            elif span_text == "工作性质:":
                detail[3] = value
            elif span_text == "招聘人数:":
                detail[4] = value
            elif span_text == "职位类别:":
                detail[5] = value
            elif span_text == "工作经验:":
                detail[6] = value
            elif span_text == "最低学历:":
                detail[7] = value
            elif span_text == "薪酬待遇:":
                detail[8] = value
            elif span_text == "工作地点:":
                detail[9] = value
            elif span_text == "专业要求:":
                detail[10] = value
            elif span_text == "性别要求:":
                detail[11] = value
            elif span_text == "语言能力:":
                detail[12] = value
            else:
                print(f"公司详情数据异常: {span_text}")

        data.append(detail[0])
        data.append(detail[1])
        data.append(detail[2])
        data.append(detail[3])
        data.append(detail[4])
        data.append(detail[5])
        data.append(detail[6])
        data.append(detail[7])
        data.append(detail[8])
        data.append(detail[9])
        data.append(detail[10])
        data.append(detail[11])
        data.append(detail[12])

        # 工作详情描述
        job_description = driver.find_elements(By.CSS_SELECTOR, ".job-dcont pre")
        data.append(job_description[0].text.strip())
        data.append(job_description[1].text.strip())

        # 招聘者信息
        ul_element = driver.find_element(By.CLASS_NAME, "contact-right")
        li_elements = ul_element.find_elements(By.TAG_NAME, "li")
        manager = ['','','','','','']
        for index, li in enumerate(li_elements, start=1):
            full_text = li.text.strip()
            span_element = li.find_elements(By.TAG_NAME, "span")
            if span_element:
                span_text = span_element[0].text.strip()
                value = full_text.replace(span_text, "").strip()
                if span_text == "联系人:":
                    manager[0] = value
                elif span_text == "联系电话:":
                    manager[1] = value
                elif span_text == "手机:":
                    manager[2] = value
                elif span_text == "公司邮箱:":
                    manager[3] = value
                elif span_text == "公司网站:":
                    manager[4] = value
                elif span_text == "公司地址:":
                    manager[5] = value
                else:
                    print(f"招聘者数据异常: {span_text}")

        data.append(manager[0])
        data.append(manager[1])
        data.append(manager[2])
        data.append(manager[3])
        data.append(manager[4])
        data.append(manager[5])

        driver.get(url[1])
        print(f"正在抓取:{url[1]}")
        # 公司名称
        company_name = get_element_attribute(driver, By.CSS_SELECTOR, ".layui-col-space20 > h1")
        data.append(company_name)

        # 公司简介
        company_description = get_element_attribute(driver, By.CLASS_NAME, "company-cont")
        data.append(company_description)

        url_data.append(data)

    return url_data

def get_element_attribute(driver, by, value, attribute=None):
    elements = driver.find_elements(by, value)
    if elements:
        element = elements[0]
        if attribute:
            return element.get_attribute(attribute) or ""
        else:
            return element.text.strip() or ""
    return ""

def data_to_xls(data):
    # 设置表头
    headers = ["职位", "公司规模", "公司性质", "所属行业", "工作性质", "招聘人数", "职位类别", "工作经验", "最低学历", "薪酬待遇", "工作地点", "专业要求", "性别要求", "语言能力", "职位描述", "职位要求", "联系人", "联系电话", "手机", "公司邮箱", "公司网站", "公司地址", "公司名称", "公司介绍"]

    # 创建工作簿和工作表
    workbook = xlwt.Workbook(encoding='utf-8')
    worksheet = workbook.add_sheet('Sheet1')

    # 写入表头
    for col_index, header in enumerate(headers):
        worksheet.write(0, col_index, header)

    # 写入数据行
    for row_index, row in enumerate(data):
        for col_index, cell_data in enumerate(row):
            worksheet.write(row_index + 1, col_index, cell_data)

    # 保存文件
    workbook.save('企业信息.xls')
    print("Excel 文件已生成:企业信息.xls")


if __name__ == '__main__':
    login()
import xlrd
import xlwt

def get_company_cate(name):
    if name == '教育、培训、科研院所' or name == '人才交流、中介' or name == '咨询业(顾问、会计师、审计师、法律)':
        return '咨询/法律/教育/科研'

    elif name == '生产、制造、加工、修饰' or name == '运输、物流、快递':
        return '生产/营运/采购/物流'

    elif name == '通讯、电信网络设备业' or name == '计算机业(硬件、网络设备)' or name == '电子、微电子技术' or name == '通信、电信运营、增值服务业' or name == '仪器仪表、电工设备' or name == '电气':
        return '通信/电子'

    elif name == '建筑、装潢' or name == '房地产、物业管理':
        return '建筑/房地产'

    elif name == '快速消费品(食品、饮料、粮油、化妆品、烟酒...)' or name == '纺织品业(服饰、鞋类、家纺用品、皮具...)' or name == '批发零售(百货、超市、购物中心、专卖店...)' or name == '贸易、商务、进出口' or name == '家具、家电、工艺品、玩具':
        return '贸易/百货'

    elif name == '餐饮、娱乐' or name == '旅游业、酒店':
        return '服务业'

    elif name == '协会、社团' or name == '农、林、牧、副、渔业':
        return '公务员/翻译/其他'

    elif name == '印刷、包装、造纸' or name == '汽车、摩托车及配件业' or name == '机械制造、机电设备、重工业':
        return '机械/设备/技工'

    elif name == '计算机业(软件、数据库、系统集成)' or name == '互联网、电子商务':
        return '计算机/互联网'

    elif name == '电力、能源、矿产业' or name == '石油、化工业':
        return '化工/能源'

    elif name == '金融业(投资、保险、证券、银行、基金)':
        return '会计/金融/银行/保险'

    elif name == '医疗、美容保健、卫生服务' or name == '生物工程、制药、环保':
        return '生物/制药/医疗/护理'

    elif name == '媒体、影视制作、新闻出版' or name == '艺术、文化传播':
        return '广告/市场/媒体/艺术'

    else:
        return '计算机/互联网'

def get_company_guimo(name):
    if name == '10~50人':
        return '10-50人'
    elif name == '50~100人':
        return '50-200人'
    elif name == '100人~500人':
        return '200-500人'
    elif name == '500~1000人':
        return '500-1000人'
    elif name == '1000人以上':
        return '1000人以上'
    else:
        return '10人以下'


def get_position_cate(name):
    if '生产' in name or '制造' in name:
        return '生产制造*其他生产制造职位'
    elif '人事' in name or '行政' in name or '财务' in name:
        return '人事/行政/财务*其他职能职位'
    elif '服务' in name:
        return '服务业*其他服务业职位'
    elif '运营' in name:
        return '运营*其他运营职位'
    elif '房地产' in name or '建筑' in name:
        return '房地产/建筑*其他房地产职位'
    elif '教育' in name or '培训' in name:
        return '教育培训*其他教育培训职位'
    elif '市场' in name:
        return '市场*其他市场职位'
    elif '销售' in name:
        return '销售*其他销售职位'
    elif '媒体' in name:
        return '媒体*其他传媒职位'
    elif '技术' in name:
        return '技术*其他技术职位'
    elif '设计' in name:
        return '设计*其他设计职位'
    elif '管理' in name:
        return '高级管理*高级管理职位'
    elif '产品' in name:
        return '产品*其他产品职位'
    elif '金融' in name:
        return '金融*其他金融职位'
    elif '医疗' in name or '健康' in name:
        return '医疗健康*其他医疗健康职位'
    elif '采购' in name or '贸易' in name:
        return '采购贸易*其他采购/贸易职位'
    elif '供应链' in name or '物流' in name:
        return '供应链/物流*其他供应链职位'
    elif '咨询' in name or '翻译' in name or '法律' in name:
        return '咨询/翻译/法律*其他咨询类职位'
    elif '旅游' in name:
        return '旅游*其他旅游职位'
    elif '市政' in name or '能燃' in name or '农林牧渔' in name:
        return '市政/能燃/农林牧渔*其他类'
    else:
        return '服务业*其他服务业职位'

def get_position_jingyan(name):
    if name == '1-3年':
        return '1年以上'
    elif name == '3-5年':
        return '3年以上'
    elif name == '5-10年':
        return '5年以上'
    elif name == '10年以上':
        return '10年以上'
    else:
        return '不限'

def get_position_xueli(name):
    if name == '大专':
        return '大专'
    elif name == '本科':
        return '本科'
    else:
        return '不限'


def data_to_xls(data):
    # 设置表头
    headers = ["职位", "公司规模", "公司性质", "所属行业", "工作性质", "招聘人数", "职位类别", "工作经验", "最低学历", "薪酬待遇", "工作地点", "专业要求", "性别要求", "语言能力", "职位描述", "职位要求", "联系人", "联系电话", "手机", "公司邮箱", "公司网站", "公司地址", "公司名称", "公司介绍"]

    # 创建工作簿和工作表
    workbook = xlwt.Workbook(encoding='utf-8')
    worksheet = workbook.add_sheet('Sheet1')

    # 写入表头
    # for col_index, header in enumerate(headers):
    #     worksheet.write(0, col_index, header)

    # 写入数据行
    for row_index, row in enumerate(data):
        for col_index, cell_data in enumerate(row):
            worksheet.write(row_index, col_index, cell_data)

    # 保存文件
    workbook.save('新企业信息.xls')
    print("导入完毕")

if __name__ == '__main__':
    # 打开 xls 文件
    workbook = xlrd.open_workbook('企业信息.xls')
    # 获取所有 sheet 名称
    sheet_names = workbook.sheet_names()
    # 选择第一个 sheet
    sheet = workbook.sheet_by_index(0)
    # 遍历行并读取数据
    company_data = []

    company_data.append(['公司名称','联系人','联系人职位','联系电话','固定电话','联系QQ','联系地址','联系邮箱','企业行业','企业规模','企业简介','招聘职位','招聘岗位','招聘人数','岗位要求','薪资待遇','工作经验','学历要求','工作地点'])

    for row_idx in range(sheet.nrows):
        data = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
        if(row_idx + 1) < sheet.nrows:
            row = sheet.row_values(row_idx + 1)
            data[0] = row[22]
            data[1] = row[16]
            data[2] = 'HR'
            data[3] = row[18] if row[18] != '' else row[17]
            data[4] = row[17]
            data[5] = ''
            data[6] = row[21]
            data[7] = row[19]
            data[8] = get_company_cate(row[3])
            data[9] = get_company_guimo(row[1])
            data[10] = row[23]
            data[11] = row[0]
            data[12] = get_position_cate(row[6])
            data[13] = row[5]
            data[14] = row[14] + '\n职位要求:' + row[15]
            data[15] = row[9].replace("元", "")
            data[16] = get_position_jingyan(row[7])
            data[17] = get_position_xueli(row[8])
            data[18] = row[10].replace("雄安新区", "保定")
            company_data.append(data)

            # print(data)

    data_to_xls(company_data)

,