首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python - Scrapy到Json的输出拆分

Python - Scrapy到Json的输出拆分
EN

Stack Overflow用户
提问于 2018-07-07 18:43:24
回答 2查看 882关注 0票数 0

我正在学习NLP,为此,我使用Scrapy抓取了一篇亚马逊书评。我已经提取了所需的字段,并将它们输出为Json文件格式。当此文件作为df加载时,每个字段都被记录为一个列表,而不是一个单独的逐行格式。我如何拆分这个列表,以便df对每个项目都有一行,而不是将所有项目条目记录在单独的列表中?代码:

代码语言:javascript
运行
AI代码解释
复制
import scrapy


class ReviewspiderSpider(scrapy.Spider):
    name = 'reviewspider'
    allowed_domains = ['amazon.co.uk']
    start_urls = ['https://www.amazon.com/Gone-Girl-Gillian-Flynn/product-reviews/0307588378/ref=cm_cr_othr_d_paging_btm_1?ie=UTF8&reviewerType=all_reviews&pageNumber=1']

def parse(self, response):
    users = response.xpath('//a[contains(@data-hook, "review-author")]/text()').extract()
    titles = response.xpath('//a[contains(@data-hook, "review-title")]/text()').extract()
    dates = response.xpath('//span[contains(@data-hook, "review-date")]/text()').extract()
    found_helpful = response.xpath('//span[contains(@data-hook, "helpful-vote-statement")]/text()').extract()
    rating = response.xpath('//i[contains(@data-hook, "review-star-rating")]/span[contains(@class, "a-icon-alt")]/text()').extract()
    content = response.xpath('//span[contains(@data-hook, "review-body")]/text()').extract()

    yield {
        'users' : users.extract(),
        'titles' : titles.extract(),
        'dates' : dates.extract(),
        'found_helpful' : found_helpful.extract(),
        'rating' : rating.extract(),
        'content' : content.extract()
    }

示例输出:

代码语言:javascript
运行
AI代码解释
复制
users = ['Lauren', 'James'...'John']
dates = ['on September 28, 2017', 'on December 26, 2017'...'on November 17, 2016']
rating = ['5.0 out of 5 stars', '2.0 out of 5 stars'...'5.0 out of 5 stars']

所需输出:

代码语言:javascript
运行
AI代码解释
复制
index 1: [users='Lauren', dates='on September 28, 2017', rating='5.0 out of 5 stars']
index 2: [users='James', dates='On December 26, 2017', rating='5.0 out of 5 stars']
...

我知道可能应该编辑与爬行器相关的Pipeline来实现这一点,但是我的Python知识有限,无法理解Scrapy文档。我也尝试过herehere的解决方案,但是我知道的还不够多,无法将答案与我自己的代码结合起来。任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-07 22:54:24

编辑:我能够通过使用.css方法而不是.xpath来提出解决方案。我用来从一家时装零售商那里抓取衬衫清单的蜘蛛:

代码语言:javascript
运行
AI代码解释
复制
import scrapy
from ..items import ProductItem

class SportsdirectSpider(scrapy.Spider):
    name = 'sportsdirect'
    allowed_domains = ['www.sportsdirect.com']
    start_urls = ['https://www.sportsdirect.com/mens/mens-shirts']

def parse(self, response):
    products = response.css('.s-productthumbbox')
    for p in products:
        brand = p.css('.productdescriptionbrand::text').extract_first()
        name = p.css('.productdescriptionname::text').extract_first()
        price = p.css('.curprice::text').extract_first()
        item = ProductItem()
        item['brand'] = brand
        item['name'] = name
        item['price'] = price
        yield item

相关的items.py脚本:

代码语言:javascript
运行
AI代码解释
复制
import scrapy

class ProductItem(scrapy.Item):
    name = scrapy.Field()
    brand = scrapy.Field()
    name = scrapy.Field()
    price = scrapy.Field()

json-lines文件的创建(在Anaconda提示中):

代码语言:javascript
运行
AI代码解释
复制
>>> cd simple_crawler
>>> scrapy crawl sportsdirect --set FEED_URI=products.jl

用于将创建的.jl文件转换为数据帧的代码:

代码语言:javascript
运行
AI代码解释
复制
import json
import pandas as pd
contents = open('products3.jl', "r").read() 
data = [json.loads(str(item)) for item in contents.strip().split('\n')]
df2 = pd.DataFrame(data)

最终输出:

代码语言:javascript
运行
AI代码解释
复制
        brand        name                        price
0   Pierre Cardin    Short Sleeve Shirt Mens     £6.50 
1   Pierre Cardin    Short Sleeve Shirt Mens     £7.00 
...
票数 0
EN

