【问题标题】:Scrape Google with Python - What is the correct URL for requests.get?用 Python 抓取 Google - requests.get 的正确 URL 是什么?
【发布时间】:2016-04-01 11:37:33
【问题描述】:

目标:我想验证特定的 Google 搜索是否在右侧有建议的结果,并且 - 如果有这样的建议 - 抓取一些信息,如公司类型/地址/等等。

方法:我想使用带有 Requests 和 BeautifulSoup4 的 Python 抓取工具

import bs4
import requests

address='https://www.google.co.ve/?gws_rd=cr&ei=DgBqVpWJMoPA-gHy25fACg#q=caracas+arepa'
page = requests.get(address)
soup = bs4.BeautifulSoup(page.content,'html.parser')
print (soup.prettify())

问题:

请求的页面不包括搜索结果(我不确定谷歌页面上的某些变量是否设置为不可见?),而只有谷歌页面的页眉和页脚

问题:

(1) 获取所述信息的替代方法?有什么想法吗?

(2) 一旦我用描述的方法得到了结果,但各自的地址构造不同(我记得谷歌网址中有很多数字,但遗憾的是无法重现搜索地址)。因此:是否需要 Google URL 以便可以通过 requests.get 抓取?

一百万谢谢,圣诞快乐,新年快乐!

【问题讨论】:

  • 提交程序化搜索查询是违反谷歌的Webmaster Guidelinesterms of service的。对 Google 运行此代码可能会导致 Google 显示来自您 IP 地址的搜索的验证码。

标签: python url web-scraping python-requests google-search


【解决方案1】:

您需要包含所有所需数据的select_one() 元素(容器)并检查if 它是否存在,如果存在,则抓取数据。

确保您使用user-agent 充当“真正的”用户访问,否则您的请求可能会被阻止,或者您会收到带有不同选择器的不同 HTML。 Check what's your user-agent.

Code and example in the online IDE:

from bs4 import BeautifulSoup
import requests, lxml

params = {
    "q": "caracas arepa bar google",
    "gl": "us"
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Safari/537.36"
}

html = requests.get("https://www.google.com/search", params=params, headers=headers, timeout=30)
soup = BeautifulSoup(html.text, "lxml")

# if right side knowledge graph is present -> parse the data.
if soup.select_one(".liYKde"):
    place_name = soup.select_one(".PZPZlf.q8U8x span").text
    place_type = soup.select_one(".YhemCb+ .YhemCb").text
    place_reviews = soup.select_one(".hqzQac span").text
    place_rating = soup.select_one(".Aq14fc").text

    print(place_name, place_type, place_reviews, place_rating, sep="\n")

# output:
'''
Caracas Arepa Bar
Venezuelan restaurant
1,123 Google reviews
4.5
'''

或者,您可以使用来自 SerpApi 的 Google Knowledge Graph API 来实现相同的目的。这是一个带有免费计划的付费 API。

最大的不同是你不需要弄清楚如何解析数据、增加请求数量、绕过谷歌和其他搜索引擎的屏蔽。

from serpapi import GoogleSearch

params = {
  "api_key": "YOUR_API_KEY",
  "engine": "google",
  "q": "caracas arepa bar place",
  "hl": "en"
}

search = GoogleSearch(params)
results = search.get_dict()

print(json.dumps([results["knowledge_graph"]], indent=2))


# part of the output:
'''
[
  {
    "title": "Caracas Arepa Bar",
    "type": "Venezuelan restaurant",
    "place_id": "ChIJVcQ2ll9ZwokRwmkvsArPXyo",
    "website": "http://caracasarepabar.com/",
    "description": "Arepa specialist offering creative, low-priced renditions of the Venezuelan corn-flour staple.",
    "local_map": {
      "image": "https://www.google.com/maps/vt/data=TF2Rd51PtEnU2M3pkZHYHKdSwhMDJ_ZwRfg0vfwlDRAmv1u919sgFl8hs_lo832ziTWxCZM9BKECs6Af-TA1hh0NLjuYAzOLFA1-RBEmj-8poygymcRX2KLNVTGGZZKDerZrKW6fnkONAM4Ui-BVN8XwFrwigoqqxObPg8bqFIgeM3LPCg",
      "link": "https://www.google.com/maps/place/Caracas+Arepa+Bar/@40.7131972,-73.9574167,15z/data=!4m2!3m1!1s0x0:0x2a5fcf0ab02f69c2?sa=X&hl=en",
      "gps_coordinates": {
        "latitude": 40.7131972,
        "longitude": -73.9574167,
        "altitude": 15
      }
    } ... much more results including place images, popular times, user reviews.
  }
]
'''

免责声明,我为 SerpApi 工作。

【讨论】:

    【解决方案2】:

    我觉得你的问题和google-search-with-python-reqeusts差不多,也许你能从中得到一些帮助~

    我同意 LiterallyElvis,API 比直接抓取更好。

    最后,如果你想使用 requests 来完成这项工作,我建议使用 PhantomJSselenium 来模拟浏览器工作,因为 Google 应该使用一些 AJAX 技术,在真实浏览器和爬虫之间产生不同的视图。

    由于在谷歌访问困难的国家,我无法直接重复您的问题,以上是我能想到的,希望对您有所帮助

    【讨论】:

      【解决方案3】:

      从 Google 地方信息等服务获取信息的最佳方式几乎总是the official API。也就是说,如果您对抓取一无所知,那么 HTTP 请求返回的内容很可能是供浏览器呈现的。 BeautifulSoup 所做的并不等同于渲染它接收到的数据,所以很可能你只是得到了无用的空容器,这些容器稍后会被动态填充。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-07
        • 1970-01-01
        • 2020-12-30
        • 2021-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多