Как я могу очистить полную страницу Instagram в Python? - PullRequest
0 голосов
/ 27 апреля 2018

Короче говоря, я пытаюсь создать скребок для python в Instagram, который загружает всю страницу и захватывает все ссылки на изображения. У меня это работает, единственная проблема в том, что он загружает только 12 оригинальных фотографий, которые показывает Instagram. Могу ли я сказать запросы на загрузку всей страницы?

Рабочий код;

import json
import requests
from bs4 import BeautifulSoup
import sys

r = requests.get('https://www.instagram.com/accountName/')
soup = BeautifulSoup(r.text, 'lxml')

script = soup.find('script', text=lambda t: t.startswith('window._sharedData'))
page_json = script.text.split(' = ', 1)[1].rstrip(';')
data = json.loads(page_json)
non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)

for post in data['entry_data']['ProfilePage'][0]['graphql']['user']['edge_owner_to_timeline_media']['edges']:
    image_src = post['node']['display_url']
    print(image_src)

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

parse_ig.py

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
from InstagramAPI import InstagramAPI
import time

c = webdriver.Chrome()
# load IG page here, whether a hashtag or a public user's page using c.get(url)

for i in range(10):
    c.send_keys(Keys.END)
    time.sleep(1)

soup = BeautifulSoup(c.page_source, 'html.parser')
ids = [a['href'].split('/') for a in soup.find_all('a') if 'tagged' in a['href']]

Получив идентификаторы, вы можете использовать старый API Instagram, чтобы получить данные для них. Я не уверен, что это все еще работает, но был API, который я использовал - который был ограничен тем, насколько FB медленно осуждает части старого API. Вот ссылка на тот случай, если вы не хотите получать доступ к Instagram API самостоятельно:)

Вы также можете добавить улучшения в этот простой код. Как и вместо цикла «for», вы можете вместо этого выполнить цикл «while» (то есть, пока страница все еще загружается, продолжайте нажимать кнопку END.)

0 голосов
/ 16 января 2019

@ ответ нуля неполный (по крайней мере, по состоянию на 15.01.19). c.send_keys не является допустимым методом. Вместо этого я сделал следующее:

c = webdriver.Chrome()
c.get(some_url)

element = c.find_element_by_tag_name('body') # or whatever tag you're looking to scrape from

for i in range(10):
    element.send_keys(Keys.END)
    time.sleep(1)

soup = BeautifulSoup(c.page_source, 'html.parser')
0 голосов
/ 27 апреля 2018

Как уже упоминалось в Scratch, Instagram использует «бесконечную прокрутку», которая не позволит вам загрузить всю страницу. Но вы можете проверить общее количество сообщений в верхней части страницы (в пределах первого промежутка с классом _fd86t). Затем вы можете проверить, содержит ли страница все сообщения. В противном случае вам придется использовать запрос GET, чтобы получить новый ответ JSON. Преимущество этого состоит в том, что этот запрос содержит поле first, которое позволяет вам изменять количество получаемых вами сообщений. Вы можете изменить это из стандартного 12, чтобы получить все оставшиеся сообщения (надеюсь).

Необходимый запрос выглядит следующим образом (где я анонимизировал реальные записи и с некоторой помощью из комментариев):

https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={"id":"XXX","first":12,"after":"XXX"}
...