我正试图跟随第11章中的一些代码,用Python自动化无聊的东西。然而,lucky.py的一个程序似乎对我不起作用。该程序应该使用请求模块获取特定主题的Google搜索页面,然后在不同的选项卡中打开前5个搜索结果。当我查看Chrome的搜索页面时,我非常清楚,每个搜索结果链接(<a>
标记)都在一个div中,其中有一个类'r‘。但是,当我请求页面时,将下载的HTML发送到一个.txt文件并查看它,我发现搜索结果链接的代码是完全不同的。他们为什么不一样?devtools的全部目的不是成为一种快速检查网页中特定元素的HTML而不必遍历整个源代码的方法吗?
以前,我尝试使用soup.select('.r a')
,因为每个搜索页面都有带有类“r”的div中的搜索结果链接。那不管用。返回的列表总是空的。因此,为了排除故障,我将请求的页面发送到一个文件中,并找到链接所在的位置。文本文件中的链接都会导致错误404。我不知道发生了什么。
Devtools代码:
<div class="r">
<a href="https://www.crummy.com/software/BeautifulSoup/bs4/doc/" ping="/urlsa=t&source=web&rct=j&url=https://www.crummy.com/software/BeautifulSoup/bs4/doc/&ved=2ahUKEwjj1vTx3NXiAhVPinAKHersDyoQFjAAegQIAhAB"><h3 class="LC20lb">Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation</h3><br><div class="TbwUpd"><cite class="iUh30">https://www.crummy.com/software/BeautifulSoup/bs4/doc/</cite>
现在,我在请求的页面中找到了链接:
<div class="jfp3ef">
<a href="/urlq=https://www.crummy.com/software/BeautifulSoup/bs4/doc/&sa=U&ved=2ahUKEwjMjPST2tXiAhU463MBHWjMA0UQFjAAegQIChAB&usg=AOvVaw05aFh5uUJ_Z2oREgu8fzfA">
这是我用来获取页面的代码:
res = requests.get('https://www.google.com/search?q=' + ' '.join(['beautiful', 'soup'])
bs = open('soup.txt', 'wb')
for chunk in res.iter_content(100000):
bs.write(chunk)
发布于 2019-06-06 21:33:26
您几乎肯定需要关闭javascript才能像程序一样看到元素。https://github.com/maximelebreton/quick-javascript-switcher,您可以在铬扩展/加载项页面上找到它。这将允许您关闭页面上的javascript。在此之后,您会注意到页面看起来会不一样,您的链接很可能在不同的元素/类中。
在此之后,您应该能够找到正确的方法来针对devtools中的元素。
这些链接可能不起作用,也许是因为谷歌放了些饼干吧?但是,您得到了一个没有链接的列表,这让我认为您没有得到正确的css选择器。
发布于 2021-10-28 06:46:54
这是StackOverFlow上最常见的问题,在[requests]
和[bs4]
标记中被问到了200+ times,几乎每个解决方案都可以简单地添加user-agent
。
这是因为您没有指定user-agent
。当机器人或浏览器发送假的用户代理字符串以宣布自己为不同的客户端时,User-agent
需要充当“真正的”用户访问。
在使用user-agent
库时,当没有headers
被传递给请求时,它默认为python-请求,并且Google理解它是一个bot/脚本,然后它会阻塞一个请求(或者不管它做什么),您就会收到一个不同的CSS
选择器(有某种错误)。这就是为什么您得到的响应不像您所期望的那样包含一些CSS
选择器。
注意:添加user-agent
并不意味着它将修复这个问题,即使在旋转user-agents
__时,您仍然可以得到一个429 (或不同)错误。
Pass user-agent
headers = {
'User-agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582'
}
requests.get('URL', headers=headers)
或者,您也可以通过使用来自Google有机结果API的SerpApi来实现相同的目标。这是一个有免费计划的付费API。
不同的是,你不需要花时间试图绕过谷歌或其他搜索引擎的障碍,或者找出为什么某些东西不能正常工作。相反,您需要将重点放在要提取的数据上。看看游乐场。
免责声明,我为SerpApi工作。
https://stackoverflow.com/questions/56485313
复制相似问题