无法从Gotriple页面爬取链接,AsyncHTMLSession渲染仅得占位符
解决思路与方案
优化AsyncHTMLSession等待逻辑
固定sleep没法保证内容加载完成,换用等待目标元素出现的方式,精准触发内容加载完成后的提取操作:
async def FromTriple(self, doi): asession = AsyncHTMLSession() url = 'https://www.gotriple.eu/documents?q=' + doi[16:] website = await asession.get(url) # 等待实际结果链接加载,超时10秒 await website.html.arender( wait_for='.gt-search-result__item a', timeout=10000, keep_page=True ) links = website.html.find('.gt-search-result__item a') # 整理成可用的链接数据 result = [(link.text, link.attrs['href']) for link in links if 'href' in link.attrs] await asession.close() return result
直接调用API(推荐)
观察页面请求会发现,网站的搜索结果是通过后端API返回的,绕开页面渲染直接请求API更高效稳定:
import aiohttp async def FromTriple(self, doi): doi_suffix = doi[16:] api_url = f'https://api.gotriple.eu/search/documents?q={doi_suffix}' async with aiohttp.ClientSession() as session: async with session.get(api_url) as resp: if resp.status != 200: return [] data = await resp.json() # 从API返回的JSON中提取链接,字段根据实际返回调整 links = [] for item in data.get('hits', []): # 示例:假设链接存储在item的'web_url'字段,实际以API返回为准 if 'web_url' in item: links.append(item['web_url']) return links
小提示
- 可以打开浏览器开发者工具的Network面板,搜索
documents找到对应的API请求,查看返回的JSON结构,确认要提取的字段名。 - 这种方法不需要处理页面渲染的各种问题,速度更快,稳定性更高。
内容的提问来源于stack exchange,提问作者Mattz
相关产品推荐
相关产品推荐

