如何爬取URL不变的网站内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何爬取URL不变的网站内容相关的知识,希望对你有一定的参考价值。
步骤如下:1、下载数据采集工具 2、输入你要采集的网址,等它自动识别,然后点击启动,然后等采集完,免费导出结果 3、如果搞不定,看一下官网视频手把手讲解视频(免费的),预计花费几十分钟 4、重复步骤2,遇到问题稍作手动修改 参考技术A 传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列爬取网站并仅返回 URL
【中文标题】爬取网站并仅返回 URL【英文标题】:Spider a Website and Return URLs Only 【发布时间】:2011-02-17 18:26:30 【问题描述】:我正在寻找一种伪蜘蛛网站的方法。关键是我实际上并不想要内容,而是一个简单的 URI 列表。我可以通过Wget 使用--spider
选项相当接近这个想法,但是当通过grep
管道输出时,我似乎找不到合适的魔法来让它发挥作用:
wget --spider --force-html -r -l1 http://somesite.com | grep 'Saving to:'
grep
过滤器似乎对wget
输出完全没有影响。我有什么问题吗,或者我应该尝试其他更适合提供这种有限结果集的工具吗?
更新
所以我刚刚离线发现,默认情况下,wget
会写入 stderr。我在手册页中错过了它(事实上,如果它在那里,我仍然没有找到它)。一旦我将返回值通过管道传输到标准输出,我就更接近于我需要的东西了:
wget --spider --force-html -r -l1 http://somesite.com 2>&1 | grep 'Saving to:'
如果有的话,我仍然会对做这种事情的其他/更好的方法感兴趣。
【问题讨论】:
查看此问题/答案以了解使用 python 脚本的另一种方式:***.com/questions/9561020/… Get a list of URLs from a site的可能重复 【参考方案1】:我想要做的绝对最后的事情是自己下载并解析所有内容(即创建我自己的蜘蛛)。一旦我了解到 Wget 默认写入 stderr,我就能够将其重定向到 stdout 并适当地过滤输出。
wget --spider --force-html -r -l2 $url 2>&1 \
| grep '^--' | awk ' print $3 ' \
| grep -v '\.\(css\|js\|png\|gif\|jpg\)$' \
> urls.m3u
这给了我一个被爬取的内容资源(不是图像、CSS 或 JS 源文件的资源)URI 的列表。从那里,我可以将 URI 发送给第三方工具进行处理以满足我的需求。
输出仍然需要稍微精简(它会产生如上所示的重复),但它几乎就在那里,我不必自己进行任何解析。
【讨论】:
wget -r --spider -l1 -A mp3 http://example.com/page-with-mp3s 2>&1 | grep -Eio http.+mp3
对我来说是一张很好的魔术票。谢谢!
我通常将该输出传递给 sort | uniq
以删除重复项,仅供参考。
我知道这个答案已经过去了 5 年,但你能加快这个过程吗?有 200 个网址的网站需要几秒钟甚至几分钟的时间
如果将第一个grep
和awk
命令替换为单个egrep -o 'https?://[^ ]+'
,则可以大大缩短此时间。我也推荐使用管道到sort | uniq
,因为这样可以减少第三方工具在重复 URL 上的工作。【参考方案2】:
创建一些正则表达式以从所有地址中提取地址
<a href="(ADDRESS_IS_HERE)">.
这是我将使用的解决方案:
wget -q http://example.com -O - | \
tr "\t\r\n'" ' "' | \
grep -i -o '<a[^>]\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \
sed -e 's/^.*"\([^"]\+\)".*$/\1/g'
这将输出网页中的所有 http、https、ftp 和 ftps 链接。它不会给你相对的网址,只有完整的网址。
关于一系列管道命令中使用的选项的说明:
wget -q 使它没有过多的输出(安静模式)。 wget -O - 使下载的文件回显到标准输出,而不是保存到磁盘。
tr 是 unix 字符转换器,在此示例中用于将换行符和制表符转换为空格,以及将单引号转换为双引号,以便我们可以简化正则表达式。
grep -i 使搜索不区分大小写 grep -o 让它只输出匹配的部分。
sed 是流编辑器 unix 实用程序,它允许过滤和转换操作。
sed -e 只是让你给它一个表达式。
在“http://craigslist.org”上运行这个小脚本会产生相当长的链接列表:
http://blog.craigslist.org/
http://24hoursoncraigslist.com/subs/nowplaying.html
http://craigslistfoundation.org/
http://atlanta.craigslist.org/
http://austin.craigslist.org/
http://boston.craigslist.org/
http://chicago.craigslist.org/
http://cleveland.craigslist.org/
...
【讨论】:
非常酷。但是这些工具的 Win32 版本令人窒息……某处。您能说一下如何为 Cygwin 或直接 Windows 修改它们吗? @Snowy 我不确定你所说的“窒息”是什么意思。 Cygwin 应该可以正常工作。您也可以尝试使用curl
而不是wget
。
我想指出,@Rob 想要从网站而不是网页中获取所有 url。
好吧,没关系,我将 grep 命令更改为:grep -i -o '<a[^>]\+href[ ]*=[ \t]*"[^"]\+">[^<]*</a>'
并删除了sed
,它似乎可以完成这项工作。现在我只需要以某种方式解析这些A
标签。【参考方案3】:
我用过一个叫xidel的工具
xidel http://server -e '//a/@href' |
grep -v "http" |
sort -u |
xargs -L1 -I xidel http://server/ -e '//a/@href' |
grep -v "http" | sort -u
有点骇人听闻,但让你更接近!这只是第一级。想象一下把它打包成一个自递归脚本!
【讨论】:
谢谢 ... 这看起来非常适合编写解决我的 wget 问题的脚本 (opendata.stackexchange.com/q/4851/263)以上是关于如何爬取URL不变的网站内容的主要内容,如果未能解决你的问题,请参考以下文章