将scrapy数据打印到CSV

时间:2018-10-29 05:37:12

标签: python csv scrapy

嗨,我最近开始抓痒,写了一个履带式的。但是,当将数据输出到csv时,它们全部打印在一行中。如何将每个数据打印到自己的行?

我的情况是从网站打印链接。以json格式打印时效果很好。

这是代码。

items.py文件。

import scrapy
from scrapy.item import Item ,Field
class ErcessassignmentItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
link = Field()
#pass

mycrawler.py

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector # deprecated
from scrapy.selector import Selector
from ercessAssignment.items import ErcessassignmentItem

class MySpider(BaseSpider):
name ="ercessSpider"
allowed_domains =["site_url"]
start_urls = ["site_url"]

def parse(self, response):
    hxs = Selector(response)
    links = hxs.xpath("//p")
    items = []
    for linkk in links:
        item = ErcessassignmentItem()
        item["link"] = linkk.xpath("//a/@href").extract()
        items.append(item)
        return items`

3 个答案:

答案 0 :(得分:1)

for linkk in links:
    item = ErcessassignmentItem()
    item["link"] = xpath("//a/@href").extract()[linkk]
    yield item

这在css选择器中效果很好,但是如果以上两种解决方案均无效,那么您可以尝试一下。

答案 1 :(得分:0)

您的上面的代码未print。此外,我没有看到任何.csv部分。另外,由于{{1}的第一次迭代之后,您对items创建的parse()列表对我来说似乎是缩进错误(即您return),因此列表永远不会超过1 }}。为了提高可读性,您可以在此处使用for/else构造:

for-loop

答案 2 :(得分:0)

您应该在代码中使用适当的缩进

import scrapy
from scrapy.item import Item ,Field
class ErcessassignmentItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    link = Field()

然后在您的Spider中,不要使用return,for循环将只运行一次,并且您将仅以CSV打印一行,而使用yield 其次,将代码放入CSV的代码在哪里?我想您正在使用scrapy的默认存储方式, 如果您不知道,请像这样运行刮板

scrapy crawl ercessSpider -o my_output.csv

您的蜘蛛代码应该是这样的,请注意我所做的更改

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector # deprecated
from scrapy.selector import Selector
from ercessAssignment.items import ErcessassignmentItem

class MySpider(BaseSpider):
name ="ercessSpider"
allowed_domains =["site_url"]
start_urls = ["site_url"]

def parse(self, response):
    hxs = Selector(response)
    links = hxs.xpath("//p")
    for linkk in links:
        item = ErcessassignmentItem()
        item["link"] = linkk.xpath("//a/@href").extract()
        yield item