You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用WGET实现兼具蜘蛛式爬取与页面href链接提取的功能?

如何使用WGET实现兼具蜘蛛式爬取与页面href链接提取的功能?

我太懂这种“两个工具各占一半功能”的纠结了!你手里的两个wget命令一个能递归爬站,一个能抓页面里的href,但就是没法合在一起用——别急,咱们可以把它们组合起来,完美实现你要的效果。

先理清楚你现有命令的问题:

  • 第一个命令用了--spider模式,能递归爬5层网站,但它输出的只是wget爬虫“访问过”的URL,不是页面里所有的href链接;
  • 第二个命令能精准提取单页里的http/https/ftp href,但只能处理单个页面,没法递归爬取整个站点。

那咱们的思路就是:先用wget的蜘蛛模式把整个站点要爬的页面URL都列出来,再逐个对这些页面运行href提取命令,最后把结果汇总。

具体步骤:

  1. 第一步:获取全站爬取的URL列表
    先用你第一个命令的逻辑,把所有蜘蛛爬取到的页面URL存到一个临时文件里:

    wget --spider --force-html -r -l5 http://example.com 2>&1 | grep '^--' | awk '{print $3}' > all_crawled_pages.txt
    

    这一步会帮你把example.com下5层以内的所有可爬页面URL都列出来。

  2. 第二步:批量提取每个页面的href链接
    接下来遍历刚才生成的URL列表,对每个页面用你第二个命令的提取逻辑,把所有href追加到目标文件里:

    # 先清空目标文件,避免旧内容干扰
    > urls.txt
    
    while read page_url; do
      wget -q "$page_url" -O - | \
      tr "\t\r\n'" '   "' | \
      grep -i -o '<a[^>]\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \
      sed -e 's/^.*"\([^"]\+\)".*$/\1/g' >> urls.txt
    done < all_crawled_pages.txt
    
  3. 可选:去重处理
    不同页面可能会重复出现同一个href链接,如果你需要唯一的URL列表,可以加一步去重:

    sort -u urls.txt > unique_urls.txt
    

这样操作下来,你既实现了蜘蛛式的递归爬取,又能把每个页面里的href链接都提取出来,完全用wget就能搞定!

备注:内容来源于stack exchange,提问作者tombraider123

火山引擎 最新活动