如何在python中抓取完整的Instagram页面?

时间:2018-04-27 08:19:44

标签: python python-3.x python-requests instagram

长话短说,我正在尝试创建一个Instagram python scraper,它可以加载整个页面并抓取所有链接到图像。我有它的工作,唯一的问题是,它只加载Instagram显示的原始12张照片。无论如何我可以告诉请求加载整个页面吗?

工作代码;

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 :(得分:0)

正如Scratch已经提到的,Instagram使用“无限滚动”,这将不允许您加载整个页面。但是您可以检查页面顶部的消息总数(在_fd86t类的第一个范围内)。然后,您可以检查页面是否已包含所有消息。否则,您将不得不使用GET请求来获取新的JSON响应。这样做的好处是此请求包含first字段,这似乎允许您修改您获得的消息数量。您可以从其标准12修改它以获取所有剩余的消息(希望如此)。

必要的请求看起来类似于以下内容(我已经匿名化了实际的条目,并在评论的帮助下):

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

答案 1 :(得分:0)

<强> 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']]

获得ID后,您可以使用Instagram的旧API获取数据。我不确定它是否仍然有效,但是我使用了一个API - 这受到了FB慢慢弃用旧API部分的限制。这是link,如果您不想自己访问Instagram API:)

您还可以添加对此简单代码的改进。而不是“for”循环,你可以做一个“while”循环(即当页面仍在加载时,按住END按钮。)

答案 2 :(得分:0)

@zero的答案不完整(至少从1/15/19起)。 g不是有效的方法。相反,这是我所做的:

c.send_keys