You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python结合BeautifulSoup获取指定关键词相关的全部互联网URL?

嘿,这个需求我之前折腾过好几次,用BeautifulSoup搭配请求库完全能实现!不过先提醒一句,爬取网页一定要遵守目标网站的规则,别乱爬哦~下面给你一步步拆解实现方法:

核心思路

其实就是三步走:先请求网页获取内容 → 用BeautifulSoup解析出所有链接 → 筛选出和关键词相关的URL;如果要扩大范围,还可以顺着链接递归爬取更多页面。

具体实现步骤

1. 先装必要的工具

首先得安装两个库,requests用来发HTTP请求,beautifulsoup4用来解析HTML:

pip install requests beautifulsoup4

2. 单页面爬取示例(基础版)

先写个简单的函数,爬取单个页面里含关键词的URL,还会处理相对链接转为绝对链接:

import requests
from bs4 import BeautifulSoup

def get_relevant_urls(base_url, keyword):
    # 加个请求头,模拟浏览器访问,避免被直接拦截
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }
    try:
        # 发送请求,设置超时时间
        response = requests.get(base_url, headers=headers, timeout=10)
        response.raise_for_status()  # 检查请求是否成功,失败就抛出异常
        
        # 用BeautifulSoup解析HTML
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 提取所有带href属性的a标签
        all_links = soup.find_all('a', href=True)
        relevant_urls = []
        
        for link in all_links:
            url = link['href']
            # 把相对链接转成绝对链接,不然没法直接访问
            if not url.startswith(('http://', 'https://')):
                url = requests.compat.urljoin(base_url, url)
            # 检查URL里是否包含关键词(大小写不敏感)
            if keyword.lower() in url.lower():
                relevant_urls.append(url)
        
        # 去重,避免重复的URL
        return list(set(relevant_urls))
    except Exception as e:
        print(f"爬取{base_url}时出错:{str(e)}")
        return []

# 调用示例,替换成你要的关键词和起始页面
target_keyword = "python爬虫"
start_url = "https://example.com"  # 这里换你要爬的起始网站
result_urls = get_relevant_urls(start_url, target_keyword)

print(f"找到{len(result_urls)}个相关URL:")
for url in result_urls:
    print(url)

3. 递归爬取(进阶版,获取更多URL)

如果想顺着找到的链接继续爬,获取更多相关URL,可以加个递归逻辑,同时记录已爬过的URL避免重复:

import time

# 用来记录已经爬过的URL,防止重复爬取和循环
visited_urls = set()

def crawl_relevant_urls(current_url, keyword):
    # 如果已经爬过这个URL,直接返回空列表
    if current_url in visited_urls:
        return []
    visited_urls.add(current_url)
    print(f"正在爬取:{current_url}")
    
    # 获取当前页面的相关URL
    current_relevant = get_relevant_urls(current_url, keyword)
    
    # 递归爬取每个相关URL
    for url in current_relevant:
        # 加个延迟,别给服务器太大压力,也防反爬
        time.sleep(1)
        current_relevant.extend(crawl_relevant_urls(url, keyword))
    
    # 再次去重
    return list(set(current_relevant))

# 调用进阶版函数
all_relevant_urls = crawl_relevant_urls(start_url, target_keyword)
print(f"\n总共找到{len(all_relevant_urls)}个相关URL:")
for url in all_relevant_urls:
    print(url)
重要注意事项
  • 遵守网站规则:先看目标网站的robots.txt(比如https://example.com/robots.txt),里面会说明哪些页面允许爬,千万别爬禁止的内容,不然可能被封IP。
  • 控制请求频率:一定要加延迟(比如time.sleep(1)),短时间内大量请求很容易被反爬机制拦截。
  • 处理动态内容:如果页面是JavaScript动态加载的,BeautifulSoup拿不到动态生成的链接,这时候得用selenium或者playwright来模拟浏览器渲染页面。
  • 灵活调整关键词匹配:上面的示例是检查URL里的关键词,你也可以改成爬取页面内容,检查页面正文是否包含关键词,这样筛选更准确,但会增加爬取量。
  • 完善异常处理:网络波动、页面404、500这些情况都要处理,避免程序直接崩溃。

内容的提问来源于stack exchange,提问作者zeroFighter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:08:14