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.
Cela fonctionne comme ça.
⚠️ 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.
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 !! -". ..
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
.
[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)
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.
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.
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
.
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))
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