如何使用WGET实现兼具蜘蛛式爬取与页面href链接提取的功能?
如何使用WGET实现兼具蜘蛛式爬取与页面href链接提取的功能?
我太懂这种“两个工具各占一半功能”的纠结了!你手里的两个wget命令一个能递归爬站,一个能抓页面里的href,但就是没法合在一起用——别急,咱们可以把它们组合起来,完美实现你要的效果。
先理清楚你现有命令的问题:
- 第一个命令用了
--spider模式,能递归爬5层网站,但它输出的只是wget爬虫“访问过”的URL,不是页面里所有的href链接; - 第二个命令能精准提取单页里的http/https/ftp href,但只能处理单个页面,没法递归爬取整个站点。
那咱们的思路就是:先用wget的蜘蛛模式把整个站点要爬的页面URL都列出来,再逐个对这些页面运行href提取命令,最后把结果汇总。
具体步骤:
第一步:获取全站爬取的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都列出来。
第二步:批量提取每个页面的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可选:去重处理
不同页面可能会重复出现同一个href链接,如果你需要唯一的URL列表,可以加一步去重:sort -u urls.txt > unique_urls.txt
这样操作下来,你既实现了蜘蛛式的递归爬取,又能把每个页面里的href链接都提取出来,完全用wget就能搞定!
备注:内容来源于stack exchange,提问作者tombraider123




