【问题标题】:Web scrape Google search results using BeautifulSoup使用 BeautifulSoup 抓取 Google 搜索结果
【发布时间】:2015-11-23 06:47:52
【问题描述】:

我的目标是使用 BeautifulSoup 从网络上抓取 Google 搜索结果。我正在使用 Anaconda Python 并使用 Ipython 作为 IDE 控制台。为什么我在运行以下命令时没有得到输出?

def google_scrape(query):
    address = "http://www.google.com/search?q=%s&num=100&hl=en&start=0" % (urllib.quote_plus(query))
    request = urllib2.Request(address, None, {'User-Agent':'Mosilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11'})
    urlfile = urllib2.urlopen(request)
    page = urlfile.read()
    soup = BeautifulSoup(page)

    linkdictionary = {}

    for li in soup.findAll('li', attrs={'class':'g'}):
        sLink = li.find('a')
        print sLink['href']
        sSpan = li.find('span', attrs={'class':'st'})
        print sSpan

    return linkdictionary

if __name__ == '__main__':
    links = google_scrape('english')

【问题讨论】:

    标签: python web-scraping beautifulsoup information-retrieval


    【解决方案1】:

    Cody Bouche 提到的问题是 dict() 没有添加任何内容。 在我看来,如果您没有将 {}(dict) 更改为 [](array),您将很难更新您的 dict。

    附加到数组要简单得多(注意:我在这里可能是错的,这只是以前经验的个人意见)。

    要使其以简单的方式工作,您需要将 dict 更改为 array {} --> [],然后使用 .append({}) 附加到 list()

    online IDE中的代码和示例:

    def google_scrape(query):
        html = requests.get(f'https://www.google.com/search?q={query}', headers=headers).text
        soup = BeautifulSoup(html, 'lxml')
    
        data = []
    
        for container in soup.findAll('div', class_='tF2Cxc'):
            title = container.select_one('.DKV0Md').text
            link = container.find('a')['href']
    
            data.append({
              'title': title,
              'link': link,
            })
            print(f'{title}\n{link}')
    
        print(json.dumps(data, indent=2))
    
    google_scrape('english')
    
    # part of the outputs:
    '''
    English language - Wikipedia
    https://en.wikipedia.org/wiki/English_language
    [
      {
        "title": "English language - Wikipedia",
        "link": "https://en.wikipedia.org/wiki/English_language"
      },
    ]
    '''
    

    如果您仍想追加到dict(),那么这是处理此问题的方法之一(仅显示 for 循环的一部分):

    for container in soup.findAll('div', class_='tF2Cxc'):
    
        data_dict = {}
    
        title = container.select_one('.DKV0Md').text
        link = container.find('a')['href']
        # creates title key and assigns title value
        data_dict['title'] = title
        # creates link key and assigns link value
        data_dict['link'] = link
    
        print(json.dumps(data_dict, indent = 2))
    
    # part of the output:
    '''
    {
      "title": "Minecraft Official Site | Minecraft",
      "link": "https://www.minecraft.net/en-us/"
    }
    '''
    

    或者,您可以使用来自 SerpApi 的 Google Search Engine Results API 来做同样的事情。这是一个带有免费计划的付费 API。

    本质上,它与上面的代码做同样的事情,但你不需要弄清楚如何做某些事情或试图了解如何抓取某些元素,它已经为最终用户完成了 @987654333 @ 输出,所以唯一需要做的就是遍历 JSON 并获得所需的输出。

    要集成的代码:

    from serpapi import GoogleSearch
    import json
    
    params = {
      "api_key": "YOUR_API_KEY",
      "engine": "google",
      "q": "minecraft",
    }
    
    search = GoogleSearch(params)
    results = search.get_dict()
    
    for result in results['organic_results']:
      print(json.dumps(result, indent = 2, ensure_ascii = False))
    
    # part of the json output:
    '''
    {
      "position": 1,
      "title": "Minecraft - Aplikasi di Google Play",
      "link": "https://play.google.com/store/apps/details?id=com.mojang.minecraftpe&hl=in&gl=US",
      "displayed_link": "https://play.google.com › store › apps › details › id=co...",
      "rich_snippet": {
        "top": {
          "detected_extensions": {
            "skor": 46,
            "suara": 4144655,
            "us": 749
          },
          "extensions": [
            "Skor: 4,6",
            "‎4.144.655 suara",
            "‎US$7,49",
            "‎Android",
            "‎Game"
        ]
      }
    }
    '''
    

    免责声明,我为 SerpApi 工作。

    【讨论】:

      【解决方案2】:

      您永远不会向linkedDictionary 添加任何内容

      def google_scrape(query):
          address = "http://www.google.com/search?q=%s&num=100&hl=en&start=0" % (urllib.quote_plus(query))
          request = urllib2.Request(address, None, {'User-Agent':'Mosilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11'})
          urlfile = urllib2.urlopen(request)
          page = urlfile.read()
          soup = BeautifulSoup(page)
      
          linkdictionary = {}
      
          for li in soup.findAll('li', attrs={'class':'g'}):
              sLink = li.find('a')
              sSpan = li.find('span', attrs={'class':'st'})
      
              linkeDictionary['href'] = sLink['href']
              linkedDictionary['sSpan'] = sSpan
      
          return linkdictionary
      
      if __name__ == '__main__':
          links = google_scrape('english')
      

      【讨论】:

      • 我应该添加什么?
      • 任何你想退货的东西
      • 我想在网上搜索我得到的“英语”这个词的谷歌搜索结果。请问如何编辑此代码来做到这一点?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多