Как обратиться к данным из csv таблицы?

Привет, подскажите пожалуйста
1) Парсер заходит в каталог сайта, выгружает все урлы карточек товара, записывает в csv файл. В таблице просто список урлов - с этим я справился
2) Затем парсер должен эти урлы подставлять по очереди в функцию def url(): - не понимаю, как обратиться к данным из csv таблицы, то есть как сделать так, чтобы каждый урл из таблицы поставлялся туда (надеюсь понятно объяснил)
Подскажите пожалуйста

import requests
from bs4 import BeautifulSoup
import csv

def get_html(url):
    r = requests.get(url)
    if r.ok:
           return r.text
    print(r.status_code)

def write_csv(data):
    with open('urls.csv', 'a', newline='') as f:
        writer = csv.writer(f)

        writer.writerow([data['url']])

def read_csv(data):
    with open('urls.csv', encoding='utf-8') as file:
        reader = csv.reader(file)
        data = list(reader)
        return data


def get_data(html): #получаем данные со страницы
    soup = BeautifulSoup(html, 'lxml') #
    items = soup.find_all('div', class_='catalog-item')
    for item in items:
        try:
            url = 'https://a-dubrava.ru' + item.find('a', class_='catalog-item__link').get('href')
        except:
            url = ''

        data = {'url': url}
        write_csv(data)

# вычленить со страниц ссылки на фотки


def main():
    pattern = 'https://a-dubrava.ru/katalog/khvoynye-rasteniya-s/?PAGEN_1={}'

    for i in range(0, 9): # создаём рейндж перебор с 0 до 9
        url = pattern.format(str(i)) # подставляем цифру в урл в {}
        get_data(get_html(url))

def url():
    url = 'https://a-dubrava.ru/****' # сюда надо подставить урлы по одному из файла csv
    get_page_data(get_html(url))



if __name__ == '__main__':
    main()
  • Вопрос задан
  • 239 просмотров
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
Первое я почти все оставлю как у вас что бы вашу логику не нарушать, внесу небольшие изменения.
def read_csv(filename):   #зачем у вас в оригинале параметр data если вы его не используете логичнее передавать имя файла.
    with open(filename, encoding='utf-8') as file:
        reader = csv.reader(file)
        data = list(reader)
        return data

далее используем вашу функцию для чтения получаем вложенный список в ответ, а нам он не нужен вложенный нам обычный нужен по этому распрямляем его.
data = read_csv('urls.csv')
flat_list = [item for sublist in data for item in sublist]


далее по все видимости вы собираетесь использовать эти ссылки для парсинга
пишете функцию которая будет парсить проходитесь циклом по списку flat_list и передаете в функцию по одной ссылке и все. Ваша функция будет принимать параметр url, затем делать request, затем beatifulsoup будет парситьи отдавать результат. Сделайте функцию которая делает это все для одного url, потом циклом по списку внутри цикла вызывайте функцию с параметром url.

А теперь общие соображения.
Зачем csv? когда читаешь csv он возвращает список под каждую строку, с обычного txt, мы бы этого избежали, я бы использовал бы вообще для записи json. Где ключом было бы название товара, а значением ссылка. Потому что если что не будет работать, то будет известно какой товар не удается спарсить.

Нужно создавать log file и писать туда что отдал сервер при запросе и туда же писать различные исключения а то потом ума не дашь где ошибка.

В коде много лишнего, параметр data в обоих случаях нужно заменить на filename. И много других погрешностей.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы