2

我为特定的动态网站编写了一个爬虫。所有抓取作业都需要 3 个小时以上。我想控制页面是否已经被爬取或者页面有一些变化。如果我能做到这一点,脚本将在很短的时间内完成。

例如:

    foreach ($urls as $url) {
        if(thereAreChanges($url)){
            crawl($url);
        }
    }

信息:网页不提供内容长度和CRC。

Array ( [0] => HTTP/1.1 200 OK 
        [Date] => Tue, 08 Jan 2013 07:47:03 GMT 
        [Server] => Apache 
        [Set-Cookie] => Array ( 
                [0] => PHPSESSID=eisb6qjme9b0ouoga9su9fgok4; path=/  
                [1] => j12011=a%3A3%3A%7Bs%3A3%3A%22sid%22%3Bs%3A26%3A%22eisb6qjme9b0ouoga9su9fgok4%22%3Bs%3A2%3A%22ip%22%3Bs%3A12%3A%2294.103.47.65%22%3Bs%3A4%3A%22time%22%3Bi%3A1357631223%3B%7D; expires=Sat, 09-Mar-2013 07:47:03 GMT; path=/  
        ) 
        [Expires] => Thu, 19 Nov 1981 08:52:00 GMT 
        [Cache-Control] => no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
        [Pragma] => no-cache 
        [Vary] => Accept-Encoding 
        [Connection] => close 
        [Content-Type] => text/html 
)

该站点提供 Content-Type 但不提供 Content-Length。我如何向 apache 询问内容长度。

更新:http ://urivalet.com/可以获得内容长度。我需要这个。

如果我可以在标题中获得页面的 CRC 代码。这将是完美的。但我想这是长远的目标。

4

2 回答 2

1

在函数thereAreChanges($url)中您可以执行以下操作,

  1. 发送请求If-modified-since时,将您上次访问页面的时间作为参数发送标头。304如果未修改,此标头将返回状态代码。
  2. 检查Last-Modified响应的标题并与您当前存储的页面的最后修改日期进行比较。如果内容较新,请获取它。
  3. 如果可能HEAD,请使用这些标头执行请求。GET会给你所有的内容。但HEAD只会返回标题。对于这样的查询,只需要标题。
  4. 4.

使用现有的爬虫和搜索引擎框架比编写一个更好。

使用 Apaches Nutch抓取网页,使用Solr搜索索引页面。Solr 提供了一个 HTTP 接口,您可以在其中运行 PHP 查询。为了获得更大的灵活性,您可以使用Lucene

这是有关如何设置 Nutch 和 Solr的教程。

于 2013-01-07T07:45:27.877 回答
0

解决方案是'header'=>"Accept-Encoding: gzip"

这就是为什么 header 不返回 Content-Length,使用此参数 page 返回 content-length。

于 2013-01-08T10:35:46.227 回答