:: Не фоксом единым
web data scraping
glaz58
Автор

Сообщений: 885
Откуда: Воронеж
Дата регистрации: 09.02.2008
Уважаемые знатоки! Может быть у кого-то есть позитивный опыт в использовании программ для web data scraping. Мне нужно скопировать в таблицу данные вот такого, например, сайта:
https://lider-vrn.ru/catalog/santekhnika/smesiteli-i-komplektuyushchie/
Ratings: 0 negative/0 positive
Re: web data scraping
chunihin-df

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
Не знаток, но посмотрел этот сайт, и похоже scrapy вполне хватит
Накидал пример для затравки

создать папку (любую)

создать в папке requirements.txt:
scrapy

запустить pip
pip install --upgrade -r ./requirements.txt

создать в папке main.py:
(это питон, а это значит, что отступы важны, но как их сохранить на форуме в режиме просмотра не знаю, поэтому прикрепил main.py к сообщению)
а, ну да, code...

import scrapy
class BlogSpider(scrapy.Spider):
name = 'lider-vrn'
start_urls = ['https://lider-vrn.ru/catalog/santekhnika/']
def parse(self, response):
for item_info in response.css('.item_info'):
yield {'title': item_info.css('.item-title').xpath('./a/span/text()').get()}
for next_page in response.css('a.flex-next'):
yield response.follow(next_page, self.parse)

запустить main.py:
python -m "scrapy" runspider main.py -O 123.json

Выходной файл не очень жирный, так что прикреплю его к сообщению



Исправлено 4 раз(а). Последнее : chunihin-df, 18.04.25 18:56
Ratings: 0 negative/1 positive
Re: web data scraping
glaz58
Автор

Сообщений: 885
Откуда: Воронеж
Дата регистрации: 09.02.2008
Можно ли сделать вывод лучше в xlsx или в csv? Архив main.py.zip повреждён или имеет неизвестный формат. 123.json.zip открылся. Может быть, его можно перевести в более удобный формат?



Исправлено 2 раз(а). Последнее : glaz58, 18.04.25 18:24
Ratings: 0 negative/0 positive
Re: web data scraping
chunihin-df

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
ясно, надо было чем-то другим сжимать.
Переделал.
Ratings: 0 negative/0 positive
Re: web data scraping
chunihin-df

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
а, про формат, ну, самое простое для начала это поменять расширение выходного файла
вот так
python -m "scrapy" runspider main.py -O 123.csv

Но зачем эти мучения? Чтобы в fox загрузить? Тогда наверное полезнее будет xml (тоже просто расширение поменять)
Что хотелось бы сказать: рекомендую самому попробовать, это не очень сложно, документация у этого фрейма не сложная для чтения. В принципе хватит знаний по xpath
Верю в то, что позитивный опыт можно получить своими собственными силами в данном случае.
Будут вопросы - пишите сюда, наверное многим тоже будет интересно.
Если первый вопрос: "откуда .item_info и ./a/span/text()", то ответ из devtools браузера, просто правой кнопкой нажимаете на объект (ссылку, текст, картинку) в браузере и выбираете "проверить" (в разных браузерах может чуть отличаться название, сейчас в edge, поэтому название оттуда и взял)



Исправлено 1 раз(а). Последнее : chunihin-df, 18.04.25 18:27
Ratings: 0 negative/1 positive
Re: web data scraping
glaz58
Автор

Сообщений: 885
Откуда: Воронеж
Дата регистрации: 09.02.2008
main.py.zip опять повреждён. Спасибо за внимание к моей теме. Надо же когда-то начинать. Мир Python невозможно охватить, а эта достаточно компактная тема, тем более, имеющая хороший прикладной эффект.
Ratings: 0 negative/0 positive
Re: web data scraping
chunihin-df

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
> main.py.zip поврежден
такие дела, что я прикрепил main.zip к новому сообщению, а тот файл main.py.zip я не переприклеплял (уж простите)

> Мир Python невозможно охватить, а эта достаточно компактная тема, тем более, имеющая хороший прикладной эффект.
Задавайте вопросы, наверное, многим будет интересно почитать/поучаствовать.
Ratings: 0 negative/1 positive
Re: web data scraping
glaz58
Автор

