スクレイピング または Web スクレイピング は、Web サイトから自動化された方法でデータを抽出するために使用される技術です。これは、プログラムまたはスクリプトを使用して Web ページを移動し、特定の情報 (テキスト、画像、製品価格など) を抽出して保存することで構成されます。
この投稿では、スクレイピングを行うプロセスと、その際に留意すべき重要なポイントについて説明します。
私の場合は、PcComponentes で スクレイピング を実行してラップトップに関する情報を収集します。このデータは、指定されたコンポーネントに基づいてラップトップの価格を予測するように設計された機械学習モデルの基礎として機能するデータセットを作成するために使用されます。
まず、スクレイピングを実行するためにスクリプトがアクセスする必要がある URL を特定する必要があります:
この場合、PcComponentes URL を見ると、URL を通じてパラメーターが渡されていることがわかります。これを使用して、検索対象を指定できます。
これが完了すると、検索結果が表示されます:
この後、ほぼすべてのブラウザに統合されている開発者ツールを使用します。
右クリックして「検査」オプションを選択すると、開発者ツールが開き、次の内容が表示されます:
タイプ アンカー () のタグ。検索結果に表示される商品に関する多くの情報が含まれます。
次の領域を見ると、実質的にすべての製品データが表示されます:
完了!データを抽出する領域があります。次に、それらを抽出するスクリプトを作成します。
しかし、問題が発生しました。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 サイトの他の関連記事を参照してください。