Как очистить Instagram, используя Python, используя Selenium после того, как Instagram изменил свой процесс API? Я не могу найти все записи, могу только найти 12 - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь очистить Instagram, используя Python и Selenium. Цель состоит в том, чтобы получить URL всех постов, количество комментариев, количество лайков и т. Д. c.

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

driver = webdriver.Chrome('chromedriver.exe')
driver.get('https://www.instagram.com/fazeapparel/?hl=en')
source = driver.page_source
data=bs(source, 'html.parser')
body = data.find('body')
script = body.find('script', text=lambda t: t.startswith('window._sharedData'))
page_json = script.text.split(' = ', 1)[1].rstrip(';')
data = json.loads(page_json)

Используя полученные данные, я смог найти информацию и собрать ее.

for each in data['entry_data']['ProfilePage'][0]['graphql']['user']['edge_owner_to_timeline_media']['edges']:
    link = 'https://www.instagram.com'+'/p/'+each['node']['shortcode']+'/'
    posttext = each['node']['edge_media_to_caption']['edges'][0]['node']['text'].replace('\n','')
    comments = each['node']['edge_media_to_comment']['count']
    likes = each['node']['edge_liked_by']['count']
    postimage = each['node']['thumbnail_src']
    isvideo = each['node']['is_video']
    postdate = time.strftime('%Y %b %d %H:%M:%S', time.localtime(each['node']['taken_at_timestamp']))
    links.append([link, posttext, comments, likes, postimage, isvideo, postdate])

Я даже создал функцию прокрутки для прокрутки окна, а затем очистки данных, но он возвращает только 12.

Можно ли как-нибудь получить более 12 записей? В этом аккаунте 46 записей, и я не могу найти его нигде в коде. Пожалуйста, помогите!

Редактировать: Я думаю, что данные встроены в React, поэтому не отображаются все сообщения

1 Ответ

0 голосов
/ 07 апреля 2020

Вы добавили с помощью OpenQA.Selenium.Support.UI? У него есть WebDriverWait, и вы можете подождать, пока элемент будет виден. Извините за это в C#. Ящики должны возвращать все сообщения.

Опять же, я знаю, что это не в Python, но я надеюсь, что это помогает.

IWebDriver driver = new ChromeDriver("C:\\Users\\admin\\downloads", options);

WebDriverWait wait = new WebDriverWait(driver, time);

driver.Navigate().GoToUrl("www.instagram.com\cnn");

 IWebElement mainDocument = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementExists(By.TagName("body")));

IWebElement element  = mainDocument.FindElements(By.CssSelector("#react-root > section > main > div > div._2z6nI > article > div > div");

IList <IWebElement> boxes =  element.FindElements(By.TagName("div"));

foreach (var posts in boxes)
{
 //do stuff here

}

РЕДАКТИРОВАТЬ:

Это делает ajax вызов на заднем конце, чтобы загрузить следующие сообщения при прокрутке. Одним из способов может быть запуск скрипта с прокруткой вниз. Вы хотели бы назвать этот сценарий в селене. Я бы добавил logi c с таймером, чтобы дождаться запуска скрипта и проверить, возвращает ли он «STOP». Любой тип нити спит блокирует нить. Я бы использовал запуск таймера для вызова метода, который запускает мой скрипт.

function scrollDown() {
 //once this bottom element disappears we found all the posts
var bottom = document.querySelector('._4emnV')

if (bottom != null) {
    window.scroll(0,999999)
 }
 else
 {
    return "STOP"
 }

}
...