【问题标题】:Exporting scraped data to a CSV file将抓取的数据导出到 CSV 文件
【发布时间】:2018-01-01 03:48:46
【问题描述】:

我正在尝试从一个网站获取数据,该网站需要我在抓取数据之前遵循 2 个 URL。

目标是得到一个如下所示的导出文件:

我的代码如下:

import scrapy
from scrapy.item import Item, Field
from scrapy import Request

class myItems(Item):
    info1 = Field()
    info2 = Field()
    info3 = Field()
    info4 = Field()

class mySpider(scrapy.Spider):
    name = 'techbot'
    start_urls = ['']

    def parse(self, response):
        #Extracts first link
        items = []

        list1 = response.css("").extract() #extract all info from here

        for i in list1:
            link1 = 'https:...' + str(i)
            request = Request(link1, self.parseInfo1, dont_filter =True)
            request.meta['item'] = items
            yield request

        yield items

    def parseInfo1(self, response):
        #Extracts second link
        item = myItems()
        items = response.meta['item']

        list1 = response.css("").extract()
        for i in list1:
            link1 = '' + str(i)
            request = Request(link1, self.parseInfo2, dont_filter =True)
            request.meta['item'] = items
            items.append(item)
            return request

    def parseInfo2(self, response):
        #Extracts all data
        item = myItems()
        items = response.meta['item']
        item['info1'] = response.css("").extract()
        item['info2'] = response.css("").extract()
        item['info3'] = response.css("").extract()
        item['info4'] = response.css("").extract()
        items.append(item)
        return items

我已经在终端中使用以下命令执行了蜘蛛:

scrapy crawl techbot

我得到的数据是乱序的,并且有这样的空白:

例如它多次抓取第一组数据,其余的都是乱序的。

如果有人能指出我以更清晰的格式获得结果的方向,如开头所示,将不胜感激。

谢谢

【问题讨论】:

  • 使用 print() 来查看代码中发生了什么 - 看看什么/什么时候你得到了变量。
  • 如果你添加真实的 url 然后我们可以测试它并查看问题。目前是不可能的。
  • 你不应该使用yield 而不是returnRequest 吗?
  • 我认为在parseInfo2 你可以yield/returnitem。我不知道你为什么使用列表items = []
  • 你得到列表list1 = response.css("").extract(),然后你用link1 = 'https:...' + str(i)替换它 - 为什么?

标签: python csv web-scraping scrapy


【解决方案1】:

通过将以下两个链接合并为一个函数而不是两个函数来解决此问题。我的蜘蛛现在工作如下:

class mySpider(scrapy.Spider):
name = 'techbot'
start_urls = ['']

def parse(self, response):
    #Extracts links
    items = []

    list1 = response.css("").extract()
    for i in list1:
        link1 = 'https:...' + str(i)
        request = Request(link2, self.parse, dont_filter =True)
        request.meta['item'] = items
        yield request

    list2 = response.css("").extract()
    for i in list2:
        link2 = '' + str(i)
        request = Request(link1, self.parseInfo2, dont_filter =True)
        request.meta['item'] = items
        yield request

    yield items

def parseInfo2(self, response):
    #Extracts all data
    item = myItems()
    items = response.meta['item']
    item['info1'] = response.css("").extract()
    item['info2'] = response.css("").extract()
    item['info3'] = response.css("").extract()
    item['info4'] = response.css("").extract()
    items.append(item)
    return items

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2018-06-06
    相关资源
    最近更新 更多