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.
Le code html de chaque HP officiel étant différent, le code est légèrement différent.
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()
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()
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()
J'expliquerai principalement le code de Nogizaka.
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")
)
Obtenez tous les liens vers la page de détails à partir de l'introduction aux membres.
Tout d'abord, jetons un coup d'œil au html de l'introduction aux membres Top.
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.
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
Il semble que vous puissiez l'obtenir avec la balise ʻimgdans la balise
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].
Vous pouvez voir qu'il s'agit d'un élément de <div class =" txt ">
<h2>
dans la balise <div id =" profile ">
.
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)
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()
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)
Le grattage est très pratique, alors utilisons-le!
time.sleep
.
Lorsque vous envoyez un grand nombre de requêtes, assurez-vous de "time.sleep".Recommended Posts