【问题标题】:How to scrape a google search results page?如何抓取谷歌搜索结果页面?
【发布时间】:2018-12-19 13:36:28
【问题描述】:

我正在尝试使用以下代码抓取 google 搜索结果。我想获取结果第一页的标题和 url,然后继续抓取搜索结果的下一页。 这是我刚开始编写的代码示例:

from urllib.request import urlopen as uReq
import urllib.request
from bs4 import BeautifulSoup as soup


paging_url = "https://www.google.gr/search?q=donald+trump&ei=F91FW8XBGYjJsQHQwaWADA&start=110&sa=N&biw=811&bih=662"

req = urllib.request.Request("https://www.google.gr/search?q=donald+trump&ei
=F91FW8XBGYjJsQHQwaWADA&start=110&sa=N&biw=811&bih=662",headers = {'User-Agent':"Magic Browser"})

UClient = uReq(req)  # downloading the url
page_html = UClient.read()
UClient.close()

page_soup = soup(page_html, "html.parser")

我注意到所有 google 搜索结果都有一个名为“g”的通用类。于是我写了如下命令:

results= page_soup.findAll("div",{"class":"g"})

但是经过测试得到的结果和我访问初始网址时看到的不一样。

另外还有一些div标签如:

<div data-hveid="38" data-ved="0ahUKEwjGp7XEj5fcAhXMDZoKHRf8DJMQFQgmKAAwAA">

<div class="rc">

在 BeautifulSoup 生成的树中看不到。这意味着我不能使用 findAll 函数来定位这些标签内的对象,因为 BeautifulSoup 的行为就像它们不存在一样。 为什么会发生这一切?

【问题讨论】:

  • 当你打印这个print(page_soup.title)时你看到了什么?
  • 这是打印的内容:donald trump - Αναζήτηση Google
  • 试试这个以获得第一个标题和链接print(page_soup.select_one("h3.r a").text,page_soup.select_one("h3.r a").get("href"))
  • 它有效,但由于某种原因,我不采用第一个而是第二个搜索结果。当我使用上面提到的我自己的“解决方案”时也会发生同样的情况。由于某种原因,第一个搜索结果无法访问。

标签: python python-3.x web-scraping


【解决方案1】:

我永远不会通过原始 http 请求直接抓取 Google。谷歌可以很容易地检测到它。为了不被检测到,我建议使用带有 selenium 的 Chrome 等自动浏览器。

在您的示例中,问题在于 Google 提供了其 SERP 页面的不同 HTML 版本,因为它检测到低级别的 http 抓取。

存在可以处理抓取的所有困难部分的开源库。比如GoogleScraper,这是一个用Python3编写的工具,支持三种不同的抓取方式:Http raw抓取、selenium方式(带有真实浏览器)和异步http方式。

【讨论】:

  • 非常感谢您!我会调查的!
猜你喜欢
  • 2020-05-03
  • 2023-03-20
  • 2018-01-15
  • 2021-01-17
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
相关资源
最近更新 更多