在scrapy的spider的start_urls列表中给定的每个URL单独的输出文件

Fmoridhara

我想为我在spider的start_urls中设置的每个URL创建单独的输出文件,或者以某种方式想要分割输出文件,以明智的方式启动url。

以下是我的蜘蛛的start_urls

start_urls = ['http://www.dmoz.org/Arts/', 'http://www.dmoz.org/Business/', 'http://www.dmoz.org/Computers/']

我想创建单独的输出文件,如

Arts.xml
Business.xml
Computers.xml

我不知道该怎么做。我正在考虑通过在item管道类的spider_opened方法中实现以下操作来实现这一点,

import re
from scrapy import signals
from scrapy.contrib.exporter import XmlItemExporter

class CleanDataPipeline(object):
    def __init__(self):
        self.cnt = 0
        self.filename = ''

    @classmethod
    def from_crawler(cls, crawler):
        pipeline = cls()
        crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
        crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
        return pipeline

    def spider_opened(self, spider):
        referer_url = response.request.headers.get('referer', None)
        if referer_url in spider.start_urls:
            catname = re.search(r'/(.*)$', referer_url, re.I)
            self.filename = catname.group(1)

        file = open('output/' + str(self.cnt) + '_' + self.filename + '.xml', 'w+b')
        self.exporter = XmlItemExporter(file)
        self.exporter.start_exporting()

    def spider_closed(self, spider):
        self.exporter.finish_exporting()
        #file.close()

    def process_item(self, item, spider):
        self.cnt = self.cnt + 1
        self.spider_closed(spider)
        self.spider_opened(spider)
        self.exporter.export_item(item)
        return item

我在哪里尝试在start_urls列表中找到每个已抓取项目的引用网址。如果在start_urls中找到引用网址,则将使用该引用网址创建文件名。但是问题是如何在spider_opened()方法内访问响应对象。如果可以在那里访问它,则可以基于该文件创建文件。

有帮助找到执行此操作的方法吗?提前致谢!

[编辑]

通过更改管道代码如下解决了我的问题。

import re
from scrapy import signals
from scrapy.contrib.exporter import XmlItemExporter

class CleanDataPipeline(object):
    def __init__(self):
        self.filename = ''
        self.exporters = {}

    @classmethod
    def from_crawler(cls, crawler):
        pipeline = cls()
        crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
        crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
        return pipeline

    def spider_opened(self, spider, fileName = 'default.xml'):
        self.filename = fileName
        file = open('output/' + self.filename, 'w+b')
        exporter = XmlItemExporter(file)
        exporter.start_exporting()
        self.exporters[fileName] = exporter

    def spider_closed(self, spider):
        for exporter in self.exporters.itervalues(): 
            exporter.finish_exporting()

    def process_item(self, item, spider):
        fname = 'default'
        catname = re.search(r'http://www.dmoz.org/(.*?)/', str(item['start_url']), re.I)
        if catname:
            fname = catname.group(1)
        self.curFileName = fname + '.xml'

        if self.filename == 'default.xml':
            if os.path.isfile('output/' + self.filename):
                os.rename('output/' + self.filename, 'output/' + self.curFileName)
            exporter = self.exporters['default.xml']
            del self.exporters['default.xml']
            self.exporters[self.curFileName] = exporter
            self.filename = self.curFileName

        if self.filename != self.curFileName and not self.exporters.get(self.curFileName):
            self.spider_opened(spider, self.curFileName)

        self.exporters[self.curFileName].export_item(item)
        return item

同样make_requests_from_url在Spider中实现,可以为每个项目设置start_url。

def make_requests_from_url(self, url):
    request = Request(url, dont_filter=True)
    request.meta['start_url'] = url
    return request
ec

我将采用更明确的方法(未经测试):

  • 在以下位置配置可能类别的列表settings.py

    CATEGORIES = ['Arts', 'Business', 'Computers']
    
  • start_urls根据设置定义您

    start_urls = ['http://www.dmoz.org/%s' % category for category in settings.CATEGORIES]
    
  • 添加category FieldItem

  • 在Spider的parse方法中,category根据current设置字段response.url,例如:

    def parse(self, response):
         ...
         item['category'] = next(category for category in settings.CATEGORIES if category in response.url)
         ...
    
  • 在管道中,打开所有类别的出口商,然后根据以下条件选择要使用的出口商item['category']

    def spider_opened(self, spider):
        ...
        self.exporters = {}
        for category in settings.CATEGORIES:
            file = open('output/%s.xml' % category, 'w+b')
            exporter = XmlItemExporter(file)
            exporter.start_exporting()
            self.exporters[category] = exporter
    
    def spider_closed(self, spider):
        for exporter in self.exporters.itervalues(): 
            exporter.finish_exporting()
    
    def process_item(self, item, spider):
        self.exporters[item['category']].export_item(item)
        return item
    

您可能需要对其进行一些微调才能使其正常工作,但我希望您有主意-将类别存储在item正在处理的内部根据项目类别值选择要导出到的文件。

希望能有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为scrapy中的每个类别制作单独的输出文件

来自分类Dev

Scrapy:如何从设置文件设置scrapy start_urls?

来自分类Dev

Scrapy绕过start_urls

来自分类Dev

Python:Scrapy start_urls列表能够处理.format()吗?

来自分类Dev

Python:Scrapy start_urls列表能够处理.format()吗?

来自分类Dev

如何在scrapy spider的start_urls中发送发布数据

来自分类Dev

Scrapy Spider完成后重命名输出文件

来自分类Dev

为scrapy的start_urls命名

来自分类Dev

python scrapy spider:在每个start_url的parse()方法中传递其他信息

来自分类Dev

从csv文件读取start_urls

来自分类Dev

如何在python scrapy中为不同的start_urls应用不同的规则?

来自分类Dev

如何在python scrapy中为不同的start_urls应用不同的规则?

来自分类Dev

Scrapy:多个“ start_urls”产生重复的结果

来自分类Dev

Python Scrapy:如何从单独的文件运行Spider?

来自分类Dev

使用ggplot在pdf输出文件的单独页面上绘制每个图形

来自分类Dev

拆分列并写入单独的输出文件

来自分类Dev

拆分列并写入单独的输出文件

来自分类Dev

Terraform:在输出文件中重新排列我的列表

来自分类Dev

Python 抓取 start_urls

来自分类Dev

将sed中的每个匹配项输出为单独的文件

来自分类Dev

存档中的输出文件

来自分类Dev

Python中的输出文件

来自分类Dev

Scrapy无法访问start_urls:调试:已抓取(200)和错误

来自分类Dev

如何合并pdf并为输出文件中的每个输入文件创建书签?(Linux)

来自分类Dev

如何使用xpath方法获取Scrapy输出文件中的数字而不是文本?

来自分类Dev

如何在scrapy settings.py中启用覆盖输出文件?

来自分类Dev

Python:给定路径中的文件夹输出列表

来自分类Dev

CrawlSpider仅抓取start_urls

来自分类Dev

独立排序文件夹中的所有文件,每个文件都有一个输出文件

Related 相关文章

  1. 1

    为scrapy中的每个类别制作单独的输出文件

  2. 2

    Scrapy:如何从设置文件设置scrapy start_urls?

  3. 3

    Scrapy绕过start_urls

  4. 4

    Python:Scrapy start_urls列表能够处理.format()吗?

  5. 5

    Python:Scrapy start_urls列表能够处理.format()吗?

  6. 6

    如何在scrapy spider的start_urls中发送发布数据

  7. 7

    Scrapy Spider完成后重命名输出文件

  8. 8

    为scrapy的start_urls命名

  9. 9

    python scrapy spider:在每个start_url的parse()方法中传递其他信息

  10. 10

    从csv文件读取start_urls

  11. 11

    如何在python scrapy中为不同的start_urls应用不同的规则?

  12. 12

    如何在python scrapy中为不同的start_urls应用不同的规则?

  13. 13

    Scrapy:多个“ start_urls”产生重复的结果

  14. 14

    Python Scrapy:如何从单独的文件运行Spider?

  15. 15

    使用ggplot在pdf输出文件的单独页面上绘制每个图形

  16. 16

    拆分列并写入单独的输出文件

  17. 17

    拆分列并写入单独的输出文件

  18. 18

    Terraform:在输出文件中重新排列我的列表

  19. 19

    Python 抓取 start_urls

  20. 20

    将sed中的每个匹配项输出为单独的文件

  21. 21

    存档中的输出文件

  22. 22

    Python中的输出文件

  23. 23

    Scrapy无法访问start_urls:调试:已抓取(200)和错误

  24. 24

    如何合并pdf并为输出文件中的每个输入文件创建书签?(Linux)

  25. 25

    如何使用xpath方法获取Scrapy输出文件中的数字而不是文本?

  26. 26

    如何在scrapy settings.py中启用覆盖输出文件?

  27. 27

    Python:给定路径中的文件夹输出列表

  28. 28

    CrawlSpider仅抓取start_urls

  29. 29

    独立排序文件夹中的所有文件,每个文件都有一个输出文件

热门标签

归档