You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web Scraping技术问题:为何仅获300个姓名?如何提取对应URL?

问题分析与解决方案

一、为什么只拿到300个姓名?

  • Google搜索结果数量限制:Google对公开搜索结果的展示有数量上限,通常最多只会返回300-400条结果,不管你点击多少次“加载更多”,超过这个数量后就不会再加载新内容了,这是搜索引擎的固有限制。
  • 元素定位不稳定:你用的XPATH是固定的页面路径,Google的搜索页面结构会随着滚动、加载动态变化,后续循环中可能找不到对应的“加载更多”按钮,导致循环提前停止,没执行够预期的点击次数。
  • 反爬机制拦截:Google会检测自动化操作的频率,频繁点击加载更多可能触发反爬限制,比如不再返回新结果、甚至弹出人机验证,导致后续加载失败。

二、如何获取姓名对应的URL?

每个搜索结果的姓名(h3标签)都嵌套在<a>标签里,直接定位包含h3的<a>元素,就能同时提取姓名文本和对应的链接。修改后的代码示例如下:

import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

profile_url = "https://www.google.com/search?q=site%3Alinkedin.com%2Fin%2F+AND+%22third+party+risk+management%22+OR+%22supply+chain+risk%22&sca_esv=563003270&sxsrf=AB5stBgxZpVCl25X4zUTzTHRoWclocBm1w%3A1693985864737&ei=SCz4ZJjPLNb8hwOFqp-oDQ&ved=0ahUKEwiYk-ONvZWBAxVW_mEKHQXVB9UQ4dUDCA8&uact=5&oq=site%3Alinkedin.com%2Fin%2F+AND+%22third+party+risk+management%22+OR+%22supply+chain+risk%22&gs_lp=Egxnd3Mtd2l6LXNlcnAiTnNpdGU6bGlua2VkaW4uY29tL2luLyBBTkQgInRoaXJkIHBhcnR5IHJpc2sgbWFuYWdlbWVudCIgT1IgInN1cHBseSBjaGFpbiByaXNrIkgAUABYAHAAeACQAQCYAQCgAQCqAQC4AQPIAQD4AQHiAwQYACBB&sclient=gws-wiz-serp"

driver.get(profile_url)

# 先滚动加载初始内容
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(2)

# 调整循环逻辑,改用更稳定的方式检测加载按钮
max_attempts = 20  # 不用设100,因为Google最多返回几百条
attempts = 0
while attempts < max_attempts:
    try:
        # 用文本定位加载更多按钮,适配页面结构变化
        load_more = driver.find_element(By.XPATH, "//span[contains(text(), '更多结果')]")
        load_more.click()
        attempts += 1
        time.sleep(3)  # 延长等待时间,降低反爬触发概率
        driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    except:
        # 找不到按钮就退出循环
        break

# 提取所有搜索结果的姓名和URL
results = []
search_items = driver.find_elements(By.CSS_SELECTOR, "div.g a")
for item in search_items:
    try:
        name = item.find_element(By.TAG_NAME, "h3").text
        url = item.get_attribute("href")
        # 过滤掉非LinkedIn的链接
        if "linkedin.com/in/" in url:
            results.append({"姓名": name, "URL": url})
    except:
        continue

# 转成DataFrame保存
df = pd.DataFrame(results)
print(f"共获取到{len(df)}条有效结果")
print(df.head())

driver.quit()

代码说明:

  • 改用CSS选择器定位搜索结果的<a>标签,比固定XPATH更稳定;
  • 增加异常捕获,避免单个结果解析失败导致程序中断;
  • 过滤包含linkedin.com/in/的链接,确保只保留目标Profile;
  • 减少循环次数,同时延长等待时间,降低触发反爬的概率;
  • 最终结果保存为DataFrame,方便后续处理或导出。

内容的提问来源于stack exchange,提问作者Mojitogod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:35:54