Stack Overflow用户

发布于 2018-07-07 22:18:43

在重读你的问题后,我很确定这就是你想要的:

代码语言:javascript
运行
AI代码解释
复制
def parse(self, response):
    users = response.xpath('//a[contains(@data-hook, "review-author")]/text()').extract()
    titles = response.xpath('//a[contains(@data-hook, "review-title")]/text()').extract()
    dates = response.xpath('//span[contains(@data-hook, "review-date")]/text()').extract()
    found_helpful = response.xpath('//span[contains(@data-hook, "helpful-vote-statement")]/text()').extract()
    rating = response.xpath('//i[contains(@data-hook, "review-star-rating")]/span[contains(@class, "a-icon-alt")]/text()').extract()
    content = response.xpath('//span[contains(@data-hook, "review-body")]/text()').extract()

    for user, title, date, found_helpful, rating, content in zip(users, titles, dates, found_helpful, rating, content):
        yield {
            'user': user,
            'title': title,
            'date': date,
            'found_helpful': found_helpful,
            'rating': rating,
            'content': content
        }

或者其他类似的东西。这就是我在第一条评论中试图暗示的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51226028

复制
相关文章
TradingView配置
TradingView.onready(function () { var widget = window.tvWidget = new TradingView.widget({ debug: false, // uncomment this line to see Library errors and warnings in the console symbol: 'ETH/BTC', //币名称 int
用户1065635
2019/03/21
5.6K1
三十、是否可以使用 count(*)
一、是否可以使用 count(*) 在 SQL 中,COUNT() 函数返回匹配指定条件的函数。 序号COUNT用法作用描述1COUNT(*)返回总记录数,包含 NULL 值2COUNT(1)与COUNT(*)的作用一样3COUNT(column_name)返回指定列的数目,NULL值不统计4COUNT(DISTINCT column_name)返回指定列不同值的数目,NULL值不统计 Tip: COUNT(*) 与 COUNT(column_name) 的作用不一样,如果列值包含 NULL ,统计结果就
喵叔
2022/05/06
4970
SQL里是否可以使用JOIN
很多公司都禁止程序员在 SQL 中使用 JOIN,至于原因则出奇的一致:用 JOIN 慢。不过我从没见过谁来论证为什么用 JOIN 慢,结果这个人云亦云的结论越传越广,让我觉得是时候来讨论一下这个看似正确的结论了。
LA0WAN9
2021/12/14
6130
SQL里是否可以使用JOIN
【OpenGL】十九、OpenGL 绘制模式 ( 绘制线框模式 | 绘制点模式 )
使用 glPolygonMode(GL_FRONT, GL_LINE) 设置当前的绘制模式是线框模式 , 设置了该模式后 , 之后的所有图形都会变成线 ;
韩曙亮
2023/03/28
2.1K0
【OpenGL】十九、OpenGL 绘制模式  ( 绘制线框模式 | 绘制点模式 )
TradingView学习记录
3.1 UDF:通用数据饲料(Universal Data Feed)    通过HTTP协议向图标库提供数据
超级小可爱
2023/10/18
4110
TradingView学习记录
二十九、是否可以使用 count(*)
一、是否可以使用 count(*) 在 SQL 中,COUNT() 函数返回匹配指定条件的函数。 序号 COUNT用法 作用描述 1 COUNT(*) 返回总记录数,包含 NULL 值 2 COUNT(1) 与COUNT(*)的作用一样 3 COUNT(column_name) 返回指定列的数目,NULL值不统计 4 COUNT(DISTINCT column_name) 返回指定列不同值的数目,NULL值不统计 Tip: COUNT(*) 与 COUNT(column_name) 的作用不一样,如
喵叔
2021/06/25
4810
3.1.2 使用绘图API绘制Contour的思路
A week or so back I wrote about a package I ported/modified to create the Delaunay triangulation in Flash with a few AS3 classes. As I noted there, such atriangulated irregular network (TIN) allows us to interpolateisolines — lines of constant value (aka isarithms, commonly called contours).
周星星9527
2018/08/08
5300
3.1.2 使用绘图API绘制Contour的思路
Context+ContextScope——这是否可以看作一种设计模式?
相信大家对TransactionScope都比较熟悉。通过TransactionScope,我们可以很容易地将一组操作纳入同一个事务中;或者说TransactionScope创建一个基于事务的上下文范围,在这个范围内共享一个相同的环境事务(Ambient Transaction)。我个人觉得这体现了一种可以重用的模式,即本篇文章介绍的Context+ContextScope模式,这种模式旨在一定范围内创建一个可以共享的上下文信息。
蒋金楠
2022/05/09
1740
Java中是否直接可以使用enum进行传输
我们在进行传输的时候 会有一些状态值,如Status为1代表删除,为0代表失败或者怎么样的。只传输一个)0或者1过去给第三方(此处不包括给前端),如果没有契约第三方会不认识你这个是什么意思,那我们在平时写业务逻辑的时候使用枚举很轻易就知道了什么状态什么值。所以我们在构建DTO对象的时候里面放一个枚举来表示。
袁新栋-jeff.yuan
2020/08/26
4K0
在restful api模式上使用JWT
在header头里面增加Authorization。在服务端验证的时候回通过取得这个值来验证回话的有效。
友儿
2022/09/11
8950
Google击败Oracle,Android可以正常使用Java API
在旧金山,历经两周审讯,三天审议,周四联邦陪审团宣布:Google所使用的Android操作系统未侵犯甲骨文的Java版权,重新实现的37个Java API在法律规定的“合理使用”范围之内。 在为期
我是攻城师
2018/05/14
1.2K0
Redis是否可以存图片、视频?
前几天看到某大型家电工厂的工业互联网系统架构图,发现用MongoDB存储图片及视频。那Redis同样也是Json类型的远程数据字典服务器,也可以用于存储图片、视频。实际Redis可以用512MB的空间存储用于存储字符串型的数据。
希望的田野
2019/09/24
9.8K0
Redis是否可以存图片、视频?
Docker容器是否可以改变世界?
2016年了,很多大牛开始预测技术趋势,其中一个普遍的观点我也很认同: Docker会更加流行,会改变程序世界 2015年的上半年我接触了Docker,熟悉之后,真有一点震惊的感觉,太方便了,可以解决很多问题 Container 通常翻译为容器,但还有另一个意思,就是“集装箱” 集装箱是21世纪最伟大的发明之一,它改变了世界货物运输体系,造就了一个高度自动化、标准化、低成本的物流体系,促进了经济的全球化发展 程序界也出现了同样的一个箱子,就是 Docker容器 Docker的核心特点 Docker是一个开源
dys
2018/04/03
6660
Docker容器是否可以改变世界?
10个金融图标库,帮助你构建可视化的金融应用程序
图表库正变得越来越流行。小型开发团队只需导入HTML5 图表库和 JS 库即可构建具有数据可视化的全功能金融应用程序。
程序那些事儿
2023/03/07
2.4K0
10个金融图标库,帮助你构建可视化的金融应用程序
容器是否可以取代虚机?
在 Docker 诞生之初,它常常被放在虚拟机技术的对立面,甚至还有过 Docker 将替代虚拟机的夸大宣传,在许多集群以及虚拟化方案设计的讨论中,也总会将两者拿来比较一番利弊。
孙杰
2019/10/29
2.4K0
Spark是否可以完全取代Hadoop
谈到大数据,相信大家对Hadoop和Apache Spark这两个名字并不陌生。然而,最近业界有一些人正在大张旗鼓的宣扬Hadoop将死,Spark将立。他们究竟是危言耸听、哗众取宠,还是眼光独到堪破
企鹅号小编
2018/02/02
1.9K0
Spark是否可以完全取代Hadoop
go 中 struct 是否可以比较?
今天来水一篇,最近比较忙,一直没有时间写 go 相关的,今天从一个小问题入手,来说说 struct 的比较问题。
LinkinStar
2022/09/01
8620
StreamingPro 可以暴露出原生API给大家使用
我们知道StreamingPro 是一个完全SQL/Script化的,基于Spark平台的一套生产力工具。但是不可避免的,我们可能希望直接操作SqlContext或者使用原生的DataFrame API。 这里我们通过script 让大家支持这个功能:
用户2936994
2018/08/27
2940
MediaCodec判断是否可以采用硬解码
具体的类型对应关系可以查看相关文档,这里在Android源码MediaCodec.createDecoderByType()里面有一些相关的对应支持类型。
曾大稳
2018/09/11
2.2K0
是否可以删除 WinSxS 文件夹
一个常见问题是,“是否可以删除 WinSxS 文件夹来重新获得磁盘空间?” 简短的答案是“否”。但是,可以使用 Windows 中内置的工具来减小 WinSxS 文件夹的大小。
Windows技术交流
2020/04/13
5.3K0

相似问题

Tradingview -绘制大量数据

12

如何在Tradingview api中使用将来的时间戳绘制形状?

12

是否可以将外部数据导入Tradingview?

1100

TradingView策略API地址

13

Pine脚本- Tradingview绘制每日矩形

133
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档