因工作需要,需要抓取网站中的URL,类似爬虫但不需要爬到具体内容,只需要URL即可,特此让Deepseek 32B来实现一下,效果还不错。
🧑💻 User
我想针对某个网站下的所有URL,都自动下载并保存为txt文件。
🤖 Assistant
明白了!你可以使用Python编写脚本来实现这个需求。脚本用于抓取目标网站的所有URL并保存到txt文件中。
以下是示例的实现思路:
抓取URL并保存到txt文件
这个脚本会抓取目标网站的所有URL,并将它们保存到一个txt文件中。
改进后的 crawl_urls.py
(支持深层抓取):
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import re
import os
# 设置请求头,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
def crawl_urls(base_url, output_file, max_depth=3, visited=None):
if visited is None:
visited = set()
# 发送HTTP请求获取网页内容
try:
response = requests.get(base_url, headers=headers, timeout=10)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"请求失败:{base_url},原因:{e}")
return
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 提取所有URL
urls = set()
for link in soup.find_all('a', href=True):
href = link['href']
absolute_url = urljoin(base_url, href)
# 过滤掉站外链接(根据需要调整)
if re.match(r'^https://www.alibabacloud.com', absolute_url):
urls.add(absolute_url)
# 将新抓取的URL写入文件
with open(output_file, 'a') as f:
for url in urls:
if url not in visited:
f.write(url + '\n')
visited.add(url)
print(f"成功抓取并保存{len(urls)}个URL到{output_file}")
# 递归抓取子页面(控制深度)
if max_depth > 0:
for url in urls:
crawl_urls(url, output_file, max_depth - 1, visited)
if __name__ == "__main__":
target_url = input("请输入目标网站的URL:")
output_file = "urls.txt"
# 清空或创建新的URL文件
open(output_file, 'w').close()
crawl_urls(target_url, output_file, max_depth=3)
### 改进说明:
- 递归抓取:新增了一个递归函数
crawl_urls
,它会递归地访问每个抓取到的URL,直到达到设定的最大深度。 - 最大深度控制:通过
max_depth
参数控制抓取的层级深度,防止无限递归。默认设置为3层,可以根据需要调整。 - 避免重复抓取:使用
visited
集合记录已经抓取过的URL,避免重复抓取。 - 过滤站外链接:通过正则表达式过滤掉站外链接,只抓取目标网站的URL。你可以根据目标网站的域名调整正则表达式。
- 请求头设置:添加了请求头,模拟浏览器访问,降低被反爬机制拦截的可能性。
- 错误处理:增加了请求异常处理,确保脚本在遇到错误时能够继续抓取其他链接。
使用说明:
确保安装了所需的库:
pip install requests beautifulsoup4
运行脚本:
python3 crawl_urls.py
- 输入目标网站的URL,脚本会递归抓取所有层级的URL,并保存到
urls.txt
文件中。
示例运行:
bash
root@iZ7xv9z9xq78iqy1bo:/www/wwwroot/python# python3 crawl_urls.py
请输入目标网站的URL:https://example.com
脚本会递归抓取多级目录下的所有URL,并保存到urls.txt
文件中。
注意事项:
反爬机制:目标网站可能有反爬机制,建议:
- 设置请求间隔:在递归抓取时,可以添加
time.sleep(1)
延迟请求。 - 使用代理IP:如果需要,可以配置代理IP。
- 设置请求间隔:在递归抓取时,可以添加
- 抓取深度:根据目标网站的结构,合理设置
max_depth
,避免抓取过多页面。 - 过滤规则:根据目标网站的特点,调整过滤规则,避免抓取不需要的链接。
- 性能优化:如果目标网站页面较多,可以考虑使用多线程或异步请求来提高抓取效率。