Selenium-BS4爬虫问题:爬取desiopt网站企业信息及职位详情链接遇阻
解决Selenium+BeautifulSoup爬取desiopt职位信息的问题
嘿,我看了你的爬取代码和需求,发现几个容易导致爬取失败或者数据不全的问题,咱们一步步来解决:
一、先梳理你代码里的几个明显问题
- ChromeDriver初始化方式过时:现在Selenium 4.0+已经不再推荐用
executable_path参数直接传路径了,这种写法容易出现版本不匹配或者路径解析报错,建议用Service类来管理驱动 - 未处理动态加载内容:这个网站的职位列表是滚动加载的,你只爬了页面初始加载的第一页内容,肯定拿不到所有企业和职位信息
- 列名错误导致报错:你代码里写了
df['Price'] = df['Price'].map(...),但你的DataFrame只有Company info列,这会直接抛出“列不存在”的错误 - 遗漏职位详情链接提取:你的需求明确要爬取职位详情链接,但代码里完全没处理这部分逻辑
二、修正后的完整代码
下面是调整后的代码,我加了详细注释,解决了上面的问题,还优化了爬取逻辑:
from selenium import webdriver from selenium.webdriver.chrome.service import Service import pandas as pd from bs4 import BeautifulSoup import re import time # 初始化Chrome驱动(Selenium 4+标准写法) service = Service(r"C:/Users/Chandra Sekhar/Desktop/chrome-driver/chromedriver.exe") driver = webdriver.Chrome(service=service) # 存储爬取数据的列表 company_info_list = [] job_links_list = [] try: driver.get("http://desiopt.com/search-results-jobs/") # 处理滚动加载:模拟滚动到底部,直到没有新内容加载 last_page_height = driver.execute_script("return document.body.scrollHeight") while True: # 执行JS脚本滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待页面加载新内容(可根据网络情况调整等待时间) time.sleep(3) # 获取新的页面高度,判断是否还有新内容 current_page_height = driver.execute_script("return document.body.scrollHeight") if current_page_height == last_page_height: break last_page_height = current_page_height # 获取完整的页面源码 page_content = driver.page_source soup = BeautifulSoup(page_content, "html.parser") # 遍历每个职位条目 for listing_item in soup.find_all('div', attrs={'class':'listing-links'}): # 提取并清理企业信息 user_info_block = listing_item.find('div', attrs={'class':'userInfo'}) if user_info_block: raw_company_info = user_info_block.get_text(strip=True) # 清理非字母数字字符(对应你原来的需求) cleaned_company_info = re.sub(r'\W+', '', raw_company_info) company_info_list.append(cleaned_company_info) else: company_info_list.append("无企业信息") # 提取职位详情链接 job_link_tag = listing_item.find('a', href=True) if job_link_tag: job_link = job_link_tag['href'] # 处理相对链接,补全域名 if not job_link.startswith('http'): job_link = f"http://desiopt.com{job_link}" job_links_list.append(job_link) else: job_links_list.append("无详情链接") # 生成DataFrame并保存到CSV result_df = pd.DataFrame({ 'Company Info': company_info_list, 'Job Detail Link': job_links_list }) result_df.to_csv('products1.csv', index=False) print("数据爬取完成!已保存到products1.csv文件中") finally: # 无论爬取是否成功,都关闭浏览器 driver.quit()
三、关键改进点说明
- 驱动初始化优化:用
Service类替代旧的executable_path写法,更符合Selenium最新规范,能有效减少版本兼容问题 - 动态加载处理:通过模拟滚动页面+判断页面高度的方式,确保能爬取到网站上所有的职位条目
- 容错性提升:增加了元素存在性判断,避免因为某个职位条目缺失信息导致整个程序崩溃
- 链接补全逻辑:处理了网站内相对链接的情况,确保保存的是可以直接访问的完整职位详情链接
- 可选优化:如果觉得
time.sleep不够灵活,可以用WebDriverWait实现智能等待,比如替换滚动后的等待逻辑:from selenium.webdriver.support.ui import WebDriverWait WebDriverWait(driver, 10).until( lambda driver: driver.execute_script("return document.body.scrollHeight") > last_page_height )
内容的提问来源于stack exchange,提问作者ajay ai
相关产品推荐
相关产品推荐

