Как сканировать изображения Bing с помощью Simple HTML Dom Parser? - PullRequest
1 голос
/ 29 марта 2019

Я создаю поисковую систему PHP.
Я хочу иметь разные типы поиска. Как пользователь может искать изображения, веб-сайты, видео и т. Д.
Сейчас я пробую 2 вещи:
1: Для поиска только видео.
2: И искать только изображения.
Я ползу по сети, используя Bing. Как это:

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


Я использую Simple HTML Dom Parser, чтобы получить все результаты.
Я знаю из консоли 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';
}


Я получаю ложь, потому что путь поиска, который я вставил, неверен.
Но я точно знаю, что это так.
И точно такая же проблема с поиском видео.
Я искал весь интернет, но я не нашел никакого решения.
Кто-нибудь знает решение?
С уважением,

EDIT
Я забыл упомянуть следующее:
Если я делаю только изображение в виде пути поиска: $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 }

И в каждом операторе else-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 :(';
}

Понятно: Clear не работал :(
Так что это означает, что что-то не так с $html->load_file(); и $html->clear();

1 Ответ

0 голосов
/ 30 марта 2019

Я считаю, что использовать DOMDocument и XPath намного проще, поэтому это показывает, как я справился с вышеописанным.

Способ, которым я склоняюсь к этому, - загрузить страницу в PHP и затем сохранить ее вфайл, затем используйте файл для путей, поскольку иногда это отличается от путей браузера.Использование этого сохраненного файла приведет меня к следующему XPath.

Используемый XPath - это //span[@id="main"]//a[@class="thumb"]//img/@src, за которым должно быть довольно легко следовать (тег span с атрибутом id main, затем тег с классом большого пальца ипоищите теги изображений внутри и, наконец, верните атрибут 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;
}
...