Selenium爬取LinkedIn时BeautifulSoup查找block mt2 div返回null
问题根因
- LinkedIn为重度JavaScript驱动的单页应用,页面核心业务内容全部由前端脚本动态渲染生成。调用
wd.get()时Selenium默认仅等待初始静态HTML文档加载完成,不会等待脚本执行、动态节点渲染完毕,此时获取的page_source是未完成渲染的初始源码,自然不存在JS运行后才插入的<div class="block mt2">节点,你打印soup时仅能看到head区域的静态脚本、元信息标签就是最直接的证据。 - 未携带有效登录态的Selenium请求会被LinkedIn反爬机制拦截,默认会跳转到登录/人机验证页,根本不会加载目标企业主页的实际内容。
修正步骤
- 增加显式等待逻辑:获取页面源码前先轮询DOM树,确认目标元素已经渲染完成后再执行解析操作。不要使用固定时长的
time.sleep()做等待,这种方式稳定性差、执行效率低,很容易出现等待时间不够或者不必要的等待。 - 提前处理登录态:可以通过加载本地已登录的浏览器用户配置文件,或者在脚本启动后先完成登录流程,携带有效Cookie再访问目标页面,避免被内容拦截。
- 选择稳定的定位属性:LinkedIn页面中
ember*开头的ID是每次页面加载随机生成的,不要用这类动态属性做元素选择器,优先使用固定不变的class组合、语义化标签做定位。
修正后可运行代码
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup import csv # 访问目标LinkedIn企业主页 wd.get("https://www.linkedin.com/company/pacific-retail-capital-partners/") # 最长等待10秒,直到目标企业信息容器加载完成 try: WebDriverWait(wd, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "div.block.mt2")) ) except TimeoutError: print("页面加载超时,请检查登录状态、网络连接,或降低访问频率规避反爬") wd.quit() exit() # 渲染完成后再获取源码解析 soup = BeautifulSoup(wd.page_source, "html.parser") info_div = soup.find("div", {"class": "block mt2"}) company_name = info_div.find("h1").get_text(strip=True) # 数据写入CSV文件 with open("linkedin_company_data.csv", "w", encoding="utf-8-sig", newline="") as csv_file: writer = csv.writer(csv_file) writer.writerow(["企业名称"]) writer.writerow([company_name])
注意事项
- 爬取过程中严格控制访问频率,高频、规律的请求很容易触发LinkedIn的风控规则,导致账号被限制、IP被封禁。
- 批量爬取时优先复用本地浏览器的用户缓存,避免每次启动都重新登录,能大幅降低被识别为爬虫的概率。
- 写入CSV时建议使用
utf-8-sig编码,避免Windows系统下打开CSV出现中文乱码。
内容的提问来源于stack exchange,提问作者yash agarwal
相关产品推荐
相关产品推荐

