簡體   English   中英

使用 Python 抓取 Google - requests.get 的正確 URL 是什么?

[英]Scrape Google with Python - What is the correct URL for requests.get?

目標:我想驗證,如果特定的谷歌搜索在右側有建議的結果,並且 - 如果有這樣的建議 - 抓取一些信息,如公司類型/地址等。

谷歌搜索結果頁面,右側有建議

方法:我想使用帶有 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())

問題:

請求的頁面不包括搜索結果(我不確定谷歌頁面上的某些變量是否設置為不可見?),而只有谷歌頁面的 header 和頁腳

問題:

  1. 獲取所述信息的替代方法? 有任何想法嗎?

  2. 一旦我用描述的方法獲得了結果,但是各自的地址構造不同(我記得谷歌URL中的許多數字,但不幸的是無法重現搜索地址)。 因此:是否需要 Google URL 才能通過 requests.get 抓取?

從諸如Google Places之類的服務中獲取信息的最佳方法幾乎總是官方API 就是說,如果您對抓取行為一無所知,那么HTTP請求返回的內容很可能是供瀏覽器呈現的。 BeautifulSoup所做的並不等同於呈現接收到的數據,因此很可能您只是獲得了無用的空容器,這些容器隨后會動態填充。

我認為您的問題類似於google-search-with-python-reqeusts ,也許您可​​以從中獲得一些幫助〜

我同意LiterallyElvis的觀點,API比直接爬網更好。

最后,如果您想使用這項工作的請求,我建議使用PhantomJSselenium來模擬瀏覽器的工作,因為Google應該使用一些AJAX技術,從而在真實的瀏覽器和搜尋器之間產生不同的視圖。

由於在Google難以訪問的國家/地區,我無法直接重復您的問題,以上是我可以考慮的內容,希望對您有所幫助

您需要包含所有所需數據的select_one()元素(容器)並檢查它if存在,如果存在,則抓取數據。

確保您使用user-agent來充當“真實”用戶訪問,否則您的請求可能會被阻止,或者您會收到帶有不同選擇器的不同 HTML。檢查你的user-agent是什么

在線 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 知識圖譜 API實現相同的目的。 這是帶有免費計划的付費 API。

最大的區別是您不需要弄清楚如何解析數據、增加請求數量、繞過 Google 和其他搜索引擎的阻止。

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 工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM