削り方

WBOY
WBOYオリジナル
2024-08-16 18:01:13394ブラウズ

スクレイピング または Web スクレイピング は、Web サイトから自動化された方法でデータを抽出するために使用される技術です。これは、プログラムまたはスクリプトを使用して Web ページを移動し、特定の情報 (テキスト、画像、製品価格など) を抽出して保存することで構成されます。

この投稿では、スクレイピングを行うプロセスと、その際に留意すべき重要なポイントについて説明します。

私の場合は、PcComponentes で スクレイピング を実行してラップトップに関する情報を収集します。このデータは、指定されたコンポーネントに基づいてラップトップの価格を予測するように設計された機械学習モデルの基礎として機能するデータセットを作成するために使用されます。

まず、スクレイピングを実行するためにスクリプトがアクセスする必要がある URL を特定する必要があります:

Cómo hacer scrapping

この場合、PcComponentes URL を見ると、URL を通じてパラメーターが渡されていることがわかります。これを使用して、検索対象を指定できます。

これが完了すると、検索結果が表示されます:

Cómo hacer scrapping

この後、ほぼすべてのブラウザに統合されている開発者ツールを使用します。

Cómo hacer scrapping

右クリックして「検査」オプションを選択すると、開発者ツールが開き、次の内容が表示されます:

Cómo hacer scrapping

タイプ アンカー () のタグ。検索結果に表示される商品に関する多くの情報が含まれます。

次の領域を見ると、実質的にすべての製品データが表示されます:

Cómo hacer scrapping

完了!データを抽出する領域があります。次に、それらを抽出するスクリプトを作成します。

しかし、問題が発生しました。PcComponentes に直接アクセスすると、常に Cookie ポリシーを受け入れるように求められます。したがって、何も取得できないため、GET リクエストを作成して結果をスクレイピングすることはできません。

したがって、Selenium を使用してブラウザをシミュレートし、ブラウザと対話できるようにする必要があります。

まず次のことから始めます:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

options = Options()
options.headless = True
#Abrimos el navegador
driver = webdriver.Firefox(options=options)
time.sleep(5)
#Vamos a la página indicada pccomponentes.com/laptops
driver.get(url+str(i))
#Esperamos 30 segundos hasta que aparezca el botón de cookies y al aparecer hace clic
accept_cookies = WebDriverWait(driver, 30).until(
    EC.presence_of_element_located((By.ID, 'cookiesAcceptAll'))
)     
accept_cookies.click()
#Descargamos el HTML
html = driver.page_source

これが完了すると、スクレイピングするページの HTML コードを html 変数で取得します。

しかし、別の問題に遭遇しました。 Selenium でブラウザを開いて 2 つまたは 3 つのリクエストを行うと、Cloudflare はリクエストを制限し、それ以上のリクエストを行うことを許可しません。したがって、約 3 ページ、つまり約 20 台の異なるコンピュータに相当するページを スクレイピング することしかできませんでした。データセットを作成するには不十分です。

私が思いついた解決策の 1 つは、ページをローカルにダウンロードし、HTML をローカルで操作することでした。 スクレイピングを実行した後、別のブラウザを開いて (適切な時間待機して)、次のブラウザをダウンロードできます。

そこで、上記のコードを関数に追加し、次のように for でラップしました。

#Función que se conecta a pccomponentes y guarda el html en local 
def guarda_datos_html(i=0):
    try:
        options = Options()
        options.headless = True
        #Abrimos el navegador
        driver = webdriver.Firefox(options=options)

        time.sleep(5)
        #Vamos a la página indicada pccomponentes.com/laptops
        driver.get(url+str(i))
        #Esperamos 30 segundos hasta que aparezca el botón de cookies y al aparecer hace clic
        accept_cookies = WebDriverWait(driver, 30).until(
            EC.presence_of_element_located((By.ID, 'cookiesAcceptAll'))
        )

        accept_cookies.click()
        #Descargamos el HTML
        html = driver.page_source
        #Lo guardamos en local
        with open(f'html/laptops_{i}.html','w',encoding="utf-8") as document:
            document.write(html)

        driver.close()
    except:
        print(f'Error en página: {i}')

for i in range(0,58):
    guarda_datos_html(i)
    time.sleep(30)

これで、HTML を復元して操作できるようになります。これを行うために、BeautifulSoupをインストールしました。これは、スクレイピングでよく使用されるパッケージです。

前回の機能でダウンロードしたHTMLから情報を収集する機能を開発していきます。

関数は次のようになります:

# Función que abre el HTML guardado con anterioridad y filtra los datos
# para guardarlos en un CSV ordenados
def get_datos_html(i=0):
    try:
        with open(f'laptop_data_actual.csv','a') as ldata:

            field = ['Company','Inches','Cpu','Ram','Gpu','OpSys','SSD','Price']
            writer = csv.DictWriter(ldata, fieldnames=field)


            with open(f'html/laptops_{i}.html','r',encoding="utf-8") as document:

                html = BeautifulSoup(document.read(), 'html.parser')
                products = html.find_all('a')

                for element in products:
                    pc = element.get('data-product-name')
                    if pc:
                        pc = pc.lower()
                        marca = element.get('data-product-brand')
                        price = element.get('data-product-price')
                        pc_data = pc.split('/')
                        cpu = pc_data[0].split(' ')

                        cpu = buscar_cpu(cpu)
                        gpu = buscar_gpu(pc_data)
                        inches = '.'.join([s for s in re.findall(r'\b\d+\b', pc_data[-1])])
                        OpSys = bucar_opsys(pc_data, marca)

                        row = {
                            'Company': marca,
                            'Inches': inches,
                            'Cpu': cpu,
                            'Ram': pc_data[1],
                            'Gpu': gpu,
                            'OpSys': OpSys,
                            'SSD': pc_data[2],
                            'Price': price
                        }

                        writer.writerow(row)
    except:
        print(f'Error en página: {i}')

基本的には、情報を保存する CSV ファイルを開き、CSV にどのフィールドを含めるのかを指示し、HTML を読み取って操作します。ご覧のとおり、CSV に保存する各フィールドから必要な情報を抽出できるようにするには、いくつかの追加関数を実行する必要がありました。

試してみたい場合に備えて、完全なスクリプトをここに残しておきます!

PccomponentsScrapper

以上が削り方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。