Форум программистов, компьютерный форум, киберфорум
Python: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 10.09.2020
Сообщений: 11

Scrapy возврат значения

20.06.2021, 20:51. Показов 1350. Ответов 3

Студворк — интернет-сервис помощи студентам
Добрый день. Изучаю Scrapy и столкнулась с проблемой вывода конечного url при редиректе.
Код вот:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import scrapy
import json
from bs4 import BeautifulSoup
 
class CatalogSpider(scrapy.Spider):
    name = 'catalog6'
    allowed_domains = ['сайт']
    start_urls = ['https://сайт/catalog/']
    #pages_count = 1
    handle_httpstatus_all = True
 
    def start_requests(self):
        url = f'https://сайт.ru/catalog/'
        yield scrapy.Request(url, callback=self.urltov)
 
    #пробегаем по всем ссылкам онлайнр
    def urltov(self,response):
 
        with open('../urlonline.json', 'r',encoding='utf-8') as f:  # открыли файл с данными
            text = json.load(f)
        for p in text:
            #print(response.urljoin(p['url']))
            yield scrapy.Request(response.urljoin(p['url']), callback=self.sbonl)
 
 
    # работаем со страницей нужной граммовки
    def sbonl(self, response, **kwargs):
        # забираем таблицу конкурентов и нас
        for href in response.css('.drug-online-box').extract():
            soup = BeautifulSoup(href, "html.parser")
            # проверяем есть ли мы
            if soup.find_all("h3", string="Социалочка.рф"):
                # начинаем разбирать блоки с продавцами
                for blok in response.css('.drug-online-item').extract():
                    soup = BeautifulSoup(blok, "html.parser")
                    #проверяем какой конечный url получился
                    yield scrapy.Request(response.urljoin(soup.find('a')['href']), callback=self.testo)
                    # вот тут должно быть сразу
                    # print(soup.find('h3').text, " - ",
                    #       soup.find('span', class_='rub').text, " - ",
                    #       scrapy.Request(response.urljoin(soup.find('a')['href']), callback=self.testo))
            else:
                print("на этой странице нет - ", response)
 
 
 
    def testo(self, response,  **kwargs):
        item = {
            'url': response
        }
        yield item
В файле urlonline.json хранятся ссылки на витрины с продавцами. В блоке каждого продавца есть ссылка на товар на его сайте, но эта ссылка скрыта за 302 редиректом. На данный момент у меня получилось получить конечные ссылки, но немного не так как надо.

