使用 Goutte 和 Guzzle 进行网页抓取
Webscraping with Goutte and Guzzle
我的控制器使用以下方法从站点获取数据:
$goutteClient = new Client();
$guzzleClient = new GuzzleClient([
'timeout' => 60,
]);
$goutteClient->setClient($guzzleClient);
$crawler = $goutteClient->request('GET', 'https://html.duckduckgo.com/html/?q=Laravel');
$crawler->filter('.result__title .result__a')->each(function ($node) {
dump($node->text());
});
上面的代码从搜索结果中给出了内容的标题。我也想得到对应搜索结果的link。位于 class result__extras__url
.
如何同时过滤 link 和标题?或者我必须 运行 另一种方法吗?
对于解析,我通常会这样做:
$doc = new DOMDocument();
$doc->loadHTML((string)$crawler->getBody());
从那时起,您可以在 DOMDocument 上使用 getElementsByTagName
函数进行访问。
例如:
$rows = $doc->getElementsByTagName('tr');
foreach ($rows as $row) {
$cols = $row->getElementsByTagName('td');
$value = trim($cols->item(0)->nodeValue);
}
您可以在以下位置找到更多信息
https://www.php.net/manual/en/class.domdocument.php
尝试检查节点的属性。获得 href
属性后,解析它以获取 URL.
$crawler->filter('.result__title .result__a')->each(function ($node) {
$parts = parse_url(urldecode($node->attr('href')));
parse_str($parts['query'], $params);
$url = $params['uddg']; // DDG puts their masked URL and places the actual URL as a query param.
$title = $node->text();
});
我的控制器使用以下方法从站点获取数据:
$goutteClient = new Client();
$guzzleClient = new GuzzleClient([
'timeout' => 60,
]);
$goutteClient->setClient($guzzleClient);
$crawler = $goutteClient->request('GET', 'https://html.duckduckgo.com/html/?q=Laravel');
$crawler->filter('.result__title .result__a')->each(function ($node) {
dump($node->text());
});
上面的代码从搜索结果中给出了内容的标题。我也想得到对应搜索结果的link。位于 class result__extras__url
.
如何同时过滤 link 和标题?或者我必须 运行 另一种方法吗?
对于解析,我通常会这样做:
$doc = new DOMDocument();
$doc->loadHTML((string)$crawler->getBody());
从那时起,您可以在 DOMDocument 上使用 getElementsByTagName
函数进行访问。
例如:
$rows = $doc->getElementsByTagName('tr');
foreach ($rows as $row) {
$cols = $row->getElementsByTagName('td');
$value = trim($cols->item(0)->nodeValue);
}
您可以在以下位置找到更多信息 https://www.php.net/manual/en/class.domdocument.php
尝试检查节点的属性。获得 href
属性后,解析它以获取 URL.
$crawler->filter('.result__title .result__a')->each(function ($node) {
$parts = parse_url(urldecode($node->attr('href')));
parse_str($parts['query'], $params);
$url = $params['uddg']; // DDG puts their masked URL and places the actual URL as a query param.
$title = $node->text();
});