python-仅获得对抓取到JSON文件的一行输出
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-仅获得对抓取到JSON文件的一行输出,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4843字,纯文字阅读大概需要7分钟。
内容图文
![python-仅获得对抓取到JSON文件的一行输出](/upload/InfoBanner/zyjiaocheng/660/99bc2031134040c38b04e0f3cf77bc68.jpg)
好的,所以我是一般编程人员,并且专门为此目的而使用Scrapy.我编写了一个搜寻器,以从pinterest.com上的引脚获取数据.问题是我以前从要爬网的页面上的所有引脚获取数据,但是现在我只获得第一个引脚的数据.
我认为问题出在管道或蜘蛛本身.在将“ strip”添加到蜘蛛以摆脱空白之后,某些事情发生了变化,但是当我将其更改回去时,我得到了相同的输出,但是有了空白.这是蜘蛛:
from scrapy.spider import Spider
from scrapy.selector import Selector
from Pinterest.items import PinterestItem
class PinterestSpider(Spider):
name = "pinterest"
allowed_domains = ["pinterest.com"]
start_urls = ["http://www.pinterest.com/llbean/pins/"]
def parse(self, response):
hxs = Selector(response)
item = PinterestItem()
items = []
item ["pin_link"] = hxs.xpath("//div[@class='pinHolder']/a/@href").extract()[0].strip()
item ["repin_count"] = hxs.xpath("//em[@class='socialMetaCount repinCountSmall']/text()").extract()[0].strip()
item ["like_count"] = hxs.xpath("//em[@class='socialMetaCount likeCountSmall']/text()").extract()[0].strip()
item ["board_name"] = hxs.xpath("//div[@class='creditTitle']/text()").extract()[0].strip()
items.append(item)
return items
这是我的管道:
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals
from scrapy.contrib.exporter import JsonLinesItemExporter
class JsonLinesExportPipeline(object):
def __init__(self):
dispatcher.connect(self.spider_opened, signals.spider_opened)
dispatcher.connect(self.spider_closed, signals.spider_closed)
self.files = {}
def spider_opened(self, spider):
file = open('%s_items.json' % spider.name, 'w+b')
self.files[spider] = file
self.exporter = JsonLinesItemExporter(file)
self.exporter.start_exporting()
def spider_closed(self, spider):
self.exporter.finish_exporting()
file = self.files.pop(spider)
file.close()
def process_item(self, item, spider):
self.exporter.export_item(item)
return item
当我使用命令“ scrapy crawl pinterest”时,这是我在JSON文件中得到的输出:
"pin_link": "/pin/94716398388365841/", "board_name": "Outdoor Fun", "like_count": "14", "repin_count": "94"}
这正是我想要的输出,但是我只能从一个针脚得到,而不能从页面上的所有针脚得到.我花了很多时间阅读类似的问题,但找不到类似的问题.关于什么是错的任何想法?提前致谢!
编辑:哦,我猜是因为剥离功能之前的[0]?对不起,我才意识到这可能是问题所在.
编辑:嗯,那不是问题.我很确定它必须与strip功能有关,但是我似乎无法正确使用它来获取多个引脚作为输出.解决方案可以作为这个问题的一部分吗?:Scrapy: Why extracted strings are in this format?我看到一些重叠,但是我不知道如何使用它.
编辑:好的,所以当我像这样修改蜘蛛时:
from scrapy.spider import Spider
from scrapy.selector import Selector
from Pinterest.items import PinterestItem
class PinterestSpider(Spider):
name = "pinterest"
allowed_domains = ["pinterest.com"]
start_urls = ["http://www.pinterest.com/llbean/pins/"]
def parse(self, response):
hxs = Selector(response)
sites = hxs.xpath("//div[@class='pinWrapper']")
items = []
for site in sites:
item = PinterestItem()
item ["pin_link"] = site.select("//div[@class='pinHolder']/a/@href").extract()[0].strip()
item ["repin_count"] = site.select("//em[@class='socialMetaCount repinCountSmall']/text()").extract()[0].strip()
item ["like_count"] = site.select("//em[@class='socialMetaCount likeCountSmall']/text()").extract()[0].strip()
item ["board_name"] = site.select("//div[@class='creditTitle']/text()").extract()[0].strip()
items.append(item)
return items
它的确给了我几行输出,但是显然它们都具有相同的信息,因此它抓取了页面上引脚数的各项,但是都具有相同的输出:
{"pin_link": "/pin/94716398388371133/", "board_name": "Take Me Fishing", "like_count": "3", "repin_count": "21"}
{"pin_link": "/pin/94716398388371133/", "board_name": "Take Me Fishing", "like_count": "3", "repin_count": "21"}
{"pin_link": "/pin/94716398388371133/", "board_name": "Take Me Fishing", "like_count": "3", "repin_count": "21"}
{"pin_link": "/pin/94716398388371133/", "board_name": "Take Me Fishing", "like_count": "3", "repin_count": "21"}
等等
解决方法:
我没有用过Scrapy,所以这是一个疯狂的猜测.
您的选择器正在拉回多个结果.然后,您从每个列表中选择第一个值(带有切片[0]),创建一个名为item的PinterestItem,在返回该值之前将其附加到item列表中.选择器返回的所有可能结果似乎都没有循环.
因此,请提取所有结果,然后对其进行迭代以创建您的项目列表:
def parse(self, response):
hxs = Selector(response)
pin_links = hxs.xpath("//div[@class='pinHolder']/a/@href").extract()
repin_counts = hxs.xpath("//em[@class='socialMetaCount repinCountSmall']/text()").extract()
like_counts = hxs.xpath("//em[@class='socialMetaCount likeCountSmall']/text()").extract()
board_names = hxs.xpath("//div[@class='creditTitle']/text()").extract()
items = []
for pin_link, repin_count, like_count, board_name in zip(pin_links, repin_counts, like_counts, board_names):
item = PinterestItem()
item["pin_link"] = pin_link.strip()
item["repin_count"] = repin_count.strip()
item["like_count"] = like_count.strip()
item["board_name"] = board_name.strip()
items.append(item)
return items
内容总结
以上是互联网集市为您收集整理的python-仅获得对抓取到JSON文件的一行输出全部内容,希望文章能够帮你解决python-仅获得对抓取到JSON文件的一行输出所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。