【问题标题】:Extract Google Search Results提取谷歌搜索结果
【发布时间】:2011-05-21 06:37:28
【问题描述】:

我想定期检查 Google 列出了哪些子域。

要获取子域列表,我在 Google 搜索框中输入“site:example.com” - 这会列出所有子域结果(我们的域超过 20 个页面)。

仅提取“site:example.com”搜索返回的地址的 URL 的最佳方法是什么?

我正在考虑编写一个小的 python 脚本来执行上述搜索并对搜索结果中的 URL 进行正则表达式(在所有结果页面上重复)。这是一个好的开始吗?有没有更好的方法?

干杯。

【问题讨论】:

    标签: python regex subdomain extract


    【解决方案1】:

    【讨论】:

    • 或者JSON格式,在Python中非常好用(带有json模块)
    • AFAIK 自定义搜索不允许搜索整个网络,只允许搜索选定的域。搜索的重点可能是浏览整个网络 :)
    【解决方案2】:

    正则表达式对于解析 HTML 来说是个坏主意。阅读和依赖格式良好的 HTML 很神秘。

    尝试BeautifulSoup 用于 Python。下面是一个示例脚本,它从 site:domain.com Google 查询的前 10 个页面返回 URL。

    import sys # Used to add the BeautifulSoup folder the import path
    import urllib2 # Used to read the html document
    
    if __name__ == "__main__":
        ### Import Beautiful Soup
        ### Here, I have the BeautifulSoup folder in the level of this Python script
        ### So I need to tell Python where to look.
        sys.path.append("./BeautifulSoup")
        from BeautifulSoup import BeautifulSoup
    
        ### Create opener with Google-friendly user agent
        opener = urllib2.build_opener()
        opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    
        ### Open page & generate soup
        ### the "start" variable will be used to iterate through 10 pages.
        for start in range(0,10):
            url = "http://www.google.com/search?q=site:stackoverflow.com&start=" + str(start*10)
            page = opener.open(url)
            soup = BeautifulSoup(page)
    
            ### Parse and find
            ### Looks like google contains URLs in <cite> tags.
            ### So for each cite tag on each page (10), print its contents (url)
            for cite in soup.findAll('cite'):
                print cite.text
    

    输出:

    stackoverflow.com/
    stackoverflow.com/questions
    stackoverflow.com/unanswered
    stackoverflow.com/users
    meta.stackoverflow.com/
    blog.stackoverflow.com/
    chat.meta.stackoverflow.com/
    ...
    

    当然,您可以将每个结果附加到一个列表中,以便为子域解析它。几天前我刚接触 Python 并开始学习,但这应该可以帮助您入门。

    【讨论】:

    • JavaScript 有类似的东西吗?
    • 我刚刚在 Google 上搜索了“javascript 屏幕抓取”,但 pjscrape 看起来很有希望。
    【解决方案3】:

    使用requestsbs4 的另一种方法:

    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/72.0.3538.102 Safari/537.36 Edge/18.19582"
    }
    
    params = {'q': 'site:minecraft.fandom.com'}
    
    html = requests.get(f'https://www.google.com/search?q=',
                        headers=headers,
                        params=params).text
    soup = BeautifulSoup(html, 'lxml')
    
    for container in soup.findAll('div', class_='tF2Cxc'):
       link = container.find('a')['href']
       print(link)
    

    输出:

    https://minecraft.fandom.com/wiki/Podzol
    https://minecraft.fandom.com/wiki/Pumpkin
    https://minecraft.fandom.com/wiki/Swimming
    https://minecraft.fandom.com/wiki/Polished_Blackstone
    https://minecraft.fandom.com/wiki/Nether_Quartz_Ore
    https://minecraft.fandom.com/wiki/Blacksmith
    https://minecraft.fandom.com/wiki/Grindstone
    https://minecraft.fandom.com/wiki/Spider
    https://minecraft.fandom.com/wiki/Crash
    https://minecraft.fandom.com/wiki/Tuff
    

    要使用分页从每个页面获取这些结果:

    from bs4 import BeautifulSoup
    import requests, urllib.parse
    import lxml
    
    def print_extracted_data_from_url(url):
    
        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"
        }
        response = requests.get(url, headers=headers).text
    
        soup = BeautifulSoup(response, 'lxml')
    
        print(f'Current page: {int(soup.select_one(".YyVfkd").text)}')
        print(f'Current URL: {url}')
        print()
    
        for container in soup.findAll('div', class_='tF2Cxc'):
            head_link = container.a['href']
            print(head_link)
    
        return soup.select_one('a#pnnext')
    
    
    def scrape():
        next_page_node = print_extracted_data_from_url(
            'https://www.google.com/search?hl=en-US&q=site:minecraft.fandom.com')
    
        while next_page_node is not None:
            next_page_url = urllib.parse.urljoin('https://www.google.com', next_page_node['href'])
    
            next_page_node = print_extracted_data_from_url(next_page_url)
    
    scrape()
    

    部分输出:

    Results via beautifulsoup
    
    Current page: 1
    Current URL: https://www.google.com/search?hl=en-US&q=site:minecraft.fandom.com
    
    https://minecraft.fandom.com/wiki/Podzol
    https://minecraft.fandom.com/wiki/Pumpkin
    https://minecraft.fandom.com/wiki/Swimming
    https://minecraft.fandom.com/wiki/Polished_Blackstone
    https://minecraft.fandom.com/wiki/Nether_Quartz_Ore
    https://minecraft.fandom.com/wiki/Blacksmith
    https://minecraft.fandom.com/wiki/Grindstone
    https://minecraft.fandom.com/wiki/Spider
    https://minecraft.fandom.com/wiki/Crash
    https://minecraft.fandom.com/wiki/Tuff
    

    或者,您可以使用来自 SerpApi 的 Google Search Engine Results API。这是一个付费 API,可免费试用 5,000 次搜索。

    要集成的代码:

    from serpapi import GoogleSearch
    import os
    
    params = {
      "engine": "google",
      "q": "site:minecraft.fandom.com",
      "api_key": os.getenv('API_KEY')
    }
    
    search = GoogleSearch(params)
    results = search.get_dict()
    
    for result in results['organic_results']:
      link = result['link']
      print(link)
    

    输出:

    https://minecraft.fandom.com/wiki/Podzol
    https://minecraft.fandom.com/wiki/Pumpkin
    https://minecraft.fandom.com/wiki/Swimming
    https://minecraft.fandom.com/wiki/Polished_Blackstone
    https://minecraft.fandom.com/wiki/Nether_Quartz_Ore
    https://minecraft.fandom.com/wiki/Blacksmith
    https://minecraft.fandom.com/wiki/Grindstone
    https://minecraft.fandom.com/wiki/Spider
    https://minecraft.fandom.com/wiki/Crash
    https://minecraft.fandom.com/wiki/Tuff
    

    使用分页:

    import os
    from serpapi import GoogleSearch
    
    def scrape():
      
      params = {
        "engine": "google",
        "q": "site:minecraft.fandom.com",
        "api_key": os.getenv("API_KEY"),
      }
    
      search = GoogleSearch(params)
      results = search.get_dict()
    
      print(f"Current page: {results['serpapi_pagination']['current']}")
    
      for result in results["organic_results"]:
          print(f"Title: {result['title']}\nLink: {result['link']}\n")
    
      while 'next' in results['serpapi_pagination']:
          search.params_dict["start"] = results['serpapi_pagination']['current'] * 10
          results = search.get_dict()
    
          print(f"Current page: {results['serpapi_pagination']['current']}")
    
          for result in results["organic_results"]:
              print(f"Title: {result['title']}\nLink: {result['link']}\n")
    scrape()
    

    免责声明,我为 SerpApi 工作。

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 2019-04-10
      • 2012-04-10
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 2015-12-29
      相关资源
      最近更新 更多