Для l oop не работает, когда веб-просмотр нескольких URL-адресов. Только очищает один URL - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь очистить несколько веб-сайтов для различных типов продуктов. Я был в состоянии очистить один URL. Я создал список для веб-очистки нескольких URL-адресов, а затем экспортировал название продукта и цену в файл CVL. Однако он не работает должным образом.

Ниже приведен мой код:

#imports
import pandas as pd
import requests
from bs4 import BeautifulSoup

#Product Websites For Consolidation
urls = ['https://www.aeroprecisionusa.com/ar15/lower-receivers/stripped-lowers?product_list_limit=all', 'https://www.aeroprecisionusa.com/ar15/lower-receivers/complete-lowers?product_list_limit=all']
for url in urls:
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"}
    page = requests.get(url, headers=headers)
    soup = BeautifulSoup(page.content, 'html.parser')


    #Locating All Products On Page
    all_products_on_page = soup.find(class_='products wrapper container grid products-grid')
    individual_items = all_products_on_page.find_all(class_='product-item-info')


    #Breaking Down Product By Name And Price
    aero_product_name = [item.find(class_='product-item-link').text for item in individual_items]
    aero_product_price = [p.text if (p := item.find(class_='price')) is not None else 'no price' for item in individual_items]


    Aero_Stripped_Lowers_Consolidated = pd.DataFrame(
        {'Aero Product': aero_product_name,
        'Prices': aero_product_price,
        })

    Aero_Stripped_Lowers_Consolidated.to_csv('MasterPriceTracker.csv')

Код экспортирует название продукта и цену по желанию в файл CVL, но только для второй URL, "полный-понижает" один. Я не уверен, что я испортил в For l oop, чтобы он не перебрал оба URL. Я подтвердил, что код HTML одинаков для обоих URL.

Любая помощь будет принята с благодарностью!

1 Ответ

3 голосов
/ 10 января 2020

Переместите вызов to_csv за пределы l oop. Поскольку он находился внутри l oop, он переписывал файл csv для каждой записи (следовательно, в файле была показана только последняя запись).

В пределах l oop добавьте словари к кадр данных, созданный до запуска l oop. Кроме того, нет необходимости переопределять headers каждый раз в l oop, поэтому я тоже вытащил их наружу.

import pandas as pd
import requests
from bs4 import BeautifulSoup

#Product Websites For Consolidation
urls = ['https://www.aeroprecisionusa.com/ar15/lower-receivers/stripped-lowers?product_list_limit=all', 'https://www.aeroprecisionusa.com/ar15/lower-receivers/complete-lowers?product_list_limit=all']

Aero_Stripped_Lowers_Consolidated = pd.DataFrame(columns=['Aero Product', 'Prices'])
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"}

for url in urls:
    page = requests.get(url, headers=headers)
    soup = BeautifulSoup(page.content, 'html.parser')


    #Locating All Products On Page
    all_products_on_page = soup.find(class_='products wrapper container grid products-grid')
    individual_items = all_products_on_page.find_all(class_='product-item-info')


    #Breaking Down Product By Name And Price
    aero_product_name = [item.find(class_='product-item-link').text for item in individual_items]
    aero_product_price = [p.text if (p := item.find(class_='price')) is not None else 'no price' for item in individual_items]


    Aero_Stripped_Lowers_Consolidated = Aero_Stripped_Lowers_Consolidated.append(pd.DataFrame(
        {'Aero Product': aero_product_name,
        'Prices': aero_product_price,
        }))

Aero_Stripped_Lowers_Consolidated.to_csv('MasterPriceTracker.csv')
...