传递SQLalchemy查询结果以在scrapy中启动URL

2024-09-28 05:17:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在python2环境中使用scrapy,我想使用sqlalchemy查询数据库中的URL列表,然后将该URL列表发送给scrapy,用作其start\u URL列表。你知道吗

文件名为贝西.py我通过键入以下命令来执行整个事件:

scrapy runspider betsy.py

这应该是一个相当简单的程序,双重检查404等,我不需要做任何进一步的爬行,一旦我达到这些网址。你知道吗

以下是我认为相关的代码:

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\u landingpages变量之后添加此行:

print unique_landingpages

然后我看到了看似有用的结果:

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

但是,我没有成功地将这些结果传递到scrapy的start\u url参数。你知道吗

如果我尝试start\u url=unique\u landingpages,则会出现以下错误:

File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/scrapy/http/request/init.py", line 56, in _set_url raise TypeError('Request url must be str or unicode, got %s:' % type(url).name)

TypeError: Request url must be str or unicode, got LandingPages:

如果我尝试start\u url=[unique\u landingpages],会出现以下错误:

File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/scrapy/http/request/init.py", line 56, in _set_url raise TypeError('Request url must be str or unicode, got %s:' % type(url).name)

TypeError: Request url must be str or unicode, got list:

但是,当我在Mac终端上运行这个命令,然后复制print unique\u landingpages的输出,如上图所示,然后直接粘贴到贝西.py,所以它说:

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

它运行得非常好。你知道吗

我在这里搜索了十几篇文章,但没有看到其他人有同样的情况。谁能告诉我哪里出了问题吗?你知道吗

(顺便说一句,可能有一种更干净的方法可以按今天的日期过滤。)


Tags: pyselfidtrueurlcolumnintegerstart
1条回答
网友
1楼 · 发布于 2024-09-28 05:17:13

您的查询正在返回两个LandingPages对象的实例。您可以更改查询以便只返回ad_url值,也可以提取返回的每个LangingPages实例的ad_url属性。你知道吗

方案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语句具有误导性,因为您为LandingPages类定义了一个__repr__方法。print查找该方法,并在试图找出如何打印所给内容时使用它。你知道吗

相关问题 更多 >

    热门问题