Obtenez des images d'excellentes trouvailles / 47 sites en utilisant Python (1/2: Jusqu'à la création de la liste cible)

Postscript après publication de l'article

Tout d'abord, récupérez les livrables ici 2e article, puis l'histoire suivante est OK.

en premier

Connaissez-vous un site merveilleux appelé find / 47? De belles images de paysages de 47 préfectures du pays sont fournies en haute qualité. Selon notre enquête, à la fin d'octobre 2020, il existe un total de 1080 types dans tout le pays, et (selon l'image) ceux-ci peuvent être téléchargés avec une résolution de S, M, L, XL. Cependant, si vous regardez rapidement le nombre d'accès publics, il semble qu'il ne soit pas entièrement reconnu et utilisé, et c'est regrettable. Donc, dans cet article (2 fois +), j'utilise Python pour (1) créer une liste d'images, (2) la télécharger et (3) utiliser Ubuntu / LXDE pour [variété](https: // peterlevi. Je vais vous présenter comment réaliser un environnement de changement automatique pour les fonds d'écran en utilisant com / variété /). À un niveau, c'est une introduction "quelque chose que vous voulez réaliser avec le scraping, l'implémenter en Python et le vérifier". Je n'ai moi-même pas fait beaucoup de technique ou d'optimisation. Notez s'il vous plaît. En fin de compte, je suis heureux de réaliser un bureau comme celui de l'image ci-dessous (comme passe-temps personnel). C'est tout. image.png

Points à noter

Ce premier article n'affectera pas l'exécution, mais vous aurez besoin d'environ 10 Go d'espace libre pour télécharger les images. Dans le deuxième ou le troisième article, je vais aborder la manière de réduire la résolution et la capacité de téléchargement des images.

Environnement d'exploitation

Veuillez le faire de manière appropriée.

Ubuntu

$ cat /etc/issue
Ubuntu 20.04.1 LTS \n \l

Python

$ python3 --version
Python 3.8.5

installed by pip3 Il peut y en avoir d'autres. Regardez le début du code et agissez.

$ pip3 list
beautifulsoup4               4.8.2
requests                     2.22.0
tqdm                         4.50.2

Schéma et code de l'opération

Aperçu des opérations

