【问题标题】:How to split output from a list of urls in scrapy如何从scrapy中的url列表中拆分输出
【发布时间】:2016-08-20 13:06:20
【问题描述】:

我正在尝试从 scrapy 中的 url 列表中为每个抓取的 url 生成一个 csv 文件。我明白我将修改 pipeline.py,但是到目前为止我所有的尝试都失败了。我不明白如何将被抓取的 url 传递给管道并将其用作输出的名称并相应地拆分输出。

有什么帮助吗?

谢谢

这里是蜘蛛和管道

from scrapy import Spider
from scrapy.selector import Selector 
from vApp.items import fItem


class VappSpider(Spider):

    name = "vApp"
    allowed_domains = ["google.co.uk"]
    start_urls = [l.strip() for l in open('data/listOfUrls.txt').readlines()]


def parse(self, response):

    trs = Selector(response).xpath('//[@id="incdiv"]/table/tbody/tr')
    for tr in trs:
        item = fItem()

        try:
            item['item'] = tr.xpath('td/text()').extract()[0]
        except IndexError:
            item['item'] = 'null'

        yield item

管道:

from scrapy import signals
from scrapy.contrib.exporter import CsvItemExporter

class VappPipeline(object):
    def __init__(self):
        self.files = {}

@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):
        file = open('results/%s.csv' % spider.name, 'w+b')
        self.files[spider] = file
        self.exporter = CsvItemExporter(file)
        self.exporter.fields_to_export = ['item']
        self.exporter.start_exporting()

    def spider_closed(self, spider):
        self.exporter.finish_exporting()
        file = self.files.pop(spider)
        file.close()

    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    我认为您应该在爬网完成时将所有这些事情作为后处理步骤进行批量处理,而不是按项目进行,但这里有一个关于如何做您想做的事情的草稿:

    from scrapy import Spider
    from scrapy.selector import Selector 
    from vApp.items import fItem
    
    
    class VappSpider(Spider):
    
        name = "vApp"
        allowed_domains = ["google.co.uk"]
        start_urls = [l.strip() for l in open('data/listOfUrls.txt').readlines()]
    
    
    def parse(self, response):
    
        trs = Selector(response).xpath('//[@id="incdiv"]/table/tbody/tr')
        for tr in trs:
            item = fItem()
    
            try:
                item['item'] = tr.xpath('td/text()').extract()[0]
            except IndexError:
                item['item'] = 'null'
            item['url'] = response.url
            yield item
    
    
    from scrapy import signals
    from scrapy.contrib.exporter import CsvItemExporter
    from urlparse import urlparse
    
    class VappPipeline(object):
        def __init__(self):
            self.files = {}
            self.exporter = {}
    
        @classmethod
        def from_crawler(cls, crawler):
           pipeline = cls()
           crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
           return pipeline
    
        def process_item(self, item, spider):
            url = item['url']
            parsed_uri = urlparse(url)
            domain = parsed_uri.netloc
            if domain not in self.exporter:
                file = open('results/%s.csv' % domain, 'w+b')
                self.files[domain] = file
                self.exporter[domain] = CsvItemExporter(file)
                self.exporter[domain].fields_to_export = ['item']
                self.exporter[domain].start_exporting()
    
            assert domain in self.exporter
    
            self.exporter[domain].export_item(item)
    
            return item
    
        def spider_closed(self, spider):
            for domain, exporter in self.exporter.iteritems():
                exporter.finish_exporting()
                self.files[domain].close()
    

    【讨论】:

    • 谢谢@neverlastn。我已经尝试了您的解决方案,但让我失去了错误。我想你是对的。我应该在抓取后对数据进行后处理。特别是在我发现每行数据不是按顺序导出之后。爬取的表的每一行似乎都不是按顺序爬取的,但是在爬虫爬取了另一个url之后,从其他地址导出了一些行。所以基本上我的表看起来像 row1url1、row1url2、row2url1、row2url1...
    猜你喜欢
    • 2021-02-14
    • 2018-12-15
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    相关资源
    最近更新 更多