【问题标题】:Passing SQLalchemy query results to start_urls in scrapy将 SQLalchemy 查询结果传递给 scrapy 中的 start_urls
【发布时间】:2023-03-05 19:19:01
【问题描述】:

在 Python 2 环境中使用 scrapy,我想使用 sqlalchemy 查询数据库以获取 URL 列表,然后将该 URL 列表发送到 scrapy,用作它的 start_urls 列表。

文件名是 betsy.py,我通过键入以下内容来执行整个事件:

scrapy runpider 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/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/scrapy/http/request/init.py”,第 56 行,在 _set_url raise TypeError('请求的 url 必须是 str 或 unicode,得到 %s:' % type(url).name)

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

如果我尝试 start_urls = [unique_landingpages],我会收到以下错误:

文件“/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/scrapy/http/request/init.py”,第 56 行,在 _set_url raise TypeError('请求的 url 必须是 str 或 unicode,得到 %s:' % type(url).name)

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

但是,当我在 Mac 终端中运行它,然后复制 print unique_landingpages 的输出,如上所示,然后直接将其粘贴到 betsy.py 中,这样它就会显示:

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

它运行得很好。

我在这里搜索了十几篇文章,但没有看到其他人有同样的情况。谁能帮我解释一下我哪里出错了?

(顺便说一句,可能有一种更简洁的方式来过滤今天的日期。)

【问题讨论】:

    标签: python sqlalchemy scrapy


    【解决方案1】:

    您的查询返回两个 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 查找该方法并在尝试弄清楚如何打印您提供的内容时使用它。

    【讨论】:

    • 啊,所以“dep repr self:”部分只告诉程序如何在屏幕上显示结果在屏幕上,但实际上并不在内存中.因此,如果我删除 dep repr self: sn-p,我可以看到“unique_landingpages”实际存储为:“[, "........ 等等。再次感谢。这是我消化的一个重要概念。非常感谢您的帮助。
    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 2011-10-25
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多