[PYTHON] Gratter les images des membres du site officiel du groupe Sakamichi

Cible

De cette façon, enregistrez le fichier image (chemin de l'image) avec le nom nom du membre.jpg.
* Cette fois, la destination de sauvegarde est cloudinary. Lorsque vous l'exécutez, veuillez modifier un stockage ou une destination de sauvegarde locale.

image

Code final

Le code html de chaque HP officiel étant différent, le code est légèrement différent.

Nogizaka

get_ng_images.py


from bs4 import BeautifulSoup
import urllib
import cloudinary
import cloudinary.uploader

import os

cloudinary.config(
  cloud_name = os.environ.get("cloud_name"),
  api_key = os.environ.get("api_key"),
  api_secret = os.environ.get("api_secret")
)

def get_mem_list():
  url = "http://www.nogizaka46.com/member/"
  headers = {
          "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
          }

  request = urllib.request.Request(url, headers=headers)
  html = urllib.request.urlopen(request)

  soup = BeautifulSoup(html, 'html.parser')

  li = soup.select('#memberlist div[class="clearfix"] a')
  li = [url + str(l.attrs['href'])[2:] for l in li]

  return li

def get_img(url):

  headers = {
          "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
          }

  request = urllib.request.Request(url=url, headers=headers)
  html = urllib.request.urlopen(request)

  soup = BeautifulSoup(html, 'html.parser')

  img = soup.select('#profile img')[0].attrs['src']
  name = str(soup.select('#profile div[class="txt"] h2')[0].contents[1]).replace(' ', '')

  res = cloudinary.uploader.upload(file=img, public_id="q-u46/member-images/"+name)

  return 'finished {} !!'.format(name)

def main():
  list_ = get_mem_list()

  for url in list_:
    print(get_img(url), end=' | ')

if __name__ == "__main__":
  main()

Keyakizaka

get_keya_images.py


from bs4 import BeautifulSoup
import urllib
import cloudinary
import cloudinary.uploader

import os

cloudinary.config(
  cloud_name = os.environ.get("cloud_name"),
  api_key = os.environ.get("api_key"),
  api_secret = os.environ.get("api_secret")
)

def get_mem_list():
  url = "https://www.keyakizaka46.com/s/k46o/search/artist?ima=0000"
  base = "https://www.keyakizaka46.com"
  headers = {
          "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
          }

  request = urllib.request.Request(url, headers=headers)
  html = urllib.request.urlopen(request)

  soup = BeautifulSoup(html, 'html.parser')

  li = soup.select('div[class="sorted sort-default current"] li a')
  li = list(set([base + str(l.attrs['href']) for l in li]))

  return li

def get_img(url):

  headers = {
          "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
          }

  request = urllib.request.Request(url=url, headers=headers)
  html = urllib.request.urlopen(request)

  soup = BeautifulSoup(html, 'html.parser')

  img = soup.select('div[class="box-profile_img"] img')[0].attrs['src']
  name = str(soup.select('div[class="box-profile_text"] p[class="name"]')[0].text).replace(' ', '')

  res = cloudinary.uploader.upload(file=img, public_id='q-u46/member-images/'+''.join(name.splitlines()))

  return 'finished {} !!'.format(name)

def main():
  list_ = get_mem_list()

  for url in list_:
    
    print(get_img(url), end=' | ')

if __name__ == "__main__":
  main()

Hinatazaka

get_hina_images.py


from bs4 import BeautifulSoup
import urllib
import cloudinary
import cloudinary.uploader

import os

cloudinary.config(
  cloud_name = os.environ.get("cloud_name"),
  api_key = os.environ.get("api_key"),
  api_secret = os.environ.get("api_secret")
)

def get_mem_list():
  url = "https://www.hinatazaka46.com/s/official/search/artist?ima=0000"
  base = "https://www.hinatazaka46.com"
  headers = {
          "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
          }

  request = urllib.request.Request(url, headers=headers)
  html = urllib.request.urlopen(request)

  soup = BeautifulSoup(html, 'html.parser')

  li = soup.select('ul[class="p-member__list"] li[class="p-member__item"] a')
  li = list(set([base + str(l.attrs['href']) for l in li]))

  return li

def get_img(url):

  headers = {
          "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
          }

  request = urllib.request.Request(url=url, headers=headers)
  html = urllib.request.urlopen(request)

  soup = BeautifulSoup(html, 'html.parser')

  img = soup.select('div[class="c-member__thumb c-member__thumb__large"] img')[0].attrs['src']
  name = str(soup.select('div[class="p-member__info"] div[class="p-member__info__head"] div[class="c-member__name--info"]')[0].text).replace(' ', '')
  #print(img)

  res = cloudinary.uploader.upload(file=img, public_id='q-u46/member-images/'+''.join(name.splitlines()))

  return 'finished {} !!'.format(name)

def main():
  list_ = get_mem_list()

  for url in list_:
    
    print(get_img(url), end=' | ')

if __name__ == "__main__":
  main()

Description du code

J'expliquerai principalement le code de Nogizaka.

Préparation

Les éléments marqués d'une étoile sont obligatoires pour effectuer uniquement un grattage. À part cela, c'est pour enregistrer dans le stockage, alors ignorez-le.

from bs4 import BeautifulSoup #☆
import urllib #☆
import cloudinary
import cloudinary.uploader

import os

cloudinary.config(
  cloud_name = os.environ.get("cloud_name"),
  api_key = os.environ.get("api_key"),
  api_secret = os.environ.get("api_secret")
)

Liste des liens vers les pages de détails des membres

Obtenez tous les liens vers la page de détails à partir de l'introduction aux membres.

image

Tout d'abord, jetons un coup d'œil au html de l'introduction aux membres Top.

image

Vous pouvez voir que l'élément enfant de la balise <div id =" memberlist "class =" left "> est susceptible de contenir le lien d'image souhaité.

Et il y a trois balises d'élément enfant <div class =" clearfix "> en parallèle. Le premier était un bloc avec tous les membres autres que la 4e génération, le second était vide et le troisième était le bloc de 4e génération.

Par conséquent, limitez-vous à # memberlist`` div [class =" clearfix "].

Ensuite, jetez un œil aux éléments enfants de <div class =" clearfix ">.

Comme indiqué ci-dessous, il y a une balise <div class =" unit "> pour chaque membre, et le chemin relatif est écrit dans la balise a.

image

Par conséquent, il semble que vous puissiez obtenir une balise pour les membres avec # memberlist`` div [class =" clearfix "] a.

def get_mem_list():
  url = "http://www.nogizaka46.com/member/"
  #Si vous ne spécifiez pas ce qui suit dans les en-têtes, une erreur se produira, alors ajoutez-la.
  headers = {
          "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
          }

  request = urllib.request.Request(url, headers=headers)
  html = urllib.request.urlopen(request)

  soup = BeautifulSoup(html, 'html.parser')

  #Obtenez une liste des éléments qui répondent aux critères.
  li = soup.select('#memberlist div[class="clearfix"] a')

  #Le premier des chemins relatifs'./'Régler, .Vous pouvez obtenir les attributs de la balise avec attrs.
  li = [url + str(l.attrs['href'])[2:] for l in li]

  return li

Obtenir l'image et le nom

image

Il semble que vous puissiez l'obtenir avec la balise ʻimgdans la balise

`.

image

img = soup.select('#profile img')[0].attrs['src']

Il s'est avéré être quelque chose comme ça. Puisque le type de liste est retourné par soup.select, il est extrait avec [0].

Nom

Vous pouvez voir qu'il s'agit d'un élément de <div class =" txt "> <h2> dans la balise <div id =" profile ">.

image

Le but de cette fois est d'obtenir le nom de l'affichage kanji, donc j'aimerais faire de mon mieux pour ignorer Shiraishimai.

Utilisez donc la balise «h2 .contents [1]». Vous obtiendrez une liste comme [<span> Shiraishi Mai </ span>," Mai Shiraishi "], alors spécifiez [1] et obtenez seulement ceux en affichage Kanji.

Je veux aussi supprimer l'espace entre le prénom et le nom, je vais donc le supprimer avec replace.


#L'argument est la page de détails du membre
def get_img(url):

  headers = {
          "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
          }

  request = urllib.request.Request(url=url, headers=headers)
  html = urllib.request.urlopen(request)

  soup = BeautifulSoup(html, 'html.parser')

  img = soup.select('#profile img')[0].attrs['src']
  name = str(soup.select('#profile div[class="txt"] h2')[0].contents[1]).replace(' ', '')

  #Les éléments suivants dépendent de la destination de sauvegarde.
  res = cloudinary.uploader.upload(file=img, public_id="q-u46/member-images/"+name)

  return 'finished {} !!'.format(name)

Traitement principal

def main():
  #Liste des liens vers les pages de détails des membres
  list_ = get_mem_list()
  #Traitement en boucle de la fonction d'acquisition d'image avec instruction for
  for url in list_:
    print(get_img(url), end=' | ')

if __name__ == "__main__":
  main()

Keyakizaka et Hinatazaka

Le sélecteur est un peu différent, mais la méthode de base est la même que Nogizaka.

Pour une raison quelconque, j'ai eu les sauts de ligne lorsque j'ai obtenu le nom et j'ai eu une erreur lors de la dénomination du fichier. J'ai donc ignoré les sauts de ligne dans `` ''. Join (name.splitlines ()) `. (Listez et rejoignez, ce qui est une manière sale, mais pardonnez-moi s'il vous plaît mm)

en conclusion

Le grattage est très pratique, alors utilisons-le!

  • Cette fois, nous n'avons demandé que des membres, nous avons donc omis time.sleep. Lorsque vous envoyez un grand nombre de requêtes, assurez-vous de "time.sleep".

Recommended Posts

Gratter les images des membres du site officiel du groupe Sakamichi
Grattage du résultat de "Schedule-kun"
Grattage immédiat des images google!
Scraping du site officiel GoToEat de Shizuoka
[Python] Pratique Belle Soupe ~ Grattage du tableau des cotes triple simple sur le site officiel de la course de bateaux ~
Etudier le web scraping dans le but d'extraire des données de Filmarks # 2
J'ai vérifié l'état d'utilisation du parking à partir d'images satellite.
Existence du point de vue de Python
Identifiez la chaîne YouTube de la vidéo Hikakin à partir d'images miniatures à l'aide de CNN
Scraping avec Python - Obtenir le prix de base d'une fiducie d'investissement de Yahoo! Finance
Gratter l'historique d'utilisation du cycle communautaire
Omettre la nomenclature depuis le début de la chaîne
Notes d'apprentissage depuis le début de Python 2
[Python] J'ai essayé de juger l'image du membre du groupe d'idols en utilisant Keras
Scraping du site officiel GoToEat de Shizuoka et liste des magasins ciblés pour la campagne Izu