【问题标题】:Web Scraping Values on Google Search Results Page. Python, BeautifulSoup, Requests谷歌搜索结果页面上的网页抓取值。 Python,BeautifulSoup,请求
【发布时间】:2021-01-17 19:09:19
【问题描述】:

我是 Python 新手,我正在尝试编写一系列程序来向我的手机发送股票市场指数的表现。我有一些功能有限的程序,我相信如果可以从谷歌抓取数据,它们会得到改进,到目前为止我还无法做到这一点。我试图提取的值每次都在结果页面的顶部,几乎在某种表格中。在底部,我附上了我要抓取的值。

这是我目前用于网络抓取部分的代码部分。我正在使用漂亮的汤和请求。

import bs4
import requests

res = requests.get('https://www.google.com/search?safe=active&sxsrf=ALeKk00d7WrRTMvmhypG20E5MOEWpRwKlw%3A1601591747498&ei=w1l2X52DHoPatAXElILQDg&q=nasdaq+composite&oq=nasd&gs_lcp=CgZwc3ktYWIQAxgAMgwIIxAnEJ0CEEYQ-gEyBAgjECcyBAgjECcyCggAELEDEIMBEEMyCggAELEDEIMBEEMyCAgAELEDEIMBMgcIABCxAxBDMgcIABCxAxBDMgcIABCxAxBDMgoIABCxAxCDARBDOgQIABBHOgUIABCxAzoHCCMQ6gIQJzoHCCMQJxCdAjoECAAQQ1DszQ5Y9tkOYPjkDmgBcAJ4BYABqQOIAZ4NkgEJMS43LjEuMC4xmAEAoAEBqgEHZ3dzLXdperABCsgBCMABAQ&sclient=psy-ab')
type(res)
soup = bs4.BeautifulSoup(res.text,'lxml')
type(soup)

Current_Level = soup.find(class_='IsqQVc_NprOob_XcVN5d')

print (Current_Level)

如果您在 Google 上搜索“纳斯达克综合指数”,该链接将指向页面。我用于soup.find() 的类与您右键单击时的值对齐 - 检查网页上的值。

对所有解决方案开放以获得此值。感谢您的所有帮助,非常感谢!

Image of the value I'm trying to scrape

【问题讨论】:

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


    【解决方案1】:

    确保您使用的是user-agent,否则 Google 最终会阻止您的请求。 What is my user-agent

    代码和example in the online IDE

    import requests, lxml
    from bs4 import BeautifulSoup
    
    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"
    }
    
    params = {
      "q": "Nasdaq composite",
      "hl": "en"
    }
    
    
    def get_stock_price():
        soup = BeautifulSoup(requests.get('https://www.google.com/search', headers=headers, params=params).text, 'lxml')
    
        print(soup.select_one('[jsname=vWLAgc]').text)
    
    get_stock_price()
    
    # 15,108.77
    

    或者,您可以通过使用来自 SerpApi 的 Google Direct Answer Box API 来实现此目的。这是一个带有免费计划的付费 API。

    不同之处在于您不必深入研究 HTML 并提取某些内容,因为它已经为最终用户完成,包括绕过 Google 的阻止等等。

    要集成的代码:

    from serpapi import GoogleSearch
    import os
    
    def get_stock_price():
        params = {
          "api_key": os.getenv("API_KEY"),
          "engine": "google",
          "q": "Nasdaq composite",
          "google_domain": "google.com",
          "gl": "us",
          "hl": "en"
        }
    
        search = GoogleSearch(params)
        results = search.get_dict()
    
        print(results['answer_box']['price'])
    
    get_stock_price()
    
    # 15110.28
    

    免责声明,我为 SerpApi 工作。

    【讨论】:

    • ?喜欢这个免责声明
    【解决方案2】:

    尝试使用类名BNeawe iBp4i AP7Wnd

    import requests
    from bs4 import BeautifulSoup
    
    res = requests.get(
        "https://www.google.com/search?safe=active&sxsrf=ALeKk00d7WrRTMvmhypG20E5MOEWpRwKlw%3A1601591747498&ei=w1l2X52DHoPatAXElILQDg&q=nasdaq+composite&oq=nasd&gs_lcp=CgZwc3ktYWIQAxgAMgwIIxAnEJ0CEEYQ-gEyBAgjECcyBAgjECcyCggAELEDEIMBEEMyCggAELEDEIMBEEMyCAgAELEDEIMBMgcIABCxAxBDMgcIABCxAxBDMgcIABCxAxBDMgoIABCxAxCDARBDOgQIABBHOgUIABCxAzoHCCMQ6gIQJzoHCCMQJxCdAjoECAAQQ1DszQ5Y9tkOYPjkDmgBcAJ4BYABqQOIAZ4NkgEJMS43LjEuMC4xmAEAoAEBqgEHZ3dzLXdperABCsgBCMABAQ&sclient=psy-ab"
    )
    
    soup = BeautifulSoup(res.text, "lxml")
    
    # Using `.split()` to remove `+159.00 (1.42%)` from the output
    Current_Level = soup.find(class_="BNeawe iBp4i AP7Wnd").text.split('+')[0]
    print(Current_Level)
    

    输出:

    +257.47
    

    编辑:

    如果你调用soup.prettify(),你会看到数据在BNeawe iBp4i AP7Wnd类下:

    soup = BeautifulSoup(res.text, "lxml")
    print(soup.prettify())
    ...
    ...
    <div>
          <div>
           <div>
            <div class="kCrYT">
             <div>
              <div>
               <div>
                <div class="BNeawe iBp4i AP7Wnd">
                 <div>
                  <div class="BNeawe iBp4i AP7Wnd">
                   11,332.49
                   <span class="rQMQod AWuZUe">
                    +257.47 (2.32%)
                   </span>
                  </div>
                 </div>
                </div>
               </div>
              </div>
    ...
    ...
    

    【讨论】:

    • 非常感谢,效果很好。有一个后续问题。您是如何获得“BNeawe iBp4i AP7Wnd”值的?当我检查页面时,我找不到任何具有此值的类,我真的很困惑,因为这里的其他评论也使用了相同的类。
    • @JG71273 如果打印实际的soup 对象,您会看到数据在BNeawe iBp4i AP7Wnd 类下
    • 我无法理解你的意思。您是说添加行: print(soup) 吗?我试过了,并得到 None 作为返回文本。如果您的意思不同,您会提供一个最小的代码示例供我查看吗?对不起所有的问题,我对这一切还是很陌生。再次感谢您的所有帮助!
    • 运行它;说得通。感谢您对此的额外帮助。非常感谢。
    【解决方案3】:

    这是获取价值的方法。

    from bs4 import BeautifulSoup as soup
    import requests
    
    url_to_scrape = "https://www.google.com/search?q=nasdaq+composite&oq=nasdaq+composite&aqs=chrome.0.0l8.5126j1j4&sourceid=chrome&ie=UTF-8"
    
    try:
        client_page = requests.get(url_to_scrape)
    except:
        print("Request aborted due to unknown reason!")
    
    page_html = client_page.text
    client_page.close()
    
    page_soup = soup(page_html,"html.parser") 
     
    nasdaqValue = page_soup.findAll("div",{"class":"BNeawe iBp4i AP7Wnd"})
    print(nasdaqValue[0].text)
    
    

    【讨论】:

    • 非常感谢,效果很好。有一个后续问题。您是如何获得“BNeawe iBp4i AP7Wnd”值的?当我检查页面时,我找不到任何具有此值的类,我真的很困惑,因为这里的其他评论也使用了相同的类。
    最近更新 更多