如何爬取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 个网址的网站需要几秒钟甚至几分钟的时间 如果将第一个grepawk 命令替换为单个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 '&lt;a[^&gt;]\+href[ ]*=[ \t]*"[^"]\+"&gt;[^&lt;]*&lt;/a&gt;' 并删除了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不变的网站内容的主要内容,如果未能解决你的问题,请参考以下文章

爬虫遇到各种不同url怎么爬取

如何利用python爬取某个地方1年的天气

怎么用python爬取一个网站的网页数量

urllib基础-利用网站结构爬取网页-百度搜索

爬取中国大学排名网站内容

爬取中国大学排名网站内容