如何用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
相关产品推荐
相关产品推荐