Сообщений: 885
Откуда: Воронеж
Дата регистрации: 09.02.2008
Пришлёте хороший main.py?
Ratings: 0 negative/0 positive
Re: web data scraping
dimag

Сообщений: 484
Откуда: Одинцово
Дата регистрации: 17.12.2002
Хороший main.py
import scrapy
import pandas as pd
import logging
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
class BlogSpider(scrapy.Spider):
name = 'lider-vrn'
start_urls = ['https://lider-vrn.ru/catalog/santekhnika/']
def __init__(self):
super().__init__()
self.products = []
logging.info("Инициализация паука для сбора данных")
def parse(self, response):
try:
for item_info in response.css('.item_info'):
title = item_info.css('.item-title').xpath('./a/span/text()').get()
if title:
self.products.append({'Название': title.strip()})
next_page = response.css('a.flex-next::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
except Exception as e:
logging.error(f"Ошибка при парсинге: {str(e)}")
def closed(self, reason):
try:
df = pd.DataFrame(self.products)
if not df.empty:
df.to_excel('lider_vrn_products.xlsx', index=False)
logging.info(f"Успешно сохранено {len(df)} товаров в lider_vrn_products.xlsx")
else:
logging.warning("Не найдено данных для сохранения")
except Exception as e:
logging.error(f"Ошибка при сохранении в Excel: {str(e)}")
def main():
# Настройка логирования
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# Конфигурация Scrapy
settings = get_project_settings()
settings.update({
'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'LOG_LEVEL': 'INFO',
'FEED_EXPORT_ENCODING': 'utf-8',
'ROBOTSTXT_OBEY': False,
'DOWNLOAD_DELAY': 1,
})
process = CrawlerProcess(settings)
process.crawl(BlogSpider)
process.start()
if __name__ == '__main__':
main()

requirements.txt
scrapy>=2.12.0
pandas>=2.2.3
openpyxl>=3.1.5

Результат работы: Успешно сохранено 1020 товаров в lider_vrn_products.xlsx


------------------
Never judge a book by its cover.




Исправлено 4 раз(а). Последнее : dimag, 19.04.25 19:51
Ratings: 0 negative/3 positive
Re: web data scraping
sphinx

Сообщений: 32802
Откуда: Екатеринбург
Дата регистрации: 22.11.2006



------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: web data scraping
alex;

Сообщений: 4085
Откуда: Москва
Дата регистрации: 23.11.2004
Интересное.
Если ставить Python через MS Store, то ставиться правильно
в c:\Program Files\WindowsApps\PythonSoftwareFoundation.Python...
а в c:\Users\User\AppData\Local\Microsoft\WindowsApps\ создается символьная ссылка.

З.Ы. Остается вопрос как выбрать x64 и x32.

З.Ы.2.
Цитата:
В пакетном менеджере WinGet (Windows Package Manager) для указания разрядности приложения используется ключ -a, --architecture. Доступными являются значения: X86 и X64.
winget search Python
winget install Python.Python.3.13 --architecture x86

Но ставит по-умолчанию в c:\Users\User\AppData\Local\Programs\Python\Python313-32\



Исправлено 7 раз(а). Последнее : alex;, 20.04.25 14:06
Ratings: 0 negative/0 positive
Re: web data scraping
glaz58
Автор

Сообщений: 885
Откуда: Воронеж
Дата регистрации: 09.02.2008
Спасибо, буду разбираться. Вероятно, будут сложности при разных структурах исходных сайтов. Какую посоветуете среду выполнения? Можно ли запускать в colab?
Что делать с файлом requirements.txt?



Исправлено 3 раз(а). Последнее : glaz58, 20.04.25 16:46
Ratings: 0 negative/0 positive
Re: web data scraping
chunihin-df

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
glaz58
Какую посоветуете среду выполнения?
Сложно в данном случае что-то советовать, да хоть с личного компьютера можно запускать )

В colab работает, чего бы не работать
В блокноте можно сразу запустить установку scrapy
pip install scrapy
да и все
потом уже разбирать сайт

