L'édition définitive du grattage python! (Site cible: grande caméra)

Choses à faire

Utilisez python pour gratter le site Web de Big Camera.

Contexte de création

Je ne pense pas qu'il y ait eu de "bons articles de grattage" J'ai fait un code et une vidéo Youtube pour pratiquer en tant que Youtuber qui surpasse Hikakin.

Lien vidéo

[Lien] https://www.youtube.com/watch?v=SZuNFDzJndA&list=PLzPCqF-heFHyFb_aoqnXc8GrECL6yMdvZ

environnement

Compétences et environnement requis

La réaction que vous souhaitez obtenir à travers ce code

Précautions pour le grattage

Ce qui suit peut se produire, alors soyez prudent lorsque vous grattez à vos propres risques. Étui de la bibliothèque centrale d'Okazaki url : https://ja.wikipedia.org/wiki/%E5%B2%A1%E5%B4%8E%E5%B8%82%E7%AB%8B%E4%B8%AD%E5%A4%AE%E5%9B%B3%E6%9B%B8%E9%A4%A8%E4%BA%8B%E4%BB%B6

De plus, si l'interface utilisateur du site de la grande caméra est modifiée, il y a de fortes chances que cela ne fonctionne pas, donc Veuillez commenter si cela ne fonctionne pas. Peut être corrigé.

L'ensemble du code pour le moment

scraping_biccamera.py


from bs4 import BeautifulSoup as bs
from datetime import datetime
import pandas as pd
import requests
import urllib
import time
import re


def get_html(url):
    """
Une fonction qui renvoie un bel objet avec une URL
    """
    res = requests.get(url)
    return bs(res.content, "html.parser")


def next_url(res_bs):
    """
données html(res_bs)Une fonction qui renvoie url ou None sur la page suivante
    """
    domain = "https://www.biccamera.com/"
    for res in res_bs.findAll(class_="bcs_l"):
        if "Suivant" in res.text:
            if res.find("a"):
                next_url = domain + res.find("a").get("href")
                return next_url
    return None


def product_df(res_bs):
    """
Fonction pour obtenir DataFrame à partir de la grande caméra html
    """

    #Créer une liste vide
    output = []

    #Obtenir des informations sur la liste de produits à partir de HTML
    item_list = res_bs.findAll(class_=re.compile(r"prod_box sku*"))

    # item_Obtenez des informations sur les produits une par une à partir de la liste
    for num, item in enumerate(item_list):
        #Obtenir l'URL des détails du produit
        item_url = item.find(class_="cssopa").get("href")
        #Obtenir le titre du produit
        title = item.find(class_="cssopa").find("img").get("alt")
        #Acquisition de photos de produits
        picture = item.find(class_="cssopa").find("img").get("src")
        #Fabricant de produits acquis
        maker = item.find(class_="bcs_maker").text
        #Obtenez le prix du produit
        price = item.find(class_=re.compile(r"bcs_price*")).text
        #Obtenez des informations sur les points s'il y en a, obtenez 0 sinon
        if item.find(class_="bcs_point"):
            point = item.find(class_="bcs_point").text
        else:
            point = "0"
        #Obtenir s'il y a des informations d'inventaire, obtenir 0 sinon
        if item.find(class_=re.compile(r"label_*")):
            stock = item.find(class_=re.compile(r"label_*")).text
        else:
            stock = "0"
        #Obtenir s'il y a des informations sur le numéro d'évaluation, obtenir 0 sinon
        if item.find(class_="bcs_star"):
            ratings = item.find(class_="bcs_star").find("a").text
        else:
            ratings = "0"
        #Obtenez des informations sur la date de livraison si disponible, obtenez 0 sinon
        if item.find(class_="bcs_ship"):
            terms = item.find(class_="bcs_ship").text
        else:
            terms = "no ship info"
        #Sortie des informations pour chaque produit acquis ci-dessus(list)Ajouter à(ajouter à)Faire
        output.append({
            "item_url": item_url,
            "title": title,
            "picture": picture,
            "maker": maker,
            "price": price,
            "point": point,
            "stock": stock,
            "ratings": ratings,
            "terms": terms,
        })
    #Enregistrez toutes les informations dans la sortie et stockez la sortie dans le cadre de données pandas
    df = pd.DataFrame(output)
    return df


def get_product_list(url, pages=10):
    """
Après avoir entré l'URL cible, la transition de page,
Une fonction qui renvoie toutes les informations de la liste de produits sous forme de dataframe
    """

    #Créer un dataframe vide
    all_df = pd.DataFrame()

    for _ in range(pages):
        #Obtenez du code HTML à partir de l'URL saisie
        res_bs = get_html(url)

        #Obtenir le dataframe à partir du HTML
        df = product_df(res_bs)

        # all_ajouter le df créé ci-dessus à df(ajouter à)Faire
        all_df = all_df.append(df)

        # all_Imprimer le nombre de dfs et vérifier qu'ils sont ajoutés
        print("all_df:", len(all_df))
        print(f"sleeping.....{_}Temps")

        #Attendez 5 secondes pour éviter de surcharger l'autre site
        time.sleep(5)

        #URL de la page suivante ou aucune acquisition
        url = next_url(res_bs)

        #Si url est None, l'instruction for se termine
        if url is None:
            print("break")
            break
            return all_df
    return all_df


if __name__ == "__main__":
    #Définissez l'URL contenant les données que vous souhaitez récupérer
    url = "https://www.biccamera.com/bc/category/?q=laptop&rowPerPage=100#bcs_resultTxt"

    #Toutes les pages de transition et les données sont acquises
    df = get_product_list(url)

    #Obtenir des informations de recherche à partir de l'URL
    qs = urllib.parse.urlparse(url).query
    #Transformez les informations de recherche en dictionnaire
    kw = urllib.parse.parse_qs(qs)
    #Obtenir le mot de recherche
    query = kw.get("q")[0]

    #Enregistrez les données acquises au format csv
    today = datetime.today().strftime("%Y%m%d_%H%M%S")
    df.to_csv(f"{today}_biccamera_{query}", index=False)

    #En substituant une valeur numérique aux pages comme indiqué ci-dessous, le nombre de transitions de page peut être changé à 20 fois.
    # df = get_product_list(url, pages=20)

Impressions

Je n'expliquerai pas le code ci-dessus depuis le début, donc si vous êtes intéressé, veuillez regarder la vidéo.

En outre, la grande caméra a une difficulté de grattage légèrement plus élevée (en utilisant re.complile), C'est un bon matériel pédagogique, alors j'espère que vous comprendrez ce principe et que vous apprécierez votre vie de grattage.

En tant que youtubeur, je continuerai à prétraiter, enregistrer et visualiser les données, etc. Nous réaliserons "vivre par ce que vous aimez".

Recommended Posts

L'édition définitive du grattage python! (Site cible: grande caméra)
[Note] Exportez le html du site avec python.
Principes de base du grattage Python
le zen de Python
J'ai essayé de gratter la publicité du site de dessin animé piraté
python jupyter notebook championnat de prétraitement des données (site cible: grande caméra)
Entièrement traduit le site du "Guide de l'auto-stoppeur de Python"
[Python] Changeons l'URL du site administrateur de Django
Grattage du résultat de "Schedule-kun"
Vers la retraite de Python2
À propos des fonctionnalités de Python
Le pouvoir des pandas: Python
Grattez automatiquement le site reCAPTCHA tous les jours (1/7: construction de l'environnement python)
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
Obtenez les performances passées des coureurs du site de courses de chevaux de grattage Python
[Python] La pierre d'achoppement de l'importation
First Python 3 ~ Le début de la répétition ~
Tour de Hanoi-Rétrospective / Non-récursive (édition Python)
Existence du point de vue de Python
pyenv-changer la version python de virtualenv
[Python] Comprendre le potentiel_field_planning de Python Robotics
Revue des bases de Python (FizzBuzz)
Version pratique de l'automatisation des tests des applications Flutter avec Appium (Python)
À propos de la liste de base des bases de Python
[Python scraping] Affiche l'URL et le titre du site contenant un mot-clé spécifique dans un fichier texte
Apprenez les bases de Python ① Débutants élémentaires
Changer la longueur des chaînes csv Python
Passez le chemin du module python importé
Notes d'apprentissage depuis le début de Python 1
Gratter l'historique d'utilisation du cycle communautaire
Vérifier l'existence du fichier avec python
À propos de l'environnement virtuel de Python version 3.7
[Python3] Réécrire l'objet code de la fonction
Je ne connaissais pas les bases de Python
Le résultat de l'installation de python sur Anaconda
[Python] Essayez pydash de la version Python de lodash
[python] Vérifier la consommation de mémoire des variables
Vérifiez le chemin du module importé Python
L'histoire de la manipulation des variables globales Python
[python] [meta] Le type de python est-il un type?
Principes de base pour exécuter NoxPlayer en Python
Grattez automatiquement le site reCAPTCHA tous les jours (2/7: Scraping)
Pandas du débutant, par le débutant, pour le débutant [Python]
Le modèle de projet Python auquel je pense.
Scraping depuis un site authentifié avec python
J'ai essayé de gratter la météo Yahoo (édition Python)
À la recherche du FizzBuzz le plus rapide en Python
Cours de base Python (à la fin de 15)
Définissez le nom du processus du programme Python
[Python] Récupère le code de caractère du fichier
L'histoire du traitement A du blackjack (python)
Apprenez intuitivement la refonte de Python np
Note Python: le rôle secret de Kamma
Notes d'apprentissage depuis le début de Python 2
Traduction japonaise: PEP 20 - Le Zen de Python
[Python3] Comprendre les bases des opérations sur les fichiers
[Scraping] Scraping Python
Récupérer le contenu de git diff depuis python