📜  如何使用 BeautifulSoup 在谷歌搜索结果中获得页面排名?

📅  最后修改于: 2022-05-13 01:55:41.092000             🧑  作者: Mango

如何使用 BeautifulSoup 在谷歌搜索结果中获得页面排名?

在本文中,我们将学习如何通过使用Python搜索关键字来获得 Google 页面排名。让我们了解 Google 排名的基础知识,然后我们继续使用Python进行查找。

谷歌排名

谷歌关键词排名是当用户搜索关键词时网站在谷歌搜索中的位置。换句话说,Google 搜索基本上是在搜索索引中对数千亿个网页进行排序,以在几分之一秒内找到最相关、最有用的结果,并以一种可帮助您找到所需内容的方式呈现它们.

我们如何找到排名?

我们使用了一个叫做requests的模块,它有一个方法get返回一个包含页面内容、状态等的响应,我们将响应保存到一个对象页面,并使用page.text方法从对象中提取页面内容,并使用漂亮的汤来使用 python 的内置 HTML 解析器解析 HTML 中的文档,以便我们可以访问 HTML 文档中的数据并从搜索的关键字中获取 URL。

需要的模块

我们需要在你的系统中通过pip分别安装requests和bs4这两个模块。

请求:请求模块允许您发送 HTTP 请求并返回包含状态、页面内容等所有数据的响应。



Syntax: pip install requests

Beautiful Soup:beautiful Soup模块允许您使用 python 的内置 HTML 解析器解析原始 HTML 或 XML 文档,以便我们可以从解析的文档中提取数据。

pip install bs4

方法:

1.我们需要提供要搜索的关键字和网站,如果它存在于给定数量的搜索查询中,则可以找到排名。

2.使用requests.get(url)方法向 Google 搜索发送 HTTP 请求,该搜索返回来自搜索引擎的响应,该响应作为对象保存到页面。

3.使用page.text方法获取页面内容,使用beautiful Soup解析原始HTML。

soup = BeautifulSoup(page.text, 'html.parser')

这将创建一个解析树,帮助访问 HTML 文档中的数据。



4.找到div,所有的类都叫“ZINbbc xpd O9g5cc uUPGi” 使用soup.find_all() 因为它包含所有搜索查询以及 标签内的 URL,并将其存储在 result_div 中。 (参考下面有开发者工具的图片)

这是开发人员工具的图像,其中所有搜索查询都具有相同的 div 类但包含不同的 URL,我们可以通过检查 标记中的 URL 看到这里的排名为 2。

5.迭代 result_div 并找到 标签并检查是否存在任何 URL,如果找到,则检查它是否与输入中提供的网站匹配并将排名添加到 rank_list。 (rank_list 是一个字符串变量,因为可以出现多个等级)

6.迭代结束后,返回rank_list并打印rank。

下面是完整的实现:

Python3
# import the required modules
import requests
from bs4 import BeautifulSoup
 
# Function will get all the ranks of the website
# by searching the keyword in google and returns
# a string of ranks or Website Missing if the website
# doesn't occur in the given number of search queries.
def find_rank(keyword, website, search_query):
 
    # Initialise the required variables
    rank, rank_list = 1, ""
 
    # Base search url of google
    url = "https://www.google.com/search?q="
 
    # Replaces whitespace with "+" in keyword
    keyword = keyword.replace(" ", "+")
 
    # Base url is updated with the keyword to be
    # searched in given number of search results.
    url = url + keyword + "&num=" + str(search_query)
 
    # requests.get(url) returns a response that is saved
    # in a response object called page.
    page = requests.get(url)
 
    # page.text gives us access to the web data in text
    # format, we pass it as an argument to BeautifulSoup
    # along with the html.parser which will create a
    # parsed tree in soup.
    soup = BeautifulSoup(page.text, 'html.parser')
 
    # soup.find_all finds the div, all having the same
    # class "ZINbbc xpd O9g5cc uUPGi" that is stored
    # in result_div
    result_div = soup.find_all(
        'div', attrs={'class': 'ZINbbc xpd O9g5cc uUPGi'})
 
    # Iterate result_div and check for the given website
    # inside  tag adding the rank to the
    # rank_list if found.
    for div in result_div:
        try:
 
          # Finds  tag and checks if the url is present,
          # if present then check with the provided
          # website in main()
            link = div.find("a", href=True)
            if link['href'][7:7+len(website)] == website:
                rank_list += str(rank)+","
            rank += 1
        except:
            pass
    return (rank_list, "Website Missing")[rank_list == ""]
 
# Main Function
if __name__ == "__main__":
    keyword = "dsa practice questions"
    website = "https://www.geeksforgeeks.org"
    search_query = 30
    rank = find_rank(keyword, website, search_query)
     
    if rank == "Website Missing":
        print(rank)
    else:
        print("Rank of Website :", rank[:-1])


输出: