【问题标题】:Python simple webscrapingPython 简单的网页抓取
【发布时间】:2020-06-08 13:19:04
【问题描述】:

这是一个自定义代码,如自动化无聊的东西网页抓取第 11 章。但我似乎无法让它工作,所以我稍微改变了它。但我仍然会得到一个空列表作为回报。

我在 cmd 中运行这个脚本,例如脚本的标题是 allsearch.py​​ ,它将是 allsearch.py​​ 你想在 cmd 中搜索的东西。

import requests, sys, webbrowser, bs4

print('Searching...')    # display text while downloading the search result page
res = requests.get('https://www.google.com/search?q=' + ' '.join(sys.argv[1:]))

try:
    res.raise_for_status()  
except Exception as Ex:
    print(f'Error as occur: {Ex}')

if res.status_code == 200:
    print('Success')
else:
    print('Not Found')

# Retrieve top search result links.
soup = bs4.BeautifulSoup(res.text, 'html.parser')
# Open a browser tab for each result.
linkElems = soup.select('a href')
print(linkElems)

#Opening the searches
numOpen = min(5, len(linkElems))
for i in range(numOpen):
    urlToOpen = 'https://www.google.com/search?q=' + linkElems[i].get('href')
    print('Opening', urlToOpen)
    webbrowser.open(urlToOpen)

我似乎无法在这里找到问题。

【问题讨论】:

  • 你是如何执行这个脚本的?请将脚本调用添加到问题中。
  • 你试过print(res.text)吗?了解 Google,他们可能会检测到 requests,并且不会向您显示任何您可以抓取的搜索结果。
  • 是的,res.text 很好,因为它成功获取了数据。它只是我想在浏览器中自动打开我输入的选项卡。它的链接 Elems 在我打印出来时有一个空列表。

标签: python web-scraping beautifulsoup python-requests


【解决方案1】:

问题出在你的行上:

linkElems = soup.select('a href')

a是容器类型,当你这样输入时,它正在寻找带有a href标签的容器——没有。

href 是一个属性,如果你想使用它,你需要为它提供一个值。 bs4 dox中有很多例子。

尝试:

linkElems = soup.select('a')

你会得到丰硕的回应。

【讨论】:

  • 这实际上打开了浏览器中的选项卡,但实际上并不是我希望它打开的内容,你知道无论如何要在 google 中打开链接。例如,如果我输入键盘,它会自动在 google 中自动打开键盘链接。
  • 我不明白“在 Google 中打开链接”是什么意思.您的意思是在一个页面中“显示搜索结果”,就好像您在 Google 搜索中键入内容并希望看到结果页面一样?
  • 是的,我想用你在cmd中输入的词打开浏览器搜索的所有搜索结果
  • 仍然不清楚“打开所有搜索结果”是什么意思,因为这就是您的代码正在做的事情......在不同的选项卡中打开所有结果。如果您只想显示搜索结果本身,那么您不需要抓取任何内容。您已经在代码的第 4 行构建了搜索命令...在构建后打开该链接。
  • 是的,我明白你的意思,但如果你尝试它,它实际上并没有打开搜索结果链接,它只是打开了一些你输入的关键字的 rnadom tbas
【解决方案2】:

您可能需要添加标题才能访问 google 结果,因此请从以下内容开始:

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}

res = requests.get('https://www.google.com/search?q=' + ' '.join(sys.argv[1:]), headers=headers)

那么,对于linkElems

linkElems = soup.select("div.r a[href]")

这意味着查找所有具有hrefa 标签,位于divclass='r' 下。这是为了仅从结果中获取 a[href],而不是从页面中的其他位置获取。

要打开href 链接,请在最后一个循环中执行以下操作:

urlToOpen = linkElems[i].get('href')
#...

,因为href 已经存储了完整的网址。

【讨论】:

  • 我了解 linkelems 部分,但我不确定 headers 变量的作用,您能再解释一下吗?谢谢。
  • 做一个不带标题的print(soup.text),然后用标题再做一次。你会发现它们是不同的。那是因为谷歌发现它是一个执行请求的脚本并且不会显示返回搜索结果。与@AKX 所说的相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2021-01-12
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多