如何使用Python抓取Google SERP

问题描述 投票:0回答:2

我正在尝试抓取一些谷歌搜索结果。我遵循了网上的几个教程,但是我遇到了问题,结果包含您首先需要接受的“cookie 框”。

这是我的代码:

from bs4 import BeautifulSoup
import requests
import csv
import re

urls = ["https://google.de/search?q=AL-KO Robolinho 110 preis",
        "https://google.de/search?q=AL-KO Robolinho 1150 W preis",
        "https://google.de/search?q=AL-KO Robolinho 300 E preis",
        "https://google.de/search?q=Yard Force X80i"]

fields = ["Price"]

with open('crawl-single-attribute/price.csv', 'w', newline="") as outfile:
    writer = csv.writer(outfile)
    writer.writerow(fields)

    for url in urls:
        print('URL: ' + url)
        source = requests.get(url).text
        soup = BeautifulSoup(source, 'lxml')
        model = dict()

        print(soup)

这是我的结果:

URL: https://google.de/search?q=AL-KO Robolinho 110 preis
<!DOCTYPE html>
<html dir="ltr" lang="de"><head><style nonce="5S2+IGx8vbOVCFxqR3V7gA">
//some css...
}
</style><title>Bevor Sie zur Google Suche weitergehen</title><meta content="initial-scale=1, maximum-scale=5, width=device-width" name="viewport"/><link href="//www.google.com/favicon.ico" rel="shortcut icon"/></head><body><div class="signin"><a class="button" href="https://accounts.google.com/ServiceLogin?hl=de&amp;cd=DE&amp;continue=https://www.google.de/search?q%3DAL-KO%2520Robolinho%2520110%2520preis&amp;gae=cb-">Anmelden</a></div><div class="box"><img alt="Google" height="28" src="//www.gstatic.com/images/branding/googlelogo/1x/googlelogo_color_68x28dp.png" srcset="//www.gstatic.com/images/branding/googlelogo/2x/googlelogo_color_68x28dp.png 2x" width="68"/><div class="productLogoContainer"><img alt="" aria-hidden="true" class="image" height="100%" src="https://www.gstatic.com/ac/cb/scene_cookie_wall_search_v2.svg" width="100%"/></div><h1>Bevor Sie zur Google Suche weitergehen</h1><div class="contentText">Google verwendet <a href="https://policies.google.com/technologies/cookies?hl=de&amp;utm_source=ucb" target="_blank">Cookies</a> und Daten für Folgendes:<ul><li>Dienste anbieten und betreiben, z. B. Störungen prüfen und Maßnahmen gegen Spam, Betrug oder Missbrauch ergreifen</li><li>Daten zu Zielgruppeninteraktionen und Websitestatistiken erheben, um zu verstehen, wie unsere Dienste verwendet werden</li></ul>Wenn Sie zustimmen, verwenden wir Cookies und Daten auch für Folgendes:<ul><li>Qualität unserer Dienste verbessern und neue Dienste entwickeln</li><li>Werbung ausliefern und die Effektivität von Werbung messen</li><li>Personalisierte Inhalte anzeigen, abhängig von Ihren Einstellungen</li><li>Personalisierte oder allgemeine Werbung bei Google und im Web anzeigen, abhängig von Ihren Einstellungen</li></ul>Die Auswahl nicht personalisierter Inhalte und Werbeanzeigen kann davon abhängen, welche Inhalte Sie sich gerade ansehen und wo Sie sich befinden (die Anzeigenbereitstellung basiert auf dem allgemeinen Standort). Personalisierte Inhalte und Werbeanzeigen können ebenfalls darauf basieren, darüber hinaus aber auch auf Aktivitäten wie Suchanfragen bei Google und Videos, die Sie sich bei YouTube ansehen. Zu personalisierten Inhalten und Werbeanzeigen gehören beispielsweise Dinge wie relevantere Ergebnisse und Empfehlungen, eine individuelle YouTube-Startseite und Werbung, die auf Ihre Interessen zugeschnitten ist.<p>Klicken Sie auf „Anpassen“, um sich Ihre Möglichkeiten anzusehen. Zu diesen gehören zum Beispiel Steuerelemente, um Cookies für die Personalisierung zu deaktivieren, oder Informationen zu Steuerelementen auf Browserebene, mit denen einige oder alle Cookies für andere Zwecke deaktiviert werden können.  Besuchen Sie bei Bedarf jederzeit g.co/privacytools.</p></div><div><a class="button" href="https://consent.google.de/dl?continue=https://www.google.de/search?q%3DAL-KO%2520Robolinho%2520110%2520preis&amp;gl=DE&amp;hl=de&amp;pc=srp&amp;src=1">Anpassen</a><form action="https://consent.google.de/s" method="POST" style="display:inline;"><input name="gl" type="hidden" value="DE"/><input name="m" type="hidden" value="0"/><input name="pc" type="hidden" value="srp"/><input name="continue" type="hidden" value="https://www.google.de/search?q=AL-KO%20Robolinho%20110%20preis"/><input name="ca" type="hidden" value="r"/><input name="x" type="hidden" value="8"/><input name="v" type="hidden" value="cb.20210615-14-p0.de+FX+101"/><input name="t" type="hidden" value="ADw3F8gm29ymoJbw-6FRb_NfSx3E0sy9CQ:1624224939770"/><input name="hl" type="hidden" value="de"/><input name="src" type="hidden" value="1"/><input aria-label="In die Verwendung von Cookies und anderen Daten zu den beschriebenen Zwecken einwilligen" class="button" type="submit" value="Ich stimme zu"/></form></div></div><div class="footer"><form action="https://consent.google.de/ml" method="get"><select id="languageselect" name="hl"><option value="af">Afrikaans</option><option value="az">azərbaycan</option><option value="bs">bosanski</option><option value="ca">català</option><option value="cs">Čeština</option><option value="cy">Cymraeg</option><option value="da">Dansk</option><option selected="" value="de">Deutsch</option><option value="et">eesti</option><option value="en-GB">English (United Kingdom)</option><option value="en">English (United States)</option><option value="es">Español (España)</option><option value="es-419">Español (Latinoamérica)</option><option value="eu">euskara</option><option value="fil">Filipino</option><option value="fr-CA">Français (Canada)</option><option value="fr">Français (France)</option><option value="ga">Gaeilge</option><option value="gl">galego</option><option value="hr">Hrvatski</option><option value="id">Indonesia</option><option value="zu">isiZulu</option><option value="is">íslenska</option><option value="it">Italiano</option><option value="sw">Kiswahili</option><option value="lv">latviešu</option><option value="lt">lietuvių</option><option value="hu">magyar</option><option value="ms">Melayu</option><option value="nl">Nederlands</option><option value="no">norsk</option><option value="uz">o‘zbek</option><option value="pl">polski</option><option value="pt-BR">Português (Brasil)</option><option value="pt-PT">Português (Portugal)</option><option value="ro">română</option><option value="sq">shqip</option><option value="sk">Slovenčina</option><option value="sl">slovenščina</option><option value="sr-Latn">srpski (latinica)</option><option value="fi">Suomi</option><option value="sv">Svenska</option><option value="vi">Tiếng Việt</option><option value="tr">Türkçe</option><option value="el">Ελληνικά</option><option value="be">беларуская</option><option value="bg">български</option><option value="ky">кыргызча</option><option value="kk">қазақ тілі</option><option value="mk">македонски</option><option value="mn">монгол</option><option value="ru">Русский</option><option value="sr">српски</option><option value="uk">Українська</option><option value="ka">ქართული</option><option value="hy">հայերեն</option><option value="iw">עברית</option><option value="ur">اردو</option><option value="ar">العربية</option><option value="fa">فارسی</option><option value="am">አማርኛ</option><option value="ne">नेपाली</option><option value="mr">मराठी</option><option value="hi">हिन्दी</option><option value="as">অসমীয়া</option><option value="bn">বাংলা</option><option value="pa">ਪੰਜਾਬੀ</option><option value="gu">ગુજરાતી</option><option value="or">ଓଡ଼ିଆ</option><option value="ta">தமிழ்</option><option value="te">తెలుగు</option><option value="kn">ಕನ್ನಡ</option><option value="ml">മലയാളം</option><option value="si">සිංහල</option><option value="th">ไทย</option><option value="lo">ລາວ</option><option value="my">မြန်မာ</option><option value="km">ខ្មែរ</option><option value="ko">한국어</option><option value="ja">日本語</option><option value="zh-CN">简体中文</option><option value="zh-TW">繁體中文</option><option value="zh-HK">繁體中文 (香港)</option></select><input name="oldhl" type="hidden" value="de"/><input name="gl" type="hidden" value="DE"/><input name="m" type="hidden" value="0"/><input name="pc" type="hidden" value="srp"/><input name="continue" type="hidden" value="https://www.google.de/search?q=AL-KO%20Robolinho%20110%20preis"/><input name="src" type="hidden" value="1"/><input type="submit" value="Sprache ändern"/></form><a href="https://policies.google.com/privacy?hl=de&amp;utm_source=ucb">Datenschutzerklärung</a> <a href="https://policies.google.com/terms?hl=de&amp;utm_source=ucb">Nutzungsbedingungen</a></div></body></html>
[Finished in 0.539s]

