如何使用简单HTML Dom解析器抓取Bing图像?

时间:2019-03-29 20:52:34

标签: php web-crawler simple-html-dom

我正在构建一个PHP搜索引擎。
我想要不同的搜索类型。 就像用户可以搜索图像,网站,视频等一样。
现在我正在尝试2件事:
1:仅搜索视频。
2:并且仅搜索图像。
我正在使用Bing在网络上爬行。像这样:

$bing = 'https://www.bing.com/images/search?q='. rawurlencode($keyword);


我正在使用简单HTML Dom解析器来获取所有结果。
从浏览器的Inspect Element控制台中,我知道Bing中图像的整个“路径”是这样的:

$img = $html->find('div[data-bm] div[class=dg_b] div[class=dgControl]ul[class=dgControl_list] li div[class=varh] div[class=imgpt] a[class=iusc] div[class=hoff] img[class=mimg]');


但是,如果我这样做:

if($img) {
 // rest of the code ...                    
}
else {
    echo 'false';
}


我弄错了,因为我插入的搜索路径不正确。
但是我可以肯定地知道。
与视频搜索完全相同的问题。
我搜索了整个互联网,但没有找到任何解决方案。
有人知道解决方案吗?

编辑
我忘记提及以下内容:
如果我仅将图像作为查找路径,例如:$img = $html->find('img');,则可以得到结果。
但是问题是,如果我这样做,我得到的结果根本不重要。
就像我搜索特朗普一样,我得到一张海滩的照片和一些西红柿的照片,我认为这完全是荒谬的。

编辑2
我发现$ html-> load_file()不起作用。
我通过运行以下命令进行了测试:

if(!$html->load_file($bing)) {
     echo 'load file doesn't work....';
}

可能是因为我有多次$ html = ... 像这样:

if($_GET['type'] == 'default') { // rest of the code }
else if($_GET['type'] == 'vids') { // rest of the code }
else if($_GET['type'] == 'images') { // rest of the code }
else if($_GET['type'] == 'news') { // rest of the code }

在其他if语句中,它以$html = simple_html_dom();开头
但这也以$html->clear(); unset($html);结尾
但是,如果我测试$html->clear(); unset($html);是否像这样工作:

if($html->clear()) {
     unset($html);                    
     echo 'clear worked!';
}
else {
     echo 'clear didn't work :(';
}

我明白了:清除无效:(
因此,这意味着$html->load_file();$html->clear();

出了问题

1 个答案:

答案 0 :(得分:0)

我发现使用DOMDocument和XPath容易得多,因此这说明了我如何管理上述内容。

我倾向于的方法是用PHP加载页面,然后将其保存到文件中,然后将该文件用作路径,因为有时这与浏览器路径不同。使用此保存的文件,我将转到以下XPath。

使用的XPath是//span[@id="main"]//a[@class="thumb"]//img/@src,它应该很容易遵循(具有id属性为main的span标签,然后是一个具有thumb类的标签,并在其中查找图像标签,最后返回src属性)...

$content = file_get_contents("https://www.bing.com/images/search?q=cat");
file_put_contents("b.html", $content);

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($content);

$xp = new DOMXPath($dom);

$images = $xp->query('//span[@id="main"]//a[@class="thumb"]//img/@src');

foreach ( $images as $image )   {
    echo $image->nodeValue.PHP_EOL;
}