如何抓取Google搜索结果页?

时间:2018-07-11 13:27:15

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

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

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的行为就像它们不存在一样。  为什么这一切都会发生?

1 个答案:

答案 0 :(得分:0)

我绝不会直接通过原始http请求抓取Google。 Google可以很容易地检测到它。为了不被发现,我建议使用带有铬的自动浏览器,例如Chrome。

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

存在开放源代码库,可处理所有困难的刮取部分。例如GoogleScraper,这是用Python3编写的工具,它支持三种不同的抓取模式:Http原始抓取,硒模式(使用实际浏览器)和异步http模式。