Передача результатов запроса SQLalchemy в start_urls в scrapy - PullRequest
0 голосов
/ 31 октября 2018

Используя scrapy в среде Python 2, я хочу использовать sqlalchemy, чтобы запросить в базе данных список URL-адресов, а затем отправить этот список URL-адресов в scrapy, чтобы использовать его в качестве списка start_urls.

Имя файла - betsy.py, и я выполняю все это, набрав:

scrapy runspider betsy.py

Предполагается, что это довольно простая программа для двойной проверки на 404 и т. Д. Мне не нужно больше сканировать, когда я достигну этих URL.

Вот то, что я считаю соответствующим кодом:

class LandingPages(Base):
    __tablename__ = 'landingpages_programmatic'
    id = Column(Integer, primary_key=True)
    client_id = Column(Integer, nullable=True)
    campaign_id = Column(Integer, nullable=True)
    ad_id = Column(Integer, nullable=True)
    ad_url = Column(String(512), nullable=True)
    ad_url_utm = Column(String(512), nullable=True)
    created_on = Column(DateTime(),default=datetime.now)

    def __repr__(self):
        return "'{self.ad_url}'".format(self=self)

todaysdate = str(datetime.now().year) + '-' + str(datetime.now().month) + '-' + str(datetime.now().day)
unique_landingpages =  session.query(LandingPages).filter(LandingPages.created_on.startswith(todaysdate)).limit(2).all()

class BetsySpider(scrapy.Spider):

    name='BetsySpider'
    start_urls = [unique_landingpages]

    def parse(self, response):
        url = response.url
        title = response.css('h1::text').extract_first()
        print('URL is: {}'.format(url))

Если я добавлю эту строку сразу после установки переменной unique_landingpages:

print unique_landingpages

Тогда я вижу, по-видимому, полезные результаты:

['https://www.google.com', 'https://www.bing.com/']

Однако я не могу передать эти результаты аргументу scrapy start_urls.

Если я попробую start_urls = unique_landingpages, я получу эту ошибку:

Файл "/ Users / Крис / Рабочий стол / Эксперименты Banff / banff / lib / python2.7 / site-packages / scrapy / http / request / init .py", строка 56, в _set_url повысить TypeError ('URL-адрес запроса должен быть str или unicode, получен% s:'% type (url). name )

TypeError: URL-адрес запроса должен быть str или unicode, получил LandingPages:

Если я попробую start_urls = [unique_landingpages], я получу эту ошибку:

Файл "/ Users / Крис / Рабочий стол / Эксперименты Банфа / banff / lib / python2.7 / site-packages / scrapy / http / request / init .py", строка 56, в _set_url повысить TypeError ('URL-адрес запроса должен быть str или unicode, получен% s:'% type (url). name )

TypeError: URL-адрес запроса должен быть str или unicode, полученный список:

Однако, когда я запускаю это в Mac Terminal, а затем копирую вывод print unique_landingpages , как показано выше, а затем непосредственно вставляю это в betsy.py, так что оно говорит:

start_urls = ['https://www.google.com', 'https://www.bing.com/']

работает отлично.

Я искал около дюжины статей здесь, но больше никого не вижу в такой же ситуации. Может кто-нибудь любезно пролить свет на то, где я ошибся?

(Кстати, возможно, есть более чистый способ фильтрации по сегодняшней дате.)

1 Ответ

0 голосов
/ 31 октября 2018

Ваш запрос возвращает два экземпляра LandingPages объектов. Вы можете либо изменить запрос так, чтобы возвращались только значения ad_url, либо извлечь атрибут ad_url каждого возвращаемого экземпляра LangingPages.

Вариант 1:

unique_landingpages =  session.query(LandingPages.ad_url).filter(LandingPages.created_on.startswith(todaysdate)).limit(2).all()

Вариант 2:

unique_landingpage_records =  session.query(LandingPages).filter(LandingPages.created_on.startswith(todaysdate)).limit(2).all()
unique_landingpages = [u.ad_url for u in unique_landingpage_records]

Если вам нужно только поле ad_url каждой записи, используйте опцию 2, так как запрос будет дешевле.

Инструкция print вводит в заблуждение, поскольку вы определили метод __repr__ для класса LandingPages. print ищет этот метод и использует его при попытке выяснить, как напечатать то, что вы ему даете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...