Il y a 6 étapes pour enregistrer l'image. Dans cet article 1/2, nous ferons 1 à 3 étapes. Plus précisément, il produit une liste d'images à télécharger dans un fichier texte sous une forme quelque peu lisible. Tout d'abord, lors du tournage de pages, créez-le sous une forme totalement illisible (étape 01, en mémoire), ajoutez des informations de taille à chaque ligne de la liste (étape 02, en mémoire) et sortie au format CSV (étape 03, en mémoire) Sortie de fichier). Jusqu'à présent, vous avez obtenu quelle région (0-7), quelle préfecture (0-46), quel nom de fichier (Remarque: pas d'extension), quelle taille (xl, x, m, s) et au total. Déterminez le nombre d'images que vous pouvez obtenir.

コード(1)01_generate_urls.py

Créez un dossier approprié (par exemple / home / nekoneko / codes / python / find47) et enregistrez-le sous le nom de fichier 01_generate_urls.py directement en dessous.

#!/usr/bin/env python3
# coding+ utf-8

import csv
import re
import requests
import subprocess
import time
from bs4 import BeautifulSoup

# e.g. https://search.find47.jp/ja/images?area=kinki&prefectures=kyoto&page=3

# declare variables

base_url            =   'https://search.find47.jp/ja/images?'

valid_urls          = []
target_urls         = []

areas               = [ 'hokkaido', 'tohoku', 'kanto-koshinetsu', 'tokai-hokuriku', 'kinki',
                        'chugoku' , 'sikoku', 'kyushu-okinawa' ]
prefs_head_by_area  = [  0,  1,  7, 17, 24, 30, 35, 39 ]
prefs_count_by_area = [  1,  6, 10,  7,  6,  5,  4,  8 ]
prefectures         = [
                        'hokkaido' ,

                        'aomori'   , 'iwate'     , 'miyagi'    , 'akita'    , 'yamagata' ,
                        'fukushima',

                        'tokyo'    , 'kanagawa'  , 'saitama'   , 'chiba'    , 'ibaraki'  ,
                        'tochigi'  , 'gunma'     , 'yamanashi' , 'niigata'  , 'nagano'   ,

                        'toyama'   , 'ishikawa'  , 'fukui'     , 'gifu'     , 'shizuoka' ,
                        'aichi'    , 'mie'       ,

                        'shiga'    , 'kyoto'     , 'osaka'     , 'hyogo'    , 'nara'     ,
                        'wakatama' ,

                        'tottori'  , 'shimane'   , 'okayama'   , 'hitoshima', 'yamaguchi',

                        'tokushima', 'kagawa'    , 'ehime'     , 'kochi'    ,

                        'fukuoka'  , 'saga'      , 'nagasaki'  , 'kumamoto' , 'oita'     ,
                        'miyazaki' , 'kagoshima' , 'okinawa'
                      ]

image_sizes         = ['xl' , 'l' , 'm' , 's']
max_pages           = 21
waiting_seconds     = 6

# make output folder

command = ('mkdir', '-p', './txt')
res     = subprocess.call(command)

# functions

def generate_target_urls():
    for  i in range(0,len(prefs_head_by_area)):

        for j in range(prefs_head_by_area[i], \
                       prefs_head_by_area[i] + prefs_count_by_area[i]):

            for k in range(1, max_pages):
                target_url = base_url \
                 + 'area=' + areas[i] \
                 + '&prefectures='\
                 + prefectures[j] \
                 + '&page=' \
                 + str(k)

                time.sleep(waiting_seconds)
                html          = requests.get(target_url)
                html.encoding = 'utf-8'
                soup          = BeautifulSoup(html.text, 'html.parser')
                atags         = soup.find_all('a')

                for l in atags:
                    m = l['href']
                    n = '^/ja/i/'
                    o = re.match( n, m )
                    if o:
                        target_urls.append([i, j, m, 'z'])
                    else:
                        None
    return

def update_details_in_target_urls():
    base_image_url = 'https://search.find47.jp/ja/images/'
    for i in target_urls:

        for j in image_sizes:
            time.sleep(waiting_seconds)
            image_url = base_image_url + str(i[2][-5:]) + '/download/' + j
            image_link = requests.get(image_url)

            if image_link.status_code == 200:
                target_urls[target_urls.index(i)][2] = str(i[2][-5:])
                target_urls[target_urls.index(i)][3] = j
                break
    return

def write_out_to_csv_file():
    with open('./txt/01.csv', mode = 'w', encoding = 'utf-8') as f:
        for i in target_urls:
            writer = csv.writer(f)
            writer.writerow(i)
    f.close()
    return

# main routine
## generate target urls list as a text file with info in a simple format.

### stage 01
print('stage 01/03 started.')
generate_target_urls()
print('stage 01 completed.')

### stage 02
print('stage 02/03 started.')
update_details_in_target_urls()
print('stage 02 completed.')

### stage 03
print('stage 03/03 started.')
write_out_to_csv_file()
print('stage 03/03 completed.')
print('All operations of 01_generate_urls.py completed.')

# end of this script

Code (2)

Enregistrez-le sous le nom de fichier 47_finder.sh directement dans le dossier approprié créé (par exemple / home / nekoneko / codes / python / find47). De plus, chmod + x.

#!/bin/bash
cd /home/nekoneko/codes/python/find47

python3 ./01_generate_urls.py > ./txt/01.log 2>&1
#python3 ./02_download_jpgs.py > ./txt/02.log 2>&1

Courir

Il est recommandé de le mettre dans cron. Le fichier journal est ./txt/01.log. Il peut être confirmé que toutes les images 1080 sont dans 8 zones (de Hokkaido à Kyushu Okinawa). image.png

Exemple d'exécution

Bien que ce soit un peu différent, le fichier est créé en tant que ./txt/01.csv dans le format suivant (l'écran est en cours de développement). image.png

Temps estimé requis

La création de cette liste prend environ 10 heures. La prochaine acquisition d'image prendra également environ 10 heures.

Ce résumé

Cet article présente la procédure d'acquisition de belles images de paysages de 47 préfectures du pays en utilisant Python à partir du merveilleux site find / 47. Parmi ceux-ci, cette fois, j'ai expliqué jusqu'au point où l'URL cible est sortie dans un fichier texte avec du code. Dans le prochain article, nous obtiendrons des images basées sur la liste obtenue cette fois.

Recommended Posts

Obtenez des images d'excellentes trouvailles / 47 sites en utilisant Python (1/2: Jusqu'à la création de la liste cible)
Obtenez des images de sites intéressants / 47 à l'aide de Python (Partie 2/2: liste des cibles publiées par github)
[python] Obtenir une liste de variables d'instance
[Python] Obtenir une liste de dossiers uniquement
Débarrassez-vous des images DICOM en Python
Téléchargement anonyme d'images à l'aide de l'API Imgur (à l'aide de Python)
Liste d'exemples de sites de distribution de programmes pour les livres Python
[python] Récupère la liste des classes définies dans le module
Essayez de projeter la conversion d'image en utilisant OpenCV avec Python
[Python] Utilisation de l'API Line [1ère création de Beauty Bot]
[Python] Obtenir la liste des noms ExifTags de la bibliothèque Pillow
[Python] Résumé de la méthode de création de table utilisant DataFrame (pandas)
Python: obtenir une liste de méthodes pour un objet
Liste des modules python
La chose semblable à une recherche de liste en Python
Obtenez le nombre d'éléments spécifiques dans la liste python
Obtenez une liste des livres électroniques DMM achetés avec Python + Selenium
Discord's Python 1.5 ou version ultérieure, je ne parviens pas à obtenir la liste des membres
Obtenir l'index de la nième valeur la plus grande / la plus petite de la liste en Python
Comment obtenir une liste d'exceptions intégrées pour python
Liste des bibliothèques à installer lors de l'installation de Python à l'aide de Pyenv
Obtenir l'index de la nième valeur la plus grande / la plus petite de la liste en Python
[Python3] Liste des sites auxquels j'ai fait référence lorsque j'ai lancé Python
Enregistrer des images à l'aide de requêtes python3
Résumé des opérations de liste Python3
Liste des images Docker personnalisées
python: principes de base de l'utilisation de scikit-learn ①
[Python] Copie d'une liste multidimensionnelle
Accélérer le chargement des images Python
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
Essayez d'obtenir la liste des fils du bulletin d'information (je n'aime pas) avec Python.
[python] Obtenez le rang des valeurs dans la liste par ordre croissant / décroissant
Alignement d'images numérisées de papier vidéo animé à l'aide d'OpenCV et de Python
Obtenez et définissez la valeur du menu déroulant en utilisant Python et Selenium
Obtenez une liste de fichiers dans un dossier avec python sans chemin