【问题标题】:Crawling for only the title of a page仅抓取页面标题
【发布时间】:2012-05-05 19:18:16
【问题描述】:

我一直在网上四处寻找,希望这是可能的,我基本上只需要获取网页的标题而不需要其他任何东西。

网络爬虫可能需要很长时间才能执行任务,因为他们必须在检查页面之前加载页面,这对于我想要实现的目标来说效率很低......这是我目前所拥有的

php 代码

$url = 'http://www.ebay.com/itm/300702997750#ht_500wt_1156';
$str = file_get_contents($url);
$title = ''; 

if(strlen($str)>0){
   preg_match("/\<title\>(.*)\<\/title\>/",$str,$titleArr);
   $title = $titleArr[1];
}

我想知道是否可以只抓取页面的一部分(例如页面的前 2000 个字符)。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 这主要是个坏消息。但是,您可以使用“curl_multi”同时运行多个连接,并在任何时候完成,解析它,然后从队列中获取一个新 URL 并开始下载。
  • 另外,你不应该获取第一次出现的“title”($titleArr 的索引 0)吗?您当前正在获取第二个索引(请记住,数组从 0 开始)。
  • 嗯,这仍然是个坏消息,运行多次爬网不会加快任何速度
  • 否,但它会使 10 页需要 5 秒,而不是 50 秒。可能有一种方法可以在下载达到一定大小后“取消”下载,但是,大部分下载时间只是在等待 - 实际上传输它需要很少的时间,但等待它开始进入需要一秒钟左右。
  • hmmm 代码运行良好,index[1] 包含标题

标签: php web-crawler


【解决方案1】:

您可以使用 substr 来获取前 1000 个字符,或者,您可以使用

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/');
curl_setopt($ch, CURLOPT_RANGE, '0-500');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
echo $result;

只会下载前 500 个字节。你可以通过运行类似这样极其丑陋的垃圾代码来替代它:

$url = 'http://www.example.com/';
$range = array();
$repeats = 10;

function average($a){
  return array_sum($a)/count($a) ;
}

for ($i=0;$i<$repeats;$i++) {
    $time_start = microtime(true);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RANGE, '0-500');
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);

    $time_end = microtime(true);
    $time = $time_end - $time_start;
    curl_close($ch);
    $range[] = $time;
}
echo "With range: average = ".round(average($range),2)." seconds (Min: ".round(min($range),2).", Max: ".round(max($range),2).")\n";

$range = array();

for ($i=0;$i<$repeats;$i++) {
    $time_start = microtime(true);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);

    $time_end = microtime(true);
    $time = $time_end - $time_start;
    curl_close($ch);
    $range[] = $time;
}
echo "Without range: average = ".round(average($range),2)." seconds (Min: ".round(min($range),2).", Max: ".round(max($range),2).")\n";

如果我在我的网站 (http://www.focalstrategy.com/) 上运行它,我会得到:

With range: average = 0.38 seconds (Min: 0.35, Max: 0.41)
Without range: average = 0.56 seconds (Min: 0.53, Max: 0.7)

反对http://en.wikipedia.org/wiki/PHP,我得到:

With range: average = 0.11 seconds (Min: 0.05, Max: 0.5)
Without range: average = 0.48 seconds (Min: 0.34, Max: 0.78)

反对Stack Overflow我得到:

With range: average = 1.31 seconds (Min: 1.1, Max: 1.46)
Without range: average = 1.37 seconds (Min: 1.18, Max: 1.7)

反对eBay 我明白了:

With range: average = 1.75 seconds (Min: 1.56, Max: 1.99)
Without range: average = 1.74 seconds (Min: 1.51, Max: 2.14)

您可以通过测试看到 SO 和 eBay 不支持范围请求。

总而言之,支持此功能的网站将获得提速,不支持此功能的网站不会,您只会获得整个代码。

【讨论】:

  • 在不加载整个页面的情况下可以这样做吗?
  • 我会试一试,但我需要先安装 curl
  • 你会发现安装它很有用,我写的几乎每个项目都在某个地方使用过它!
  • 好吧,我浪费了很多时间试图让 curl 工作,结果我只需要取消注释 php.ini 中的一行。但我已经对此进行了测试并稍微使用了 CURLOPT_RANGE 范围,但我看不到性能提升。你确定没有遗漏什么吗?
  • 这在我测试时工作正常。老实说,除非您拥有一个非常大的网站,否则它不会节省太多时间。它确实要求服务器支持范围请求。我的有,但似乎 Stackoverflow 没有,所以你的里程可能会有所不同。在我的网站上,全部下载需要 0.5 秒,下载前 500 个字节需要 0.3 秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2018-05-10
  • 2020-08-28
  • 1970-01-01
  • 2021-11-02
相关资源
最近更新 更多