我得到了德语结果页面,“Bevor Sie zur Google Suche weitergehen”翻译为“在您进入 Google 搜索之前”。依此类推...如果您尚未登录并且尚未接受 cookie,那么这是您总是收到的 cookie 通知。我怎样才能绕过它?

python html web-scraping beautifulsoup
2个回答
0
投票

这是抓取网站时的常见问题。 实际上,您正在使用的库(即 BeautifulSoup)是围绕解析 HTML 代码以从中提取数据的想法构建的:

Beautiful Soup 将复杂的 HTML 文档转换为复杂的 Python 对象树。 /美丽汤-4 文档

这是相当正常的,因为它用于网络抓取。然而,这并不是真正要与页面交互。为此,您将需要一个“真正的”浏览器。这可以通过其他更适合该工作的工具实现自动化,例如 Selenium,它允许您与页面交互,甚至将自己连接到帐户。 Selenium 使用真正的浏览器并使用 API 与之交互。

实际上,我目前正在开发一个使用 Selenium 重新连接到我的 ISP 的项目。它可以是一个很好的例子和起点:qt-autoconnect

请记住,您可以同时使用两者:使用 Selenium 接受 cookie、建立连接并检索原始 HTML,然后使用 BeautifulSoup 解析 HTML!

作为结论,这里 | Medium.com 是一个很好的教程,介绍如何使用 Selenium 然后 BeautifulSoup 来让你继续前进。

