[PYTHON] Comment enregistrer toutes les photos Instagram à la fois

Aperçu

J'ai écrit le code pour télécharger toutes les images de Instagram à la fois. Un fonctionnement stable peut être attendu en exécutant manuellement les parties de connexion et de défilement d'écran.

Vidéo de démonstration

Cela fonctionne comme ça.

instaimgdownload.gif

⚠️ Les [Conditions d'utilisation] d'Instagram (https://www.facebook.com/help/instagram/478745558852511) interdit l'utilisation de moyens automatisés pour obtenir des informations. Ne créez pas d'outils d'automatisation basés sur le contenu de cet article.

Qu'est-ce que le sélénium

Selenium est un groupe d'outils avec des fonctions spécialisées pour l'automatisation des tests d'applications Web. Pour plus de détails, veuillez vous référer à l'article "Instagram Follower All-Out Strategy-Mastering Selenium and PyAutoGUI with Python !! -". ..

Préparation

Veuillez préparer un environnement dans lequel Python 3 peut être utilisé.

Installez Selenium avec pip install selenium.

Depuis ChromeDriver --WebDriver pour Chrome Téléchargez le pilote Chrome correspondant à la version de Chrome que vous utilisez actuellement. Vous pouvez vérifier la version de Chrome en recherchant «chrome: // version /» dans Chrome. C'est pratique!

Pour mettre à jour le pilote Chrome vers la dernière version, exécutez brew cask reinstall chrome driver.

Flux de code

[1. Connectez-vous à Instagram](# 1 Connectez-vous à Instagram) [2. Obtenir l'URL de l'image](# 2 Obtenir l'URL de l'image) [3. Télécharger l'image](# 3 Télécharger l'image)

Je me fiche du flux, je veux le déplacer pour le moment Dans ce cas, [Whole code](#Whole code) est répertorié en bas, alors s'il vous plaît!

Cliquez ici pour le référentiel GitHub (https://github.com/ekkyu/InstaImgCollector)

1. Connectez-vous à Instagram

Vous serez invité à vous connecter manuellement. Veuillez obtenir un compte Instagram à l'avance.


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)

En ajoutant ʻoptions.add_argument ('--no-sandbox') `, l'écran de connexion s'ouvrira en fait dans une fenêtre séparée.

Le temps nécessaire pour se connecter est spécifié par login_time = 20. Cette fois, c'était 20 secondes.

2. Obtenir l'URL de l'image

Ensuite, récupérez l'URL de l'image. Faites défiler manuellement vers le bas de votre page de profil.

En raison des spécifications d'Instagram, l'image affichée en réponse au défilement de l'écran est acquise.

S'il est difficile de saisir l'image du mouvement, faites défiler la page de profil tout en affichant le panneau «Élément» des «Outils de développement», qui s'affiche en appuyant sur la touche («Commande» + «Option» + «I»). regarde s'il te plait.

Si vous n'êtes pas sûr, essayez d'appuyer sur la touche (Commande + ʻOption + ʻI) tout en conservant l'écran actuel. Vous devriez pouvoir voir la source HTML de cette page.


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

Le temps nécessaire pour faire défiler est spécifié par scroll_time = 30. Cette fois, c'était 30 secondes.

Lit le code HTML modifié en faisant défiler toutes les secondes. Pour le moment, seule (une partie de) l'URL de l'image est extraite du code HTML à l'aide du modèle d'expression régulière.

3. Télécharger l'image

Enfin, utilisez l'URL de l'image obtenue pour télécharger l'image à la fois.


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)

La taille de l'image à télécharger est

Vous pouvez choisir. Veuillez spécifier download_img_size.

Code entier


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_ = "Spécifiez l'ID Insta ici"
    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))

référence

InstaImgCollector Qu'est-ce que le sélénium Résumé des méthodes de fonctionnement fréquemment utilisées de Selenium webdriver Comment vérifier la version de Google Chrome [commune à Mac / Windows]

Recommended Posts

Comment enregistrer toutes les photos Instagram à la fois
[Python] Comment enregistrer des images sur le Web à la fois avec Beautiful Soup
Remplacez tout d'un coup par sed
Comment diviser et enregistrer un DataFrame
Convertir un mémo à la fois avec Python 2to3
Envoyez des newsletters en une seule fois avec Gmail
Définissez Expire sur la clé Redis à la fois
Comment assembler de nombreux pipelines et les ranger en même temps
Comment créer des fichiers volumineux à haute vitesse
Comment organiser un concours au Coda Lab
Une commande pour mettre à jour automatiquement la bibliothèque pip dans un batch
Tensorufuro, Tensafuro Après tout, lequel (Comment lire Tensorflow)
Les débutants essaient de convertir des fichiers Word en PDF à la fois
Comment exécuter setUp une seule fois dans Python Unittest
Comment enregistrer une table récupérée par python en csv
[TF] Comment enregistrer et charger les paramètres d'entraînement Tensorflow
J'ai créé un outil pour obtenir les liens de réponse d'OpenAI Gym en même temps