Как использовать cURL для поиска поддоменов, содержащих определенные строки? - PullRequest
0 голосов
/ 13 января 2012

Я пытаюсь создать список всех страниц города на ghix.com , который не имеет такого полного каталога.Для этого я использую их «идентификатор города», который уникален для каждого города, но не соответствует определенному порядку.

Я использую cURL и PHP для обхода возможных доменов для поиска тех, которые соответствуют реальным городам.Достаточно просто.См. Приведенный ниже код, который выдает 500 Внутренняя ошибка обслуживания .

Если это сработало, выводом должен быть список «идентификаторов городов», которые не соответствуют фактическим городам.Если URL соответствует реальному городу, на странице не будет (0), но если он не соответствует городу, на странице будет (0).

Я просмотрел и исправил это несколькораз, что является причиной ошибки?

<html>
<?php
for ($i = 1; ; $i <= 1000000; $i++) {
  $url = "http://www.ghix.com/goto/dynamic/city?CityID=" . $i;
  $term="(0)";
  curl_setopt($ch, CURLOPT_URL, trim($url));
  $html = curl_exec($ch);
  if ($html !== FALSE && stristr($html, $term) !== FALSE) { // Found!
    echo $i;
    Echo "br/";
  } 
}
?>
</html>

ОБНОВИТЬ немного другой подход, который я пробовал, с тем же эффектом ...

<html>
<?php

for ($i = 1; $i <= 100; $i++) {
$url = "http://www.ghix.com/goto/dynamic/city?CityID=" . $i;
$term="(0)";
curl_setopt($ch, CURLOPT_URL, trim($url));
$html = curl_exec($ch);
if (strpos($ch,$term)) {
    echo $url;
    echo "<br>";
}
?>
</html>

Ответы [ 2 ]

8 голосов
/ 13 января 2012

В вашем первом фрагменте кода у вас есть дополнительные ; в условиях for. Затем вам нужно инициализировать cURL с $ch = curl_init(); в начале. Это открывает обработчик $ch, который вы вызываете позже. Наконец, используйте 1= для ложного условия для if вместо восклицательного знака и двойного равенства. После этих исправлений я не получаю 500 ошибок. После этого нужно просто собрать данные со страниц и разместить их в нужных местах.

Во втором фрагменте кода вам все еще нужно инициализировать cURL. Затем вам нужно вставить еще одну фигурную скобку в конце, чтобы закрыть петлю for. А потом нужно разобраться с выводом из cURL.

Кажется, вы получаете больше опечаток, чем что-либо еще. Посмотрите журналы вашего сервера, и они расскажут вам больше о том, что вы ищете. Что касается cURL, ознакомьтесь с параметрами, которые вы можете установить в PHP на сайте PHP . Это хорошее чтение. Удачи.

4 голосов
/ 13 января 2012

Я обнаружил, что вы можете использовать автозаполнение JSON-запроса, чтобы найти все идентификаторы города.URL JSON-запроса http://www.ghix.com/goto/dynamic/suggest?InputVarName=q&q=FRAGMENT&Type=json&SkipPrerequisites=1.Здесь FRAGMENT - это буквы, которые вы вводите в поле ввода.Итеративный запрос по этому URL-адресу покажет все CityID, которые вы ищете.

Имейте в виду, у них может быть защита ботов для таких запросов ajax.

Я видел, что их JSON искажен.Это можно исправить с помощью Services_JSON грушевого пакета.

require_once 'Services/JSON.php';
$Services_JSON = new Services_JSON();
$json = $Services_JSON->decode($jsons);

С использованием dxtool / WebGet следующий код работает.

require_once("WebGet.php");

// common headers to make this request more real.
$headers = array(
    "Accept-Charset" => "ISO-8859-1,utf-8;q=0.7,*;q=0.7",
    "Accept-Encoding" => "gzip, deflate",
    "Accept-Language" => "en-us,en;q=0.5",
    "Connection" => "keep-alive",
    "Referer" => "http://www.ghix.com/goto/dynamic/search",
    "User-Agent" => "Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"
);

$w = new WebGet();
$w->cookieFile = dirname(__FILE__) . "/cookie.txt";

// do a page landing
$w->requestContent("http://www.ghix.com/goto/dynamic/search", array(), array(), $headers);

$city_ids = array();
for ($i = 1; $i <= 1000; $i++) {
    $url = "http://www.ghix.com/goto/dynamic/city?CityID=" . $i;
    $term = "> (0)<";
    $w->requestContent($url, array(), array(), $headers);
    // sleep some times to make it more like request from human
    usleep(10000);
    if (strpos($w->cachedContent, $term) !== FALSE){
        $city_ids[]  = $i;
        echo $url, PHP_EOL;
    }
}

print_r($city_ids);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...