【问题标题】:CSV export is not workingCSV 导出不起作用
【发布时间】:2015-08-13 07:15:45
【问题描述】:

这是我的蜘蛛类:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.selector import HtmlXPathSelector
from scrapy.http.request import Request
from scrapy.crawler import CrawlerProcess
from scrapy.linkextractors.sgml import SgmlLinkExtractor
import csv

class StackItem(scrapy.Item):

    job_role = scrapy.Field()
    company = scrapy.Field()
    location = scrapy.Field()
    desc = scrapy.Field()
    read_more = scrapy.Field()


class newJobSpider(CrawlSpider):

    name = "newFlaskSpider"
    allowed_domains = ["placementindia.com"]
    start_urls = ["http://jobs.placementindia.com/lucknow"]
    rules = (Rule (SgmlLinkExtractor(allow=('.*\?id1=.*',),restrict_xpaths=('//a[@class="prevNext next"]',))
, callback="parse_items", follow= True),)

    def parse_items(self, response):
        hxs = HtmlXPathSelector(response)
        posts = hxs.select("//article[@class='classified']")
        items = []

        for post in posts:
            item = StackItem()
            item["job_role"] = post.select("div[@class='uu mb2px']/a/strong/text()").extract()
            item["company"] = post.select("p[1]/text()").extract()
            item["location"] = post.select("p[@class='mb5px b red']/text()").extract()
            item["desc"] = post.select("details[@class='aj mb10px']/text()").extract()
            item["read_more"] = post.select("div[@class='uu mb2px']/a/@href").extract()enter code here
            items.append(item)

            for item in items:
                yield item

这是项目管道

class myExporter(object):

    def __init__(self):
        self.myCSV = csv.writer(open('output6.csv', 'wb'))
        self.myCSV.writerow([item['job_role'], item['company'], item['location'], item['desc'], item['read_more']])

    def process_item(self, item, spider):
        self.myCSV.writerow([item['job_role'], item['company'], item['location'], item['desc'], item['read_more']])

        return item   

当他们在不同的班级时,运行良好。我在 csv 文件中得到结果。由于我的项目要求,我需要蜘蛛定义中的 csv 导出器类。这些类如何组合?

【问题讨论】:

  • 您可以在 Python 中嵌套类定义。
  • 您能否详细说明在这种情况下我如何使用嵌套类结构????
  • 我的意思是你可以将myExporter 类定义放在newJobSpider 类的定义中。
  • 那么如何在“myExporter”类中访问“newJobSpider”类的项目?仅仅通过创建一个超类的对象并访问它的变量是行不通的。我的意思是“newJobSpider.items”在“myExporter”类下没有产生任何结果。
  • 我认为与其查看嵌套类,不如解释一下为什么需要嵌套类。这违背了 Scrapy 的项目布局,因为不支持从嵌套类加载管道。

标签: python web-scraping scrapy export-to-csv scrapy-spider


【解决方案1】:

解决这个问题有两种方法:

1) 为什么要嵌套一个类?

如果您必须将导出器嵌套在蜘蛛 class 本身中,则不应嵌套。并且不需要单独的出口商。因为如果你有嵌套的导出器,你应该从蜘蛛访问它。这意味着您应该使用您的蜘蛛将项目写入 CSV 文件,因此在这种情况下您不需要从您的 parse_items 方法产生任何 items —— 但在那里实现 process_item 方法。所以不需要单独的导出器。

2) 导出器与蜘蛛在同一个文件中

如果你的导出器和蜘蛛在同一个文件中,你必须从你的settings.py 文件中指向这个导出器class。假设您的项目位于new_job 文件夹中,您的蜘蛛的Python 文件名为newjob.py。在这种情况下,您可以在settings.py 中添加以下行:

ITEM_PIPELINES = {'new_job.spiders.newjob.myExporter' : 90,}

顺便说一句,当我复制您的代码时,我遇到了一些需要修复的错误。所以我想知道它是否对你有用。

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2019-12-09
    相关资源
    最近更新 更多