长话短说,我正在尝试创建一个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)
答案 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