【问题标题】:How to get Content-Length or CRC in header of a web page?如何在网页标题中获取 Content-Length 或 CRC?
【发布时间】:2013-01-07 07:28:33
【问题描述】:

我为特定的动态网站编写了一个爬虫。所有抓取作业都需要 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 代码。这将是完美的。但我想这是很长的路要走。

【问题讨论】:

    标签: php apache http http-headers


    【解决方案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 的 tutorial

    【讨论】:

    • 我会检查这些,但我已经编写了爬虫。如果这些都可以控制页面是否更改,则意味着我也可以。如果没有办法检查这个;我的脚本将显示出比这些更好的性能。
    • 如果你刚刚写了一个爬虫。我可以确保它不会比 Nutch 表现更好。
    • 顺便说一句,如果你只是想抓取,爬虫不是你想要的。
    • 这是给你的结果。 52页49.8682秒,解析和mysql插入816次。该网站的平均响应时间很慢(0.9 秒)。
    • 你的答案并不相关。
    【解决方案2】:

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

    这就是为什么header不返回Content-Length,带有这个参数的页面返回content-length。

    【讨论】:

    • 这对thereAreChanges() 的实施有何帮助?
    • 因为我们无法到达 crc。如果内容长度发生变化,我决定每天运行脚本。并在任何情况下每周运行脚本。如果某些字符串更改并且内容长度没有更改,我的脚本在每周运行之前不会被注意到。这将大大降低 cpu-bw 的使用率。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2017-05-07
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多