我正在尝试使用cURL和Simple Html Dom Parser处理php抓取,但是在返回json格式时卡住了。网站是一个免费的网络爬虫测试网站。
function getPage($href) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_URL, $href);
curl_setopt($curl, CURLOPT_REFERER, $href);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$str = curl_exec($curl);
$html = str_get_html($str);
curl_close($curl);
return $html;
}
$link = 'https://www.webscraper.io/test-sites/e-commerce/allinone/computers';
$data = getPage($link);
foreach ($data->find('div[class=col-sm-4 col-lg-4 col-md-4]') as $key => $finder) {
$img = $finder->find('img[class=img-responsive]');
$imgCrt = $img->src;
$price = $finder->find('h4[class=pull-right price]');
$priceCrt = $price->innertext;
$desc = $finder->find('p[class=description]');
$descCrt = $desc->innertext;
$json['status'] = 'ok';
$json['return'][] = [
'img' => $imgCrt,
'price' => $priceCrt,
'desc' => $descCrt
];
}
echo json_encode($json);
结果:
{"status":"ok","return":[{"img":null,"price":null,"desc":null},{"img":null,"price":null,"desc":null},{"img":null,"price":null,"desc":null}]}
还有错误...
43、45、47行:
43 - $imgCrt = $img->src;
45 - $priceCrt = $price->innertext;
47 - $descCrt = $desc->innertext;
删除这些行,结果页将变为空白,没有错误,也没有json结果。 预先感谢!
解决方案!
倾销时发现了这一点:
var_dump($finder->find('img')[0]->src);
echo "<br />";
var_dump($finder->find('h4.price')[0]->innertext);
echo "<br />";
var_dump($finder->find('p.description')[0]->innertext);
现在工作起来就像一个小玩意儿:
$img[$key] = $finder->find('img')[0]->src;
$price[$key] = $finder->find('h4.price')[0]->innertext;
$desc[$key] = $finder->find('p.description')[0]->innertext;
$json['return'][] = [
'img' => $img[$key],
'price' => $price[$key],
'desc' => $desc[$key]
];
结果: img:https://i.imgur.com/it9ZxEC.png
谢谢!
答案 0 :(得分:0)
$imgCrt = $img->src;
是对象还是数组?
尝试$imgCrt = $img['src'];
答案 1 :(得分:0)
如果您使用的是PHP 7,一旦确认变量是什么类型的标量或向量,就可以执行以下操作:
$imgCrt = $img['src'] ?? $img->src;
翻译,这是:
$imgCrt = is_array($img) && !empty($img['src']) ? $img['src'] : $img->src;
这假定您的密钥是src
变量中的$img
。
请参阅我的注释,了解如何调试以及查看哪些值和值类型。
还要记住设置HTTP响应代码-> http://php.net/manual/en/function.http-response-code.php
答案 2 :(得分:0)
您在->find
调用中找不到任何元素,这就是为什么您遇到这些错误的原因。
Simple html解析器在find方法中使用CSS选择器,您要搜索的属性中包含空格,因此必须将其引起引用。
除非您指定索引,否则find
还会返回一个数组
foreach ($data->find('div["class=col-sm-4 col-lg-4 col-md-4"]') as $key => $finder) {
$img = $finder->find('img[class=img-responsive]', 0);
$imgCrt = $img->src;
$price = $finder->find('h4[class="pull-right price"]', 0);
$priceCrt = $price->innertext;
$desc = $finder->find('p[class=description]', 0);
$descCrt = $desc->innertext;
$json['status'] = 'ok';
$json['return'][] = [
'img' => $imgCrt,
'price' => $priceCrt,
'desc' => $descCrt
];
}
答案 3 :(得分:0)
检查find()
是否在foreach循环内返回数据
var_dump($key);
var_dump($finder);
或
print_r($finder);
print_r($key);