0

我拥有一个网上商店,我的一个供应商很友好地给了我一个包含产品型号、价格和标题的 CSV 文件,但他们不能给我包括他们的产品描述在内的数据库转储。不过,我可以抓取产品描述 - 问题是如何?

All URLs include the model number like "title-of-product-MN-504-1.htm"
The descriptions are inside a <div> tag like "<div id="description"> Bla bla bla <other tag>bla bla </other tag> bla bla </div>"

假设我在 csv 文件或 MySQL 表中拥有所有型号 - 如何将与型号关联的描述保存在 URL 中(如果这更容易,也位于另一个 div 标记中)?

总而言之 - 输入将是来自 csv 或 MySQL 表的型号,输出应该是 MySQL 表(或 csv),其中包含型号和各个页面上 div 标签的描述。我正在考虑以下工具,但我不确定如何将它们连接起来做我想做的事:wget、cURL 和PHP Simple HTML DOM Parser

4

3 回答 3

2

您可以使用此http://phpcrawl.cuab.de/并使用此特定属性:http://phpcrawl.cuab.de//classreferences/index.html,然后找到描述:在 php 中提取 html 标记之间的字符串

至于您在抓取页面上找到的 URL 中查找型号的要求,您可以使用以下属性:http://phpcrawl.cuab.de/classreferences/index.html

如果您要索引从他们那里获得的 CSV 文件并索引他们的网站;我会做以下

您建立一个列表,列出您需要获取描述的所有型号。

  1. 爬上他们的首页以开始这个过程。收集网址,添加到访问列表
  2. 访问列表中与型号匹配的每个 URL,获取描述,从列表中删除型号。收集网址,添加到访问列表
  3. 返回第 2 步 - 重复直到您的列表中没有更多型号

至于如何获取带有型号的 URL:http: //php.net/manual/en/function.strpos.php

像这样,我把实现留给你:

foreach($list_of_urls as $url) {
    foreach($list_of_modelnumbers as $model) {
        if(strpos($url, $model)) {
            $list_of_urls_to_crawl[] = $url; 
   /* you can also remove the $model, but I already wrote it in a foreach loop */
            break;
        }
    }
}

然后你可以从爬虫结果中清除$list_of_urls并附加新的:)

foreach($list_of_urls_to_crawl as $url) {
     //Set $crawler, let him go, get your description etc.

     foreach($crawler->links_found as $url) {
         $list_of_urls[] = $url;
     }
}

并将其放在一个大while($still_need_descriptions)循环中。

于 2013-03-04T13:41:06.293 回答
1

或者,如果您不喜欢http://phpcrawl.cuab.de/,您可以使用PHP-Spider

这就像编写基于 CSV 的自定义 URL 发现器然后使用 XPath 查询解析抓取的页面一样简单。请参阅https://mvdbos.github.io/php-spider/上的示例。您唯一需要更改的是添加到 Spider 的 Discoverer 类。假设您知道 URL 是如何构建的,它可能如下所示:

class CsvModelNumberDiscoverer implements Discoverer
{
    protected $modelNumbersAndTitles = array();

    public function __construct(array $modelNumbersAndTitles)
    {
        $this->modelNumbersAndTitles = $modelNumbersAndTitles;
    }

    public function discover(Spider $spider, Resource $document)
    {
        $urls = array();
        foreach ($this->modelNumbersAndTitles as $number => $title) {
            $urls[] = 'http://example.com/' . $title . '-MN-' . $number . '.htm';
        }
        return $urls;
    }
}

运行蜘蛛的代码如下所示:

$spider = new Spider('http://www.example.com');
$spider->addDiscoverer(new CsvModelNumberDiscoverer($modelNumbersAndTitles);
$result = $spider->crawl();

最后,您可以从结果中得到描述,如下所示:

foreach ($result['queued'] as $resource) {
    $modelNo = $resource->getCrawler()->filterXpath("div[@id='modelNo']")->text();
    $description = $resource->getCrawler()->filterXpath("div[@id='description']")->text();
}

如果您不知道 URL 是如何构建的,那么您将蜘蛛整个站点(如 AmazingDreams 的回答)并使用发现器将 URL 与型号列表匹配。不过这需要更多时间。

完全披露:我写了PHP-Spider

于 2013-03-05T14:33:51.343 回答
0

您可以首先使用获取 html 代码

$homepage = file_get_contents('http://www.example.com/title-of-product-MN-504-1.htm');

然后,您将 html 代码与 php dom 解析器一起使用,以获取您需要的确切元素的值。

于 2013-03-04T11:53:33.297 回答