玩得开心!


0
投票

您可以传递

SOCS
cookie 以避免 Google 搜索同意弹出窗口。

这是您更新的代码(也在 在线 IDE 中):

import csv, re, base64
from datetime import datetime
from bs4 import BeautifulSoup
import requests

queries = [
    "AL-KO Robolinho 110 preis",
    "AL-KO Robolinho 1150 W preis",
    "AL-KO Robolinho 300 E preis",
    "Yard Force X80i",
]

base_url = "https://www.google.de/search"

params = {
    "uule": "w+CAIQICIHR2VybWFueQ",
    "hl": "de",
    "gl": "de",
}

fields = ["Price"]

socs_cookie = base64.encodebytes(
    f"\b\x01\x12\x1C\b\x01\x12\x12gws_{datetime.today().strftime('%Y%m%d')}-0_RC3\x1A\x02de \x01\x1A\x06\b\x80º¦±\x06"
    .encode())

cookies = "; ".join([
    f"SOCS={socs_cookie}",
])

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

with open('crawl-single-attribute/price.csv', 'w', newline="") as outfile:
  writer = csv.writer(outfile)
  writer.writerow(fields)

  for query in queries:
    print('Query: ' + query)
    source = requests.get(
        base_url,
        params=params,
        headers=headers,
    ).text
    soup = BeautifulSoup(source, 'lxml')
    model = dict()

    consent_popup = soup.find(id="CXQnmb")

    is_consent = bool(re.search('Bevor Sie zu Google weitergehen', str(soup)))

    print(f"Has concent popup: {is_consent}")
    print(f"consent_popup element: {consent_popup}")
    print(f"First 200 chars from HTML: {str(soup)[0:200]}")

输出

Query: AL-KO Robolinho 110 preis
Has concent popup: False
consent_popup element: None
First 200 chars from HTML: <!DOCTYPE html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta charset="utf-8"/><meta content="origin" name="referrer"/><meta content="/images/branding/googleg/1x/google
Query: AL-KO Robolinho 1150 W preis
Has concent popup: False
consent_popup element: None
First 200 chars from HTML: <!DOCTYPE html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta charset="utf-8"/><meta content="origin" name="referrer"/><meta content="/images/branding/googleg/1x/google
Query: AL-KO Robolinho 300 E preis
Has concent popup: False
consent_popup element: None
First 200 chars from HTML: <!DOCTYPE html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta charset="utf-8"/><meta content="origin" name="referrer"/><meta content="/images/branding/googleg/1x/google
Query: Yard Force X80i
Has concent popup: False
consent_popup element: None
First 200 chars from HTML: <!DOCTYPE html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="de"><head><meta charset="utf-8"/><meta content="origin" name="referrer"/><meta content="/images/branding/googleg/1x/google

或者,您可以使用 SerpApi 从 Google 搜索结果中获取提取的价格。

(参考:https://serpapi.com/playground?q=AL-KO+Robolinho+1150+W+preis&location=germany&google_domain=google.de&gl=de&hl=de

这是代码:

from serpapi import GoogleSearch

params = {
  "api_key": "secret_api_key",
  "engine": "google",
  "q": "AL-KO Robolinho 1150 W preis",
  "google_domain": "google.de",
  "location": "germany",
  "hl": "de",
  "gl": "de"
}

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

for pricing in results.get("product_result", {}).get("pricing", []):
  print(f"Price: {pricing.get("price")}")

输出

Price: 1.287,72 €
Price: 1.070,03 €
Price: 796,00 €

免责声明:我在 SerpApi 工作。

© www.soinside.com 2019 - 2024. All rights reserved.