import scrapy
from scrapy.crawler import CrawlerProcess
class LiderVrnSpider(scrapy.Spider):
name = 'lider-vrn'
start_urls = ['https://lider-vrn.ru/catalog/']
def parse(self, response):
for cat_item in response.css('.catalog_section_list').css('.item_block').css('a.thumb'):
yield response.follow(cat_item, self.cat_item_parse)
def cat_item_parse(self, response):
price_trans = str.maketrans({',': '.', ' ': ''})
for item_info in response.css('.item_info'):
yield {
'title': item_info.css('.item-title').xpath('./a/span/text()').get(),
'price': item_info.css('.price_value::text').get().translate(price_trans)
}
for next_page in response.css('a.flex-next'):
yield response.follow(next_page, self.cat_item_parse)
process = CrawlerProcess(
settings={
"FEEDS": {
"123.xml": {"format": "xml"},
},
}
)
process.crawl(LiderVrnSpider)
process.start()
Ratings: 0 negative/0 positive
Re: web data scraping
glaz58
Автор

Сообщений: 885
Откуда: Воронеж
Дата регистрации: 09.02.2008
Отработало в colab без ошибок за 1m 7 s. Но где там искать выходной файл "lider_vrn_products.xlsx"? Как программа определяет, чтобы сайт находился в табличном режиме? На гугл-диске только ноутбуки, никаких файлов там нет. Нашёл в colab есть символ папки, там сохраняется. Скачал файл, но в нём 1 столбец "название", а цен нет.



Исправлено 3 раз(а). Последнее : glaz58, 20.04.25 18:55
Ratings: 0 negative/0 positive
Re: web data scraping
chunihin-df

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
цену вот так можно достать
item_info.css('.price_value::text').get()
Ratings: 0 negative/0 positive
Re: web data scraping
glaz58
Автор

Сообщений: 885
Откуда: Воронеж
Дата регистрации: 09.02.2008
эту строку вставить после вот этой:
title = item_info.css('.item-title').xpath('./a/span/text()').get()
?
вот в таком виде:
price = item_info.css('.price_value::text').get()



Исправлено 1 раз(а). Последнее : glaz58, 20.04.25 19:27
Ratings: 0 negative/0 positive
Re: web data scraping
chunihin-df

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
ну да
price = item_info.css('.price_value::text').get()
дальше еще по тексту у dimag добавляется запись в products, туда тоже надо цену пробросить по аналогии с названием
Ratings: 0 negative/0 positive
Re: web data scraping
glaz58
Автор

Сообщений: 885
Откуда: Воронеж
Дата регистрации: 09.02.2008
if title:
self.products.append({'Название': title.strip()})
После этих строк добавить
self.products.append({'Цена': title.strip()})
?
Ratings: 0 negative/0 positive
Re: web data scraping
chunihin-df

Сообщений: 151
Откуда: Тюмень
Дата регистрации: 18.11.2013
не совсем, dimag так проверку сделал, что сейчас с телефона неудобно вносить изменения, в общем пусть так

if title:
self.products.append({'Название': title.strip(), 'Цена': price.replace(' ', '')})
Ratings: 0 negative/0 positive
Re: web data scraping
dimag

Сообщений: 484
Откуда: Одинцово
Дата регистрации: 17.12.2002
Как нужно устанавливать python в 2025 году:

Документация: https://docs.astral.sh/uv/#highlights

Установка uv на Windows:
# On Windows.
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Далее вы можете устанавливать любую доступую версию python индивидуально (powershell):

Просмотр доступных версий:
uv python list

Например у вас есть script311.py который работает на python 3.11 и Например у вас есть script313.py который работает на python 3.13

Скрипт script311.py будет запускаться из D:\script311
cd D:\script311
uv python install 3.11
# Создадим виртуалное окружение для скрипта
uv venv
# Установим зависимости
uv pip install -r requirements.txt
# Активируем окружение
.venv\Scripts\activate
# Запускаем скрипт под версией python 3.11
python script311.py

Скрипт script313.py будет запускаться из D:\script313

Устанавливаем python 3.13 аналогично через uv, просто заменив версию по аналогии выше


------------------
Never judge a book by its cover.




Исправлено 1 раз(а). Последнее : dimag, 20.04.25 20:33
Ratings: 0 negative/1 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 9 alex;  (Гостей: 8)

© 2000-2025 Fox Club 
Яндекс.Метрика