【问题标题】:Scrape the snippet text from google search page从谷歌搜索页面抓取片段文本
【发布时间】:2021-07-20 12:24:25
【问题描述】:

当我们在 google 中搜索一个问题时,它通常会在 sn-p 中产生一个答案,如下所示:

我的目标是在我的 python 代码中抓取此文本(“August 4, 1961”在屏幕截图中被红色标记包围)。

在尝试抓取文本之前,我使用以下代码将 Web 响应存储在文本文件中:

page = requests.get("https://www.google.com/search?q=when+barak+obama+born")
soup = BeautifulSoup(page.content, 'html.parser')
out_file = open("web_response.txt", "w", encoding='utf-8')
out_file.write(soup.prettify())

inspect element 部分,我注意到 sn-p 在 div 类 Z0LcW XcVN5d 内(在屏幕截图中被绿色标记包围)。但是,我的 txt 文件中的响应不包含此类文本,更不用说类名了。

我也尝试过this solution,作者在其中抓取了 ID 为 rhs_block 的项目。但是我的回复中没有这样的 id。

我在我的响应 txt 文件中搜索了“1961 年 8 月 4 日”的出现,并试图理解它是否可能是 sn-p。但这些事件似乎都不是我想要的。

我的计划是获取 sn-p 的 div id 或类名并找到它的内容,如下所示:

# IT'S A PSEUDO CODE
containers = soup.find_all(class or id = 'somehting')
for tag in containers:
    print(f"tag text : {tag.text}")

有什么办法吗?

注意:我也可以使用除beautifulsoup 和requests 以外的库,只要它能产生结果。

【问题讨论】:

    标签: python html selenium web-scraping google-search


    【解决方案1】:

    没有必要使用Selenium,您可以使用requestsBS4 来实现,因为您需要的所有内容都位于HTML 中,并且没有动态JavaScript。

    online IDE中的代码和示例:

    from bs4 import BeautifulSoup
    import requests, lxml
    
    headers = {
        'User-agent':
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
    }
    
    html = requests.get('https://www.google.com/search?q=Barack Obama born date', headers=headers).text
    
    soup = BeautifulSoup(html, 'lxml')
    
    born = soup.select_one('.XcVN5d').text
    age = soup.select_one('.kZ91ed').text
    
    print(born)
    print(age)
    

    输出:

    August 4, 1961
    age 59 years
    

    【讨论】:

    • 谢谢你,@vitaliis!
    【解决方案2】:

    Selenium 将产生您需要的结果。 这很方便,因为您可以添加任何等待并查看屏幕上实际发生的情况。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    
    driver = webdriver.Chrome(executable_path='/snap/bin/chromium.chromedriver')
    
    driver.get('https://google.com/')
    assert "Google" in driver.title
    wait = WebDriverWait(driver, 20)
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".gLFyf.gsfi")))
    input_field = driver.find_element_by_css_selector(".gLFyf.gsfi")
    input_field.send_keys("how many people in the world")
    input_field.send_keys(Keys.RETURN)
    
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".Z0LcW.XcVN5d")))
    result = driver.find_element_by_css_selector(".Z0LcW.XcVN5d").text
    print(result)
    driver.close()
    driver.quit()
    

    结果可能会让你感到惊讶:)

    您需要安装SeleniumChromedriver。您需要将 Chromedriver 可执行文件放在 Windows 的路径中,或者在 Linux 中显示它的路径。我的示例适用于 Linux。

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 2022-08-17
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 2022-08-12
      相关资源
      最近更新 更多