【Deepseek】写一个“抓取特定网站中所有的URL”的脚本

因工作需要,需要抓取网站中的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)

### 改进说明:

  1. 递归抓取:新增了一个递归函数crawl_urls,它会递归地访问每个抓取到的URL,直到达到设定的最大深度。
  2. 最大深度控制:通过max_depth参数控制抓取的层级深度,防止无限递归。默认设置为3层,可以根据需要调整。
  3. 避免重复抓取:使用visited集合记录已经抓取过的URL,避免重复抓取。
  4. 过滤站外链接:通过正则表达式过滤掉站外链接,只抓取目标网站的URL。你可以根据目标网站的域名调整正则表达式。
  5. 请求头设置:添加了请求头,模拟浏览器访问,降低被反爬机制拦截的可能性。
  6. 错误处理:增加了请求异常处理,确保脚本在遇到错误时能够继续抓取其他链接。

使用说明:

  1. 确保安装了所需的库:

    pip install requests beautifulsoup4
  2. 运行脚本:

    python3 crawl_urls.py
  3. 输入目标网站的URL,脚本会递归抓取所有层级的URL,并保存到urls.txt文件中。

示例运行:

bash
root@iZ7xv9z9xq78iqy1bo:/www/wwwroot/python# python3 crawl_urls.py
请输入目标网站的URL:https://example.com

脚本会递归抓取多级目录下的所有URL,并保存到urls.txt文件中。


注意事项:

  1. 反爬机制:目标网站可能有反爬机制,建议:

    • 设置请求间隔:在递归抓取时,可以添加time.sleep(1)延迟请求。
    • 使用代理IP:如果需要,可以配置代理IP。
  2. 抓取深度:根据目标网站的结构,合理设置max_depth,避免抓取过多页面。
  3. 过滤规则:根据目标网站的特点,调整过滤规则,避免抓取不需要的链接。
  4. 性能优化:如果目标网站页面较多,可以考虑使用多线程或异步请求来提高抓取效率。
瑞恩
“ 杂七杂八的东西,汇总一下可能会好一点呢~ ”
 喜欢文章
1人喜欢
头像