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
相关产品推荐
相关产品推荐

