[PYTHON] Scraping Mitgliederbilder von der offiziellen Website der Sakamichi Group

Ziel

Speichern Sie auf diese Weise die Bilddatei (Bildpfad) unter dem Namen member name.jpg.
* Dieses Mal ist das Speicherziel cloudinary. Wenn Sie es ausführen, ändern Sie bitte einen Speicher oder ein lokales Speicherziel.

image

Endgültiger Code

Da das HTML jedes offiziellen HP unterschiedlich war, unterscheidet sich der Code geringfügig.

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()

Codebeschreibung

Ich werde hauptsächlich den Code von Nogizaka erklären.

Vorbereitung

Gegenstände mit einem Stern sind erforderlich, wenn nur Schaben durchgeführt wird. Abgesehen davon dient es zum Speichern im Speicher, ignorieren Sie es also.

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")
)

Listen Sie Links zu Mitgliederdetailseiten auf

Alle Links zur Detailseite finden Sie in der Mitgliedereinführung oben.

image

Schauen wir uns zunächst das HTML der Mitgliedereinführung Top an.

image

Sie können sehen, dass das untergeordnete Element des Tags "<div id =" memberlist "class =" left ">" wahrscheinlich den gewünschten Bildlink enthält.

Und es gibt drei untergeordnete Element-Tags "

" parallel. Der erste war ein Block mit allen Mitgliedern außer der 4. Generation, der zweite war leer und der dritte war der Block der 4. Generation.

Grenzen Sie daher durch # memberlist`` div [class =" clearfix "] ein.

Schauen Sie sich als nächstes die untergeordneten Elemente von <div class =" clearfix "> an.

Wie unten gezeigt, gibt es für jedes Mitglied ein "

" - Tag, und der relative Pfad wird in das a-Tag darin geschrieben.

image

Daher scheint es, dass Sie ein Tag für Mitglieder mit # memberlist`` div [class =" clearfix "] a erhalten können.

def get_mem_list():
  url = "http://www.nogizaka46.com/member/"
  #Wenn Sie in den Kopfzeilen nicht Folgendes angeben, tritt ein Fehler auf. Fügen Sie ihn daher hinzu.
  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')

  #Holen Sie sich eine Liste der Elemente, die die Kriterien erfüllen.
  li = soup.select('#memberlist div[class="clearfix"] a')

  #Der erste der relativen Pfade'./'Einstellen, .Sie können die Attribute im Tag mit attrs abrufen.
  li = [url + str(l.attrs['href'])[2:] for l in li]

  return li

Holen Sie sich Bild und Name

Bild

Es scheint, dass Sie es mit dem Tag "img" innerhalb des Tags "

" erhalten können.

image

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

Es stellte sich heraus, dass es so etwas war. Da der Listentyp vonoup.select zurückgegeben wird, wird er mit [0] extrahiert.

Name

Sie können sehen, dass es sich um ein Element von

<h2> im Tag
`handelt.

image

Der Zweck dieser Zeit ist es, den Namen der Kanji-Anzeige zu erhalten, daher möchte ich mein Bestes geben, um "Shiraishimai" zu ignorieren.

Verwenden Sie also das h2-Tag .contents [1]. Sie erhalten eine Liste wie "[ Shiraishi Mai </ span>", "Mai Shiraishi"]. Geben Sie also [1] an und erhalten Sie nur die in der Kanji-Anzeige.

Ich möchte auch das Leerzeichen zwischen dem Vor- und Nachnamen entfernen, also werde ich es mit "Ersetzen" entfernen.


#Das Argument ist die Mitgliederdetailseite
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(' ', '')

  #Folgendes hängt vom Speicherziel ab.
  res = cloudinary.uploader.upload(file=img, public_id="q-u46/member-images/"+name)

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

Hauptverarbeitung

def main():
  #Listen Sie Links zu Mitgliederdetailseiten auf
  list_ = get_mem_list()
  #Schleifenverarbeitung der Bildaufnahmefunktion mit for-Anweisung
  for url in list_:
    print(get_img(url), end=' | ')

if __name__ == "__main__":
  main()

Keyakizaka und Hinatazaka

Der Selektor ist etwas anders, aber die grundlegende Methode ist dieselbe wie bei Nogizaka.

Aus irgendeinem Grund bekam ich die Zeilenumbrüche, als ich den Namen bekam, und ich bekam einen Fehler beim Benennen der Datei. Also habe ich die Zeilenumbrüche in '' ignoriert. Join (name.splitlines ()). (Liste und mach mit, was ein schmutziger Weg ist, aber bitte vergib mir mm)

abschließend

Das Schaben ist sehr praktisch, also lasst es uns benutzen!

  • Dieses Mal haben wir nur Mitglieder angefordert, daher haben wir "time.sleep" weggelassen. Achten Sie beim Senden einer großen Anzahl von Anfragen auf "time.sleep".

Recommended Posts