用于抓取网站的 BeautifulSoup 代码入门

我的工作涉及大量抓取。实际上,我创建了一个入门代码,用于我每个抓取项目。它帮助我记住如何使用最常用的函数,并确保我已将所需的所有内容导入 Python 笔记本中。我意识到这对其他人可能有用,所以我最终决定与大家分享。

现在,我意识到如果我只是分享我的入门套件,那么这篇文章会很短,所以我决定在单独的部分中添加一些关于如何在页面中查询特定内容的提示。我发现自己在每个抓取项目中都一遍又一遍地做一些事情,因为我确信我并不孤单,所以我认为与大家分享我的方法会很有趣。所以,一旦你检索到我的入门代码,请随意浏览帖子的其余部分 :)。谢谢!

要求
您显然需要安装 BeautifulSoup。

pip install beautifulsoup4

我最喜欢的库之一是“slugify”。它允许您将字符串“slugify”为计算机可以理解的内容。我的意思是,如果您有一个像“Book #1: Chapter 6”这样的字符串,则对此字符串进行 slugify 将输出“book-1-chapter-6”。这是一个非常有用的库,我经常使用它来根据标题创建文件名,但它可以用于许多其他事情。

为了安装这个库,只需将以下代码粘贴到您的终端或命令 shell 中:

pip install python-slugify

使用 Python 进行抓取:入门代码
不用多说,下面是我在每个项目开始时使用的代码:

import requests
import json
from urllib.parse import urlparse
from bs4 import BeautifulSoup

from slugify import slugify
# slugify("cra#5y ST*&^%ING") will output "cra-5y-st-ing" which is computer friendly.

# List of User Agents: https://developers.whatismybrowser.com/useragents/explore/
user_agent = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'}

first_url = "https://google.com"

request = requests.get(first_url, headers=user_agent)
content = request.content
soup = BeautifulSoup(content, 'lxml')

soup.find_all("write_html_tag_here", attrs={"attribute" : "attribute_value"})

我们来总结一下这里每组线的用途。

第 1-4 行是许多人在其抓取项目中使用的常规库导入。

第 6-7 行是关于我在要求部分提到的额外 slugify 库。第 6 行是如何使用这个库的具体示例。

第 9-10 行是关于我在抓取时使用的用户代理。第 8 行是一个网站链接,该网站列出了所有用户代理,当用户通过请求库查询内容时,可以使用这些用户代理来模拟任何设备。

第 14-16 行是经典的请求到汤代码组合。您只需在第 11 行指定您感兴趣的第一个 URL。

最后,第 18 行是如何获取包含特定属性的特定 HTML 标签列表的示例。

基本上,所有这些行都是我容易忘记格式的东西,因此通过使用这个启动代码,我能够立即启动并运行一个新的抓取项目。

如何使用 Python 和 BeautifulSoup 获取每个链接的 Href 值
我发现自己经常做的一件事就是获取网页所有内部和外部链接的列表。为此,我使用的代码如下:

list_href = []

for every in soup.find_all("a"):
    
    list_href.append(every["href"])
    
print(list_href)

轰隆隆,超级简单。

如何使用 Python 从 URL 中提取域名
此函数非常简单,但经常与上面使用的代码一起使用。提取每个链接的 href 值会使您的列表仅返回 URL 的末尾部分,而不附加其域名,因此我经常使用这个自定义函数从 URL 中提取域名,然后将其附加到提取的 href 值中:

def findDomainFromUrl(url):
    
    parsed_uri = urlparse(url)
    result = '{uri.scheme}://{uri.netloc}'.format(uri=parsed_uri)
    
    return result

结论​
如果您在只输入了几个“提示”后就看到此信息,则说明我最近才发布这篇文章,并且认为我宁愿发布包含少量信息的文章,也不愿完全不发布。我正在清理一些最常用的抓取功能,以便在此处发布它们。

无论如何,我希望您发现这篇文章很有用,并且这个启动代码将帮助您更有效地启动未来的抓取项目。