【发布时间】:2013-10-21 13:39:21
【问题描述】:
我需要抓取一些网站。问题是——我错了吗? - 大多数爬虫只浏览网站中的链接,但不爬取动态链接。换句话说,从数据库生成的页面(即 URL 包含带有“?”的查询)将不会被抓取。
您知道可以执行此工作的爬虫吗?我在这里搜索过,只找到了关于抓取 javascript 生成的内容的答案,这不是我想要的。
顺便说一句,我使用 Java。
【问题讨论】:
标签: java web-crawler
我需要抓取一些网站。问题是——我错了吗? - 大多数爬虫只浏览网站中的链接,但不爬取动态链接。换句话说,从数据库生成的页面(即 URL 包含带有“?”的查询)将不会被抓取。
您知道可以执行此工作的爬虫吗?我在这里搜索过,只找到了关于抓取 javascript 生成的内容的答案,这不是我想要的。
顺便说一句,我使用 Java。
【问题讨论】:
标签: java web-crawler
当然可以抓取动态生成的 URL。据谷歌称,他们能够扫描动态网址,所以技术肯定有:http://googlewebmastercentral.blogspot.co.uk/2008/09/dynamic-urls-vs-static-urls.html
您可以通过对动态 url 进行 wget 轻松验证这一点,即http://mysite.com/?page=2
但是,当您的爬虫必须处理 sessionID 和 cookie 以及在鼠标悬停时显示内容或其他动态功能的页面时,复杂性就会增加。我可以想象像 gmail 或 facebook 这样的网站更难抓取,然后比如说 wikipedia。
本质上,如果你可以通过wget将页面下载到硬盘,也可以使用Java将页面保存为文本文件,然后解析其中的字符串内容。
看看 crawler4j,作为一个很好的起点。如果太复杂,写自己的java代码来做。
import java.net.*;
import java.io.*;
public class URLReader {
public static void main(String[] args) throws Exception {
URL oracle = new URL("http://www.oracle.com/");
BufferedReader in = new BufferedReader(
new InputStreamReader(oracle.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
来自:http://docs.oracle.com/javase/tutorial/networking/urls/readingURL.html
然后可以使用 java 的字符串操作方法解析该页面(我倾向于更快地找到 wget/sed/awk/perl)。
【讨论】:
我认为您误解了动态生成的含义。在服务器端生成的任何内容在爬虫看到它时都不是动态的。带有? 的 URL 并不特殊。您使用的爬虫软件可能会忽略指向包含问号的 URL 的链接,但这可能只是为了避免无限地爬取页面。风险在于任何动态生成的内容可能没有有限数量的页面。当然,许多 Web 开发框架在生成内容服务器端时根本不使用查询参数。此内容将是动态的,但对任何爬虫都是透明的。同样,您仍然会遇到可能抓取无限组动态生成页面的问题,但没有简单的方法可以检测您正在抓取无限站点。确定是否应继续从动态生成的网站上的一组页面中抓取链接实际上等同于halting problem。
现在您明确表示您对抓取 Javascript 不感兴趣,但就客户端而言,Javascript 确实是获取动态内容的唯一途径.
【讨论】: