📅  最后修改于: 2023-12-03 15:41:57.952000             🧑  作者: Mango
本文介绍的是一种Python程序,它可以递归地抓取一个网站中的所有URL。这个程序在实际开发中非常有用,特别是当你需要抓取一个网站中的大量URL时。
这个Python程序的实现,主要分为两个部分:
在实现中,主要的代码是基于Python的 requests 和 BeautifulSoup 模块实现的。
import requests
from bs4 import BeautifulSoup
def get_links(url):
# 使用 requests 模块获取网页内容
response = requests.get(url)
# 使用 BeautifulSoup 模块解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')
# 获取所有 'a' 标签的链接
links = soup.find_all('a')
# 从所有链接中提取出 href 属性
urls = []
for link in links:
url = link.get('href')
if url:
urls.append(url)
# 返回提取出的链接列表
return urls
在上面的代码中,使用 requests
模块获取网页内容,使用 BeautifulSoup
模块解析网页内容,然后从所有链接中提取出 href
属性。最后将提取出的链接列表返回。
def recursive_crawl(url, visited=set()):
# 检查 url 是否已经被访问过
if url in visited:
return
# 将 url 添加到已访问集合中
visited.add(url)
# 获取当前页面中的所有链接
links = get_links(url)
# 对获取到的所有链接进行递归检查
for link in links:
# 检查 link 是否为相对路径
if link.startswith('/'):
link = url + link
elif not link.startswith('http'):
link = url + '/' + link
# 递归处理链接
recursive_crawl(link, visited)
在上面的代码中,使用变量 visited
来记录已经被访问过的链接集合,当访问一个链接时,首先检查该链接是否已经被访问过,如果已经被访问过,则直接返回;否则,将该链接加入已访问集合中。
接下来获取当前页面中的所有链接,对所有链接进行递归处理。
在处理链接时,首先检查是否为相对路径,如果是相对路径,则将其转为绝对路径。如果不是,则将其作为新的链接进行处理。
import requests
from bs4 import BeautifulSoup
def get_links(url):
# 使用 requests 模块获取网页内容
response = requests.get(url)
# 使用 BeautifulSoup 模块解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')
# 获取所有 'a' 标签的链接
links = soup.find_all('a')
# 从所有链接中提取出 href 属性
urls = []
for link in links:
url = link.get('href')
if url:
urls.append(url)
# 返回提取出的链接列表
return urls
def recursive_crawl(url, visited=set()):
# 检查 url 是否已经被访问过
if url in visited:
return
# 将 url 添加到已访问集合中
visited.add(url)
# 获取当前页面中的所有链接
links = get_links(url)
# 对获取到的所有链接进行递归检查
for link in links:
# 检查 link 是否为相对路径
if link.startswith('/'):
link = url + link
elif not link.startswith('http'):
link = url + '/' + link
# 递归处理链接
recursive_crawl(link, visited)
# 使用示例
if __name__ == '__main__':
recursive_crawl('https://www.baidu.com/')
本文介绍了一种使用 Python 程序递归抓取一个网站中的所有链接的实现思路和具体代码步骤。对于需要大量抓取URL的情况,使用此方法可以帮助我们快速的从网站中提取出所需要的链接。