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)