【问题标题】:How to skip links containing file extensions while web scraping using PHP如何在使用 PHP 抓取网页时跳过包含文件扩展名的链接
【发布时间】:2012-01-01 16:46:11
【问题描述】:

这是一个验证 .edu TLD 并检查 url 是否指向 .pdf 文档或 .doc 文档的函数。

public function validateEduDomain($url) {
    if( preg_match('/^https?:\/\/[A-Za-z]+[A-Za-z0-9\.-]+\.edu/i', $url) && !preg_match('/\.(pdf)|(doc)$/i', $url) )  {
        return TRUE;
    }
    return FALSE;

现在我遇到了指向 jpg、rtf 和 simple_html_dom 尝试解析并返回其内容的其他链接。我想通过跳过所有此类链接来避免这种情况发生。问题是该列表并非详尽无遗,我希望代码跳过所有此类链接。我该怎么做?

【问题讨论】:

  • .htm, .html, .php 和更多的文件扩展名是你会遇到的你会想要抓取的文件扩展名,所以我不认为阻止所有带有扩展名的文件是一个好主意。
  • 你是对的。但正如您所提到的,该函数应该有一些例外。
  • 是的,但是,就像您无法列出要跳过的扩展的详尽列表一样,您也无法列出要检查的扩展列表。我什至看到过在所有 URL 末尾使用自定义扩展名的网站(例如,实际上是我的大学)。

标签: php mysql web-scraping web-crawler


【解决方案1】:

通过猜测其背后的内容来过滤 url 在许多情况下总是会失败。假设您使用 curl 下载,您应该检查响应文档类型的标题是否在可接受的范围内:

<?php

require "simple_html_dom.php";

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //default is to output it

$urls = array(
  "google.com", 
  "https://www.google.com/logos/2012/newyearsday-2012-hp.jpg", 
  "http://cran.r-project.org/doc/manuals/R-intro.pdf",
);
$acceptable_types = array("text/html", "application/xhtml+xml");

foreach ($urls as $url) {
  curl_setopt($curl, CURLOPT_URL, $url);
  $contents = curl_exec($curl);

  //we need to handle content-types like "text/html; charset=utf-8"
  list($response_type) = explode(";", curl_getinfo($curl, CURLINFO_CONTENT_TYPE));

  if (in_array($response_type, $acceptable_types)) {
    echo "accepting {$url}\n";
    // create a simple_html_dom object from string
    $obj = str_get_html($contents);
  } else {
    echo "rejecting {$url} ({$response_type})\n";
  }
}

运行上述结果:

accepting google.com
rejecting https://www.google.com/logos/2012/newyearsday-2012-hp.jpg (image/jpeg)
rejecting http://cran.r-project.org/doc/manuals/R-intro.pdf (application/pdf)

【讨论】:

  • 是的,这样可接受的标题也可能被列入短名单。 +1
  • 我没有使用 curl 来完成这项任务。我正在使用 Simple_html_dom 来完成这项工作。请更新您的答案以适应这种情况。
  • @Spoilt,我认为你应该使用 curl 进行抓取。它的性能效率更高
  • 用简单的html dom写完整个代码,现在转curl是不可能的。
  • 你可能想看看这个问题:stackoverflow.com/questions/1566028/…
【解决方案2】:

将最后一个正则表达式更新为如下内容:

!preg_match('/\.(pdf)|(doc)|(jpg)|(rtf)$/i', $url) )

将过滤掉 jpgs 和 rtf 文件。

您必须在上面的正则表达式中添加扩展名才能省略它们。

更新

我不认为它可以阻止所有类型的扩展,我个人也不推荐它来抓取使用。您将不得不跳过一些扩展程序才能继续爬行。为什么不将您的正则表达式过滤器更改为您想要接受的过滤器:

preg_match('/\.(html)|(html)|(php)|(aspx)$/i', $url) )

【讨论】:

  • 这很明显,问题是询问替代方案。我知道我可以做到这一点,但我不想这样。由于 www 上的文件格式并非详尽无遗,因此我想避免所有这些格式。问题是我该怎么做??
  • @Spoilt,我不明白你所说的file formats on www 是什么意思,还有non-exhaustive 是什么意思?
  • 我想我是来回答的,但要学习一些东西:)
  • 请考虑一下:stanford.edu/UG.pdf stanford.edu/UG.doc 所有这些链接都指向一些文档。不详尽,我的意思是扩展名可以是任何东西,例如 .zip、.7z、.jpg、.bmp、......
  • 关于您的更新:您不认为这会导致所有此类链接逃逸:示例:stanford.edu 没有此类扩展名,但它是一个有效的链接被抓取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 2021-04-07
相关资源
最近更新 更多