如何在Google自定义搜索API中获取网站完整标题?
问题描述
我用Google自定义搜索API获取搜索结果,发现部分返回的标题被截断(以“...”结尾),想拿到完整标题。试过用Selenium访问页面取标题,但速度太慢,不是合适的方案。
我的搜索代码:
def google_search(query, **kwargs): service = build("customsearch", "v1", developerKey=app.config.get("GOOGLE_API_KEY")) res = service.cse().list(q=query, cx=app.config.get("GOOGLE_CSE_KEY"),**kwargs).execute() return res['items'] response = google_search(query, num=pageSize, start=start) for item in response: print('Title: ', item['title'])
尝试过的Selenium方案(效率太低):
def get_full_title(title, url): if title.endswith("..."): driver = webdriver.Chrome(options=options) driver.get(url) fullTitle = driver.title driver.quit() return fullTitle return title
请问怎么获取完整标题?可编程搜索引擎里有没有相关设置能实现?
解决方案
1. 调整Google自定义搜索控制台设置
登录Google自定义搜索控制台(CSE),找到你的搜索引擎配置:
- 进入外观选项卡
- 找到搜索结果区域,查看「标题长度」相关设置,尝试调大允许的最大标题长度
- 部分版本的CSE有「是否截断长标题」的开关,关闭后API返回的标题可能会保留完整内容
2. 从API返回的pagemap字段提取完整标题
Google自定义搜索API的返回结果里,部分条目会包含pagemap字段,里面可能存着网页的原始元数据(比如og:title或者页面的<title>标签内容),可以从这里提取完整标题:
def get_full_title_from_api(item): # 优先取og:title(通常是完整的) if 'pagemap' in item and 'metatags' in item['pagemap']: for meta in item['pagemap']['metatags']: if 'og:title' in meta: return meta['og:title'] # 没有og:title就取普通title标签内容 if 'title' in meta: return meta['title'] # 没有pagemap就返回原标题 return item['title'] # 使用示例 response = google_search(query, num=pageSize, start=start) for item in response: full_title = get_full_title_from_api(item) print('Full Title: ', full_title)
3. 用轻量HTTP请求替代Selenium
如果上面的方法都不行,可以用requests+BeautifulSoup做轻量请求,直接抓网页的<title>标签,速度比Selenium快很多:
import requests from bs4 import BeautifulSoup def get_full_title_fast(url): try: 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' } response = requests.get(url, headers=headers, timeout=5) soup = BeautifulSoup(response.text, 'html.parser') if soup.title: return soup.title.string.strip() except Exception as e: print(f"获取标题失败: {e}") return None # 使用示例 response = google_search(query, num=pageSize, start=start) for item in response: if item['title'].endswith("..."): full_title = get_full_title_fast(item['link']) or item['title'] else: full_title = item['title'] print('Full Title: ', full_title)
注意事项
- 修改CSE控制台设置后,需要等几分钟到几小时才会生效
pagemap字段不是所有条目都有,取决于目标网页是否正确配置了元数据- 用
requests请求时,要设置合理的请求头和超时时间,避免被目标网站封IP
内容的提问来源于stack exchange,提问作者devstar2422
相关产品推荐
相关产品推荐

