-1

网址: http: //www.sayuri.co.jp/used-cars

示例: http: //www.sayuri.co.jp/used-cars/B37753-Toyota-Wish-japanese-used-cars

嘿,伙计们,我的一个个人项目需要一些帮助,我已经编写了代码来从每个汽车 url 获取数据(示例)并发布在我的网站上

现在我需要通过主要网址:sayuri.co.jp/used-cars,并且:

1) 为其中的所有单车创建一个包含所有 url 的数组/列表/节点,然后为每个车运行我的内部代码以获取数据,然后继续下一个

  • 我已经有代码在完成时将每个 url 保存到日志文件中(如果它没有从顶部开始逐个链接,但可以确保不重复,则认为没有必要。

2)当页面的所有链接都完成后,它应该移动到下一页并做同样的事情直到结束(最多有5-6页)

自昨晚以来,我一直坚持这部分,非常感谢任何帮助。谢谢

我从主 url 获取数据的代码:

$content = file_get_contents('http://www.sayuri.co.jp/used-cars/');
// echo $content;

    $dom = new DOMDocument;
    $dom->loadHTML($content);
    //echo $dom;
4

1 回答 1

0

我猜你已经知道这一点,因为你说你已经从汽车条目本身获得了数据,但一个好的开始是剖析页面的 DOM 并查看是否有任何元素可以用来快速跳转。大多数浏览器都有页面检查工具来帮助解决这个问题。

在这种情况下,<div id="content">服务很好。您会注意到它包含一组带有所需链接的表格和一个<div>包含告诉我们有多少页面的文本。

免责声明,但自从我完成 PHP 以来已经有好几年了,我还没有测试过,所以它可能既不正确也不是最优的,但它应该让你开始。您需要将这些功能联系在一起(我这样做有什么乐趣?)以实现您想要的,但这些应该获取所需的数据。

您将在每个页面上使用 DOM,因此可以方便地获取 DOMDocument:

function get_page_document($index) {
    $content = file_get_contents("http://www.sayuri.co.jp/used-cars/page:{$index}");
    $document = new DOMDocument;
    $document->loadHTML($content);
    return $document;
}

您需要知道总共有多少页才能迭代它们,所以抓住它:

function get_page_count($document) {
    $content = $document->getElementById('content');
    $count_div = $content->childNodes->item($content->childNodes->length - 4);
    $count_text = $count_div->firstChild->textContent;

    if (preg_match('/Page \d+ of (\d+)/', $count_text, $matches) === 1) {
        return $matches[1];
    }

    return -1;
}

这有点难看,但是<table>内容容器中的每个链接都可以使用。把它们撕下来,然后把它们排成一个数组。如果您使用链接本身作为键,则无需担心重复,因为它们只会重写相同的键值。

function get_page_links($document) {
    $content = $document->getElementById('content');
    $tables = $content->getElementsByTagName('table');
    $links = array();

    foreach ($tables as $table) {
        if ($table->getAttribute('class') === 'itemlist-table') {
            // table > tbody > tr > td > a
            $link = $table->firstChild->firstChild->firstChild->firstChild->getAttribute('href');
            // No duplicates because they just overwrite the same entry.
            $links[$link] = "http://www.sayuri.co.jp{$link}";
        }
    }

    return $links;
}

也许也很明显,但是如果这个网站改变了它们的格式,这些就会中断。你最好问问他们是否有 REST API 或一些可供长期使用的 API,不过我猜你不会太在意它是否只是一个用于修补的个人项目。

希望它能帮助你朝着正确的方向前进。

于 2013-11-14T23:05:02.880 回答