我正在学习使用scrapy进行网页抓取。玩得很开心。唯一的问题是我无法以所需的方式保存抓取的数据。
以下代码从Amazon刮取评论。如何使数据的存储更好?
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
import csv
class Oneplus6Spider(scrapy.Spider):
name = 'oneplus6'
allowed_domains = ['amazon.in']
start_urls = ['https://www.amazon.in/OnePlus-Silk-White-128GB-
Storage/product-reviews/B078BNQ2ZS/ref=cm_cr_arp_d_viewopt_sr?
ie=UTF8&reviewerType=all_reviews&filterByStar=positive&pageNumber=1']
def parse(self, response):
writer = csv.writer(open('jack.csv','w+'))
opinions = response.xpath('//*[@class="a-size-base a-link-normal
review-title a-color-base a-text-bold"]/text()').extract()
for opinion in opinions:
yield({'Opinion':opinion})
reviewers = response.xpath('//*[@class="a-size-base a-link-normal
author"]/text()').extract()
for reviewer in reviewers:
yield({'Reviewer':reviewer})
verified = response.xpath('//*[@class="a-size-mini a-color-state a-
text-bold"]/text()').extract()
for verified_buyer in verified:
yield({'Verified_buyer':verified_buyer})
ratings = response.xpath('//span[@class="a-icon-
alt"]/text()').extract()
for rating in ratings:
yield({'Rating':rating[0]})
model_bought = response.xpath('//a[@class="a-size-mini a-link-
normal a-color-secondary"]/text()').extract()
for model in model_bought:
yield({'Model':model})
我尝试使用scrapy的默认方式 -o 方法,也尝试使用csv。
数据存储在单行中。我对pandas和csv模块非常陌生,我不知道如何以正确的格式存储报废的数据?
它将所有值存储在一行中。
我想要不同行中的不同值
例如:评论|评分|型号|
但是我不知道怎么做
我该怎么办?
答案 0 :(得分:1)
在您的代码中发现您尝试提取具有不同类型的记录:它们都是具有单个键的所有dict
对象,其中键可能具有不同的值(“ Opinion”,“ Reviewer”等)。
在Scrapy中,将数据导出到CSV由CsvItemExporter
处理,其中the _write_headers_and_set_fields_to_export
method与您当前的问题很重要,因为出口商需要在写入第一个字段之前知道字段列表(列名称)项目。
特别是:
fields_to_export
属性(通过Feed导出程序(related code here由FEED_EXPORT_FIELDS
设置配置)dict
,它将使用其所有键作为列名。scrapy.Item
,它将使用项定义中的键。因此,有多种方法可以解决该问题:
scrapy.Item
类,其中包含您需要的所有可能的键,并在代码中产生此类型的项(对于任何特定记录,只需填写您需要的一个字段,将其他字段留空)。 FEED_EXPORT_FIELDS
设置,并保留现有代码的其他部分不变。我想上面的提示就足够了。如果您需要更多示例,请告诉我。
答案 1 :(得分:0)
要设置 csv 数据格式,最简单的方法之一是使用 excel 电源查询清理数据,请按照下列步骤操作:
您可以使用这些强大的查询进行所有类型的数据清理,这是根据需要设置数据格式的最简单方法。