我的Google搜索Python脚本无结果返回,如何排查故障?
问题原因及修复方案
核心问题
- 请求被Google拦截:Google会识别非浏览器发起的请求,直接用
requests.get调用会返回人机验证页面,而非正常搜索结果。 - 链接提取逻辑错误:Google搜索结果的a标签href是
/url?q=真实链接&...的跳转格式,原脚本直接取link["href"]会拿到无效的跳转路径,且页面选择器可能因Google页面结构更新失效。 - 代码缩进问题:原脚本中函数内部代码无缩进,属于语法错误(推测是粘贴时格式丢失,修复时需保证正确缩进)。
修复后的完整代码
import requests from bs4 import BeautifulSoup import csv from urllib.parse import urlparse, parse_qs def get_google_search_results_urls(query, num_results=10): base_url = "https://www.google.com/search" # 模拟浏览器请求头,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } params = {"q": query, "num": num_results} response = requests.get(base_url, params=params, headers=headers) response.raise_for_status() soup = BeautifulSoup(response.text, "html.parser") result_urls = [] # 适配当前Google搜索结果的容器选择器,提取真实链接 for result in soup.select(".g"): link = result.select_one("a") if link: href = link.get("href") # 解析Google跳转链接,提取真实目标URL if href.startswith("/url?q="): parsed_url = urlparse(href) real_url = parse_qs(parsed_url.query).get("q")[0] result_urls.append(real_url) # 兼容少数直接显示完整链接的情况 elif href.startswith("http"): result_urls.append(href) # 确保返回结果数量不超过指定值 return result_urls[:num_results] def write_urls_to_csv(urls, csv_file): with open(csv_file, "w", newline="", encoding="utf-8") as csvfile: csv_writer = csv.writer(csvfile) csv_writer.writerow(["URL"]) for url in urls: csv_writer.writerow([url]) if __name__ == "__main__": search_query = input("Enter your Google search query: ") num_results = int(input("Enter the number of search results to fetch: ")) search_results = get_google_search_results_urls(search_query, num_results) if search_results: csv_file_name = "google_search_results.csv" write_urls_to_csv(search_results, csv_file_name) print(f"Search results URLs written to {csv_file_name}") else: print("No search results found.")
关键修复点说明
- 添加请求头:通过
headers模拟Chrome浏览器请求,绕过Google基础反爬检测。 - 修正链接提取:用
urllib.parse解析Google的跳转链接,提取真实目标URL,同时兼容特殊情况。 - 更新选择器:将原选择器替换为更稳定的
.g(Google搜索结果容器类),避免页面结构微调导致失效。 - 编码优化:写入CSV时指定
utf-8编码,防止非ASCII字符乱码。
内容的提问来源于stack exchange,提问作者pew pew
相关产品推荐
相关产品推荐

