[PYTHON] So speichern Sie alle Instagram-Fotos auf einmal

Überblick

Ich habe den Code geschrieben, um alle Bilder von Instagram auf einmal herunterzuladen. Ein stabiler Betrieb kann erwartet werden, indem die Anmelde- und Bildschirm-Scrolling-Teile manuell ausgeführt werden.

Demo-Video

Es funktioniert so.

instaimgdownload.gif

⚠️ Die [Nutzungsbedingungen] von Instagram (https://www.facebook.com/help/instagram/478745558852511) verbieten die Verwendung automatisierter Mittel zum Abrufen von Informationen. Erstellen Sie keine Automatisierungstools basierend auf dem Inhalt dieses Artikels.

Was ist Selen?

Selenium ist eine Gruppe von Tools mit Funktionen, die auf die Testautomatisierung von Webanwendungen spezialisiert sind. Weitere Informationen finden Sie im Artikel "Instagram-Follower-All-out-Strategie-Mastering von Selenium und PyAutoGUI mit Python !! -". ..

Vorbereitung

Bitte bereiten Sie eine Umgebung vor, in der Python 3 verwendet werden kann.

Installieren Sie Selen mit pip install selenium.

Von ChromeDriver --WebDriver für Chrome Laden Sie den Chrome-Treiber herunter, der der aktuell verwendeten Chrome-Version entspricht. Sie können die Chrome-Version überprüfen, indem Sie in Chrome nach "chrome: // version /" suchen. Es ist bequem!

Um den Chrome-Treiber auf die neueste Version zu aktualisieren, führen Sie "Chrome-Treiber neu installieren" aus.

Code-Fluss

[1. Bei Instagram anmelden](# 1 Bei Instagram anmelden) [2. Bild-URL abrufen](# 2 Bild-URL abrufen) [3. Bild herunterladen](# 3 Bild herunterladen)

Der Fluss ist mir egal, ich möchte ihn vorerst verschieben In diesem Fall wird unten [Ganzer Code](# Ganzer Code) aufgelistet, also bitte!

Klicken Sie hier für das GitHub-Repository (https://github.com/ekkyu/InstaImgCollector).

1. Melden Sie sich bei Instagram an

Sie werden aufgefordert, sich manuell anzumelden. Bitte besorge dir vorher einen Instagram Account.


self.login_time = 20

self.options = webdriver.ChromeOptions()
self.options.add_argument('--no-sandbox')

self.driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', options=self.options)
self.action = ActionChains(self.driver)

def login(self):
    url = "https://www.instagram.com/"
    self.driver.get(url)

    sleep(self.login_time)

Durch Hinzufügen von "options.add_argument (" --no-sandbox ")" wird der Anmeldebildschirm tatsächlich in einem separaten Fenster geöffnet.

Die zum Anmelden erforderliche Zeit wird durch "login_time = 20" angegeben. Diesmal waren es 20 Sekunden.

2. Holen Sie sich die Bild-URL

Als nächstes erhalten Sie die URL des Bildes. Scrollen Sie manuell zum Ende Ihrer Profilseite.

Aufgrund der Spezifikationen von Instagram wird das Bild erfasst, das als Reaktion auf das Scrollen auf dem Bildschirm angezeigt wird.

Wenn es schwierig ist, das Bild der Bewegung zu erfassen, scrollen Sie durch die Profilseite, während Sie das Bedienfeld "Element" der "Entwicklertools" anzeigen, das durch Drücken der Taste ("Befehl" + "Option" + "I") angezeigt wird. schauen Sie bitte.

Wenn Sie sich nicht sicher sind, drücken Sie die Taste (Befehl + Option + I), während Sie den aktuellen Bildschirm beibehalten. Sie sollten in der Lage sein, die HTML-Quelle für diese Seite zu sehen.


self.img_url_list = []

self.window_width = 0
self.window_height = 0

self.scroll_time = 30

def return_img_pattern(self):
    html_source = self.driver.page_source
    pattern = '><a href="/p/(.*?)/"><div class="'
    results = re.findall(pattern, html_source, re.S)
    return results

def fetch_img_url(self, target_username) -> list:
    url = "https://www.instagram.com/{}".format(target_username)
    self.driver.get(url)
    self.driver.maximize_window()

    for i in range(self.scroll_time):
        sleep(1)
        url_list = self.return_img_pattern()
        new_url = [i for i in url_list if i not in self.img_url_list]
        self.img_url_list.extend(new_url)

    return self.img_url_list

Die zum Scrollen benötigte Zeit wird durch "scroll_time = 30" angegeben. Diesmal waren es 30 Sekunden.

Liest den geänderten HTML-Code durch Scrollen jede Sekunde. Derzeit wird nur (ein Teil) der Bild-URL mithilfe des Musters für reguläre Ausdrücke aus dem HTML-Code extrahiert.

3. Bild herunterladen

Verwenden Sie abschließend die erhaltene Bild-URL, um das Bild sofort herunterzuladen.


self.download_img_size = "l"
#                         l: 640×640px
#                         m: 306×306px
#                         t: 150×150px

def download_img(self, url, save_file_path):
    full_url = "https://www.instagram.com/p/" + str(url) +  "/media/?size=" + self.download_img_size
    r = requests.get(full_url, stream=True)

    if r.status_code == 200:
        with open(save_file_path, 'wb') as f:
            f.write(r.content)

Die Größe des herunterzuladenden Bildes beträgt

Sie können aus wählen. Bitte geben Sie download_img_size an.

Ganzer Code


import re
import json
import requests
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.action_chains  import ActionChains
from selenium.webdriver.common.keys import Keys

class InstaImgCollector:

    def __init__(self):

        self.img_url_list = []
        self.window_width = 0
        self.window_height = 0
        
        self.login_time = 20
        self.scroll_time = 30
        
        self.download_img_size = "l"
#                         l: 640×640px
#                         m: 306×306px
#                         t: 150×150px
        
        self.options = webdriver.ChromeOptions()
        self.options.add_argument('--no-sandbox')

        self.driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', options=self.options)
        self.action = ActionChains(self.driver)
    
    def return_img_pattern(self):
        html_source = self.driver.page_source

        pattern = '><a href="/p/(.*?)/"><div class="'
        results = re.findall(pattern, html_source, re.S)
        return results

    def login(self):
        url = "https://www.instagram.com/"
        self.driver.get(url)

        sleep(self.login_time)

    def fetch_img_url(self, target_username) -> list:
        url = "https://www.instagram.com/{}".format(target_username)
        self.driver.get(url)
        self.driver.maximize_window()
        
        for i in range(self.scroll_time):
            sleep(1)
            url_list = self.return_img_pattern()
            new_url = [i for i in url_list if i not in self.img_url_list]
            self.img_url_list.extend(new_url)
        
        return self.img_url_list
        
    def download_img(self, url, save_file_path):
        full_url = "https://www.instagram.com/p/" + str(url) +  "/media/?size=" + self.download_img_size
        r = requests.get(full_url, stream=True)
        
        if r.status_code == 200:
            with open(save_file_path, 'wb') as f:
                f.write(r.content)
    
    def get_post_url_from_id(self, id_):
        self.login()
        
        self.img_url_list = self.fetch_img_url(target_username=id_)

        self.driver.quit()
        return self.img_url_list
    
    def flatten(self, alist):
        return [ flatten for inner in alist for flatten in inner ]


if __name__ == '__main__':
    id_ = "Geben Sie hier die Insta-ID an"
    iic = InstaImgCollector()
    url_list = iic.get_post_url_from_id(id_)
    
    for url_i in url_list:
        iic.download_img(url_i, "img/{}.png ".format(url_i))

Referenz

InstaImgCollector Was ist Selen Zusammenfassung der häufig verwendeten Betriebsmethoden des Selenium-Webdrivers So überprüfen Sie die Version von Google Chrome [Allgemein für Mac / Windows]

Recommended Posts

So speichern Sie alle Instagram-Fotos auf einmal
[Python] So speichern Sie Bilder mit Beautiful Soup sofort im Web
Ersetzen Sie alles auf einmal durch sed
So teilen und speichern Sie einen DataFrame
Konvertieren Sie Memos sofort mit Python 2to3
Senden Sie Newsletter auf einmal mit Google Mail
Setzen Sie Expire auf Redis-Taste sofort
Wie man viele Pipelines zusammenbaut und sofort weglegt
So erstellen Sie große Dateien mit hoher Geschwindigkeit
Wie man einen Wettbewerb bei Coda Lab abhält
Ein Befehl zum automatischen Aktualisieren der Pip-Bibliothek in einem Stapel
Tensorufuro, Tensafuro Immerhin welches (wie man Tensorflow liest)
Anfänger versuchen, Word-Dateien sofort in PDF zu konvertieren
Wie man setUp nur einmal in Python unittest ausführt
So speichern Sie eine von Python gekratzte Tabelle in CSV
[TF] Speichern und Laden von Tensorflow-Trainingsparametern
Ich habe ein Tool erstellt, um die Antwortlinks von OpenAI Gym auf einmal zu erhalten