首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在scrapy的start_requests()中返回项目

在scrapy的start_requests()中返回项目
EN

Stack Overflow用户
提问于 2016-02-10 02:57:41
回答 2查看 1.3K关注 0票数 5

我正在写一个抓取许多urls作为输入的爬虫,并将它们分类为类别(作为项目返回)。这些URL通过我的爬虫提供给爬虫start_requests()方法。

有些网址可以在不下载的情况下进行分类,所以我想yield直接使用Item为他们在start_requests(),这是scrapy所禁止的。我怎么才能绕过这一步呢?

我曾考虑过在自定义中间件中捕获这些请求,这将使它们变成虚假的Response对象,然后我可以将它们转换为Item对象,但任何更简洁的解决方案都是受欢迎的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-10 22:00:11

我认为使用爬虫中间件和重写开始_requests()将是一个很好的开始。

在您的中间件中,您应该遍历start中的所有urls_urls,并且可以使用条件语句来处理不同类型的urls。

  • 对于不需要请求的特殊URL,您可以

直接调用管道的进程_item(),请不要忘记导入您的管道并从您的url为此创建一个scrapy.item

正如您所提到的,在请求中将url作为meta传递,并使用一个单独的解析函数,该函数只返回url。

  • 对于所有剩余的URL,您可以启动一个“普通”请求,因为您可能已经定义了
票数 1
EN

Stack Overflow用户

发布于 2021-02-25 14:25:43

您可以使用Downloader Middleware来完成此工作。

start_requests(),您应该始终发出请求,例如:

代码语言:javascript
代码运行次数:0
运行
复制
def start_requests(self):
    for url in all_urls:
        yield scrapy.Request(url)

但是,您应该编写一个下载器中间件:

代码语言:javascript
代码运行次数:0
运行
复制
class DirectReturn:
    def process_request(self, request, spider):
        image_url = request.url
        if url in direct_return_url_set:
            resp = Response(image_url, request=request)
            request.meta['direct_return_url': True]
            return resp
        else:
            return request

然后,在您的parse方法,只需检查键direct_return_urlresponse.meta。如果是,只需生成一个项目并将response.url放入该项目,然后生成该项目。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35300052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档