Очень длительное (10+ секунд) время отклика на вызов file_get_contents () для контента Instagram - PullRequest
1 голос
/ 01 июня 2019

Я устраняю неполадки чьего-либо кода, который предназначен для динамического получения изображений из Instagram, а затем распечатывает их на странице.

Проблема в том, что сам процесс в основном ограничивает всю страницу, вызывая скачок времени загрузки на 10-12 секунд.

Кажется, я не могу найти причину этой проблемы. Предыдущий поиск в Google привел меня к ответам о том, что соединение не закрывается автоматически при использовании file_get_contents (), но это не должно быть проблемой с PhP 5.6, и особенно не 7.1, не так ли?

Это код вопроса:

<?php

function scrape_insta_hash($tag) {
  $insta_source = file_get_contents('https://www.instagram.com/explore/tags/'.$tag.'/');
  $shards = explode('window._sharedData = ', $insta_source);
  $insta_json = explode(';</script>', $shards[1]);
  $insta_array = json_decode($insta_json[0], TRUE);
  return $insta_array;
}

$tag = "placeholder";
$results_array = scrape_insta_hash($tag);

$limit = 5;
$imgs = array();

for ($i=$limit; $i >= 0; $i--) {                  
  if(array_key_exists($i,$results_array['entry_data']['TagPage'][0]["graphql"]["hashtag"]["edge_hashtag_to_media"]["edges"])) {
    $latest_array = $results_array['entry_data']['TagPage'][0]["graphql"]["hashtag"]["edge_hashtag_to_media"]["edges"][$i]["node"];
    $newPosting = ["image"=>$latest_array['display_url']];
    $imgs[] = $newPosting['image'];
  }
}
?>

Ответы [ 2 ]

0 голосов
/ 09 июня 2019

У меня возникла та же проблема после обновления до PHP 7. file_get_contents () У меня была потрясающая скорость в PHP 5, но отстой в PHP 7. Я решил проблему с помощью curl () вместо. Тебе тоже стоит попробовать.

0 голосов
/ 02 июня 2019

Хорошо, чтобы вы подтвердили мои подозрения в своем комментарии, вот что я хотел бы сделать:

Сначала я бы настроил метод удаления, чтобы имитировать запрос браузера.Попробуйте поиграть с заголовками и добавьте больше, если это необходимо.

<?php

function scrape_insta_hash($tag) {
  $opts = [
     "http" => [
        "method" => "GET",
        "header" => "Accept-language: en\r\n" .
            "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36 OPR/60.0.3255.109\r\n"
         ]
  ];

  $context = stream_context_create($opts);

  $insta_source = file_get_contents('https://www.instagram.com/explore/tags/'.$tag.'/', false, $context);
  file_get_contents('https://www.instagram.com/explore/tags/'.$tag.'/');
  $shards = explode('window._sharedData = ', $insta_source);
  $insta_json = explode(';</script>', $shards[1]);
  $insta_array = json_decode($insta_json[0], TRUE);
  return $insta_array;
}

Поскольку способ, которым вы получали страницу Instagram, зарегистрировал бы вас как php-бот.

Затем в части кода, гдеВы делаете запрос в цикле и добавляете небольшой тайм-аут:

foreach($tags as $tag) {
    $res = scrape_insta_hash($tag);
    ...

    // Sleep for half a second
    usleep(500000);
}

Также попробуйте поиграться с номером сна, чтобы увидеть, какое минимальное значение вы можете установить.Я имею в виду, что здесь нет точного ответа, вам понадобится много проб и ошибок, чтобы обойти механизм регулирования Instagram.

Кроме того, что может быть полезно, если использовать разные IP-адреса, возможно, в тот момент, когда вас душатможно использовать VPN в качестве прокси-сервера и изменить IP-адрес.

Как вы упомянули, механизм кэширования тоже неплохая идея, но вам нужен способ выяснить, изменилась ли страница, потому чтона первый взгляд я не вижу заголовков, которые могли бы быть полезными, согласно заголовкам ответов Instagram, эта страница никогда не кэшируется, на самом деле нет никаких etags, которые вы могли бы использовать в качестве проверки.

...