我正在尝试使用以下代码抓取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的行为就像它们不存在一样。 为什么这一切都会发生?
答案 0 :(得分:0)
我绝不会直接通过原始http请求抓取Google。 Google可以很容易地检测到它。为了不被发现,我建议使用带有铬的自动浏览器,例如Chrome。
在您的示例中,问题在于Google为其SERP页面提供了不同的HTML版本,因为它检测到了较低级别的http抓取。
存在开放源代码库,可处理所有困难的刮取部分。例如GoogleScraper,这是用Python3编写的工具,它支持三种不同的抓取模式:Http原始抓取,硒模式(使用实际浏览器)和异步http模式。