Мне нужно, что бы в файл записывалось несколько параметров h3/цена/ссылка (ну пока пусть хотя бы выводятся вместе)
Python
1
2
3
print(soup.find('h3').text, " - ",
soup.find('span', class_='rub').text, " - ",
scrapy.Request(response.urljoin(soup.find('a')['href']), callback=self.testo))
Но реализация через scrapy.Request(... работает как то странно, что бы получить ответ реквеста, приходится создавать доп.функцию и я понимаю что делаю что-то не так.

В идеале нужно что-бы scrapy.Request возвращал значение в переменную или по месту вызова, что-бы по итогу, вместо
Python
1
scrapy.Request(response.urljoin(soup.find('a')['href']), callback=self.testo)
было получено значение. Но без callback ничего не работает, а с ним больше параметров не передать. (Я пробовала передать значение scrapy.Request в виде простого параметра без yield, работает, но scrapy.Request не отрабатыват.

Но как только мы испозьзуем scrapy.Request с callback=self.testo, то значение возвращается.

Пробовала вместо scrapy.Request, использовать requests и urllib для получения конечного урла в точке вызова. Но они работают медленно и нестабильно.

Суть задачи, в функции sbonl, вывести / вернуть 3 параметра h3/цена/конечная ссылка.
или
Передать несколько параметров в testo, что бы можно было ввести h3/цена...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.06.2021, 20:51
Ответы с готовыми решениями:

Pandas: Возврат значения при условии совпадения значения строки и столбца
Здравствуйте подскажите пожалуйста т.к. сам вот никак не могу найти хоть и задача вроде очень тривиальная: Допустим есть объект...

Повторный возврат рандомного значения ,без изменения значения
Добрый день. Пишу простую консольную игру Кости. Есть 4-е функции прорисовки костей (2-е на кости игрока и 2-е на кости ПК). Каждая...

Возврат значения С++
Hi people! Вот такое задание: 1) Реализовать заданную динамическую структуру данных, с которой можно работать через перегруженные...

3
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
20.06.2021, 21:39
Цитата Сообщение от VikaL0 Посмотреть сообщение
Пробовала вместо scrapy.Request, использовать requests и urllib для получения конечного урла в точке вызова. Но они работают медленно и нестабильно.
Вы прям взяли замерили, а не просто по ощущениям....

requests самая стабильная Python библиотека для web запросов.
Но если кого-то все-таки не устраивает её скорость (хотя какая там скорость для web запросов? вас же сервак первый заклюет за DDOS; наоборот, чаще запросы притормаживать приходится) - есть faster-than-requests.

P.S. scarpy это мега-фреймворк для масштабных web-запросов. На множество сайтов. Сразу.
Мне кажется вы выбрали для рытья экскаватор там, где вам обычная ямка нужна, для которой и лопата сгодится.
0
0 / 0 / 0
Регистрация: 10.09.2020
Сообщений: 11
20.06.2021, 23:55  [ТС]
Соглашусь, что requests одна из лучших, но, медленно - тут в ином понимании.
Тут я прошу помочь найти аналог requests.get, только методами scarpy. Мне нужно так же как и в requests.get, вызвать и получить конечный URL в месте вызова, а не городить новую функцию для scrapy.Request. Также, если использовать requests моментально появляются ошибки в PoolManager из-за новых коннектов. И лично по моему мнению, для "ямки", писать кучу перепроверок чтобы в один прекрасный момент requests не положил скрипт ибо сайт может уйти в бесконечную загрузку, излишняя роскошь.

Добавлено через 37 минут
Разобралась, быстро найти аналог request.get не смогла но. Дополнительные параметры в scrapy.Request можно передать используя functools.

Вот что сделала
Python
1
2
3
from functools import partial
...
yield scrapy.Request(url=response.urljoin(soup.find('a')['href']), callback=partial(self.testo, dd="сюда доп параметры"))
Таким образом можно не терять предыдущий прогресс / отслеживать ссылки

P.S Я учусь, и может кому еще пригодится. Но если Вы знаете, как произвести request в scrapy с ответом в месте вызова, будет здорово если напишите.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.06.2021, 15:50
Цитата Сообщение от VikaL0 Посмотреть сообщение
а с ним больше параметров не передать.
Просто посмотрел документацию:
Python
1
2
3
4
5
6
7
8
9
10
11
12
def parse(self, response):
    request = scrapy.Request(
        url=url,
        callback=parse_page,
        cb_kwargs=dict(key=value, key2=value2,key3=value3)
   )
 
    yield request
 
 
def parse_page(self, response, key,key2,key3):
     ....
Иных вариантов в scrapy, судя по всему, не предусмотрено. Здесь все работает на коллбеках.


Цитата Сообщение от VikaL0 Посмотреть сообщение
для "ямки", писать кучу перепроверок чтобы в один прекрасный момент requests не положил скрипт ибо сайт может уйти в бесконечную загрузку, излишняя роскошь.
А я писал. И ничего. Скрипты работают по 5 лет, парсят миллионы доков и приносят заказчику деньги.
Просто нужно знать как писать правильные скрипты-парсеры.

А у вас скрипт упадет даже со scrapy.

Добавлено через 11 минут
P.S. И еще - суп (BeautifulSoup) самая беспонтовая библиотека для парсинга. Даже еще и медленная.
А беспонтовая она потому, что заряжает новичков писать на ней страшный говнокод, без проверок на None и т.д. в виде целых цепочек функций. Но Python не Haskell (или иной функц. ЯП) - здесь нельзя написать безопасные цепочки вызовов функций.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.06.2021, 15:50
Помогаю со студенческими работами здесь

Возврат значения
var fixedAmounts = ; var topUpAmount = 66.5; function f(topUpAmount, fixedAmounts) { let obj = ; let minNumber =...

Возврат значения
Помогите решить проблему. Есть программа. В texbox выводятся значения (счет кол-ва шагов двигателя), эти значения при каждом нажатии...

Возврат значения по ссылке
Долго гуглил, но что-то так и не понял. Почему слева от знака = может использоваться только функция, возвращающая ссылку?

Возврат значения из DLL
Microsoft Visual Studio 2010. Есть DLL на C++. Формочка на VB.NET DLL: __declspec(dllexport) char RETURN() { char a='R';...

Возврат значения из функции
function crop($image, $x_o, $y_o, $w_o, $h_o) { if (($x_o < 0) || ($y_o < 0) || ($w_o < 0) || ($h_o < 0)) { echo...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru