Хорошо, чтобы вы подтвердили мои подозрения в своем комментарии, вот что я хотел бы сделать:
Сначала я бы настроил метод удаления, чтобы имитировать запрос браузера.Попробуйте поиграть с заголовками и добавьте больше, если это необходимо.
<?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, которые вы могли бы использовать в качестве проверки.