Вы здесь

Парсинг страниц с кириллицей парсером от xandeadx

0

Часть страниц при парсинге выдавали ошибку. Опытным путем вычислил, что это страницы, имеющие часть адреса в кириллице.
Пример страницы: http://ruslanglyantsev.ru/ezoterika/%D0%9C%D0%BE%D0%BB%D0%BE%D0%B4%D0%BE...
Парсер выдает ошибку, что страница не найдена:

Ошибка при закачке "http://ruslanglyantsev.ru/ezoterika/Молодой-да-старый": Not Found, Результат: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>ПРОИЗВЕДЕНИЯ | Страница не найдена</title>.... 

Возможно кто-то сталкивался с такой проблемой? Или есть простое решение без изменения адресов на исходном сайте.

Версия Drupal: 
7.x
Вопрос задан 03.10.2015 - 00:15

Ответы

1

покажите сам скрипт

Ответ дан 03.10.2015 - 03:30

Здравствуйте! Вот экспортированный код задания на парсинг:

{
  "jid" : "2",
  "title" : "Страницы с Ruslan Glyantsev",
  "start_url" : "http:\u002F\u002Fruslanglyantsev.ru\u002Fezoterika\u002F",
  "test_url" : "http:\u002F\u002Fruslanglyantsev.ru\u002Fezoterika\u002F%D0%94%D0%B5%D0%B2%D1%8F%D1%82%D1%8C-%D0%B4%D0%BD%D0%B5%D0%B9",
  "only_this_domen" : "1",
  "depth" : "2",
  "parse_limit" : "0",
  "white_list" : "http:\u002F\u002Fruslanglyantsev.ru\u002Fezoterika\u002F*",
  "black_list" : "*.jpg\u000D\u000A*.png\u000D\u000A*.zip\u000D\u000A*.rar\u000D\u000A*.pdf",
  "check_code" : "return $doc-\u003Efind(\u0027div.panel-47\u0027)-\u003Elength() == 1;",
  "save_url" : "1",
  "no_update" : "0",
  "site_charset" : "auto",
  "charset_fix" : "0",
  "entity_type" : "node",
  "bundle" : "stories",
  "remote_id_code" : "",
  "fields_code" : {
    "title" : "return $doc-\u003Efind(\u0027h1.title\u0027)-\u003Etext();",
    "author" : "return 1;",
    "body" : "return $doc-\u003Efind(\u0027.panel-47 .blog-text\u0027)-\u003Ehtml();",
    "field_image" : "return array(\u000D\u000A  \u0027file\u0027 =\u003E $doc-\u003Efind(\u0027.detailed-picture img:first\u0027)-\u003Eattr(\u0027src\u0027),\u000D\u000A);",
    "field_tags" : "return array(\u000D\u000A  5,\u000D\u000A);"
  },
  "list_mode_code" : "",
  "init_code" : "",
  "prepare_code" : "",
  "headers" : "User-Agent: Opera\u002F9.80 (Windows NT 6.1; U; ru) Presto\u002F2.8.131 Version\u002F11.10\u000D\u000A",
  "proxies" : "",
  "force_download" : "0",
  "force_download_list" : "",
  "sleep" : "0",
  "run_period" : "0",
  "last_run" : "0",
  "status" : "1",
  "module" : null,
  "rdf_mapping" : [  ]
}
Комментарий оставлен 03.10.2015 - 10:15
1

Тут надо символы, которые не ascii, их надо обрабатывать.
Можно с помощью rawurlencode.
Вот еще тема на stackoverflow.

Надо модуль подправить xparser, перед запрос поработать над $url.

Ответ дан 04.10.2015 - 02:48

Спасибо за совет! Честно пытался подправить модуль, но не очень получается, т.к. в php не силен.

Вот функция, которая, как я понял, отвечает за обработку url:

$start_urls = explode("\n", trim($job->start_url));
    foreach ($start_urls as $start_url) {
      $start_url = trim($start_url);
      if (preg_match('#\[mask:(\d+),(\d+)\]#', $start_url, $matches)) {
        $min = (int)$matches[1];
        $max = (int)$matches[2];
        for ($i = $min; $i <= $max; $i++) {
          $url = str_replace('[mask:' . $matches[1] . ',' . $matches[2] . ']', $i, $start_url);
          _parser_url_add($url, $job->jid);
        }
      }
      else {
        _parser_url_add($start_url, $job->jid);
      }

Соответственно, единственное, что мне приходит в голову - третью строчку заменить на следующую:

$start_url = rawurlencode (trim($start_url));

но в таком случае url кодируется полностью и получается следующая ошибка:

Ошибка при закачке "http%3A%2F%2Fruslanglyantsev.ru%2Fezoterika%2F": missing schema
Remote URL: http%3A%2F%2Fruslanglyantsev.ru%2Fezoterika%2F

Как заставить функцию кодировать только кириллические символы?

Комментарий оставлен 05.10.2015 - 23:33

Ты тему на stackoverflow чего не смотрел, там же написано

function url_path_encode($url) {
    $path = parse_url($url, PHP_URL_PATH);
    if (strpos($path,'%') !== false) return $url; //avoid double encoding
    else {
        $encoded_path = array_map('urlencode', explode('/', $path));
        return str_replace($path, implode('/', $encoded_path), $url);
    }   
}

Можешь сделать так

$start_url = url_path_encode(trim($start_url));

Только функцию не забудь засунуть.

Комментарий оставлен 06.10.2015 - 02:52

Спасибо! В принципе так и пытался делать, но что-то не получилось в прошлый раз. Сейчас решил вернуться к этой проблеме. И решил в итоге все очень быстро, однако, сначала опять ничего не заработало. Потому что как оказалось в этом модуле переменной адреса является не $start_url (это стартовый адрес, с которого начинается парсинг), а $page_url.

В итоге достаточно добавить функцию url_path_encode и в строке 673 обернуть ею переменную $page_url
$page = _parser_get_page_by_url(url_path_encode($page_url), $job->headers, $job->site_charset, $force_download);

я программированием вообще почти не занимаюсь, так что для меня это была победа побед )))

Комментарий оставлен 31.10.2015 - 01:29