gpt4 book ai didi

python - 使用 scrapy 将抓取的项目保存到 json/csv/xml 文件

转载 作者:行者123 更新时间:2023-11-28 18:45:05 27 4
gpt4 key购买 nike

我在学习Scrapy (网络爬虫框架)来自他们的 official doc .
通过遵循示例和文档,我创建了我的蜘蛛以使用站点地图抓取数据

from scrapy.contrib.spiders import SitemapSpider
from scrapy.selector import Selector
from MyProject1.items import MyProject1Item

class MySpider(SitemapSpider):
name="myspider"
sitemap_urls = ['http://www.somesite.com/sitemap.xml']
sitemap_follow = ['/sitemapbrowsesection\d+']
count=0
def parse(self, response):
self.count=self.count+1
item=MyProject1Item()
sel=Selector(response)
item["exp"]=sel.xpath('/html/head/title/text()').extract()
print str(self.count)+":\t"+response.url
print sel.xpath('/html/head/title/text()').extract()
print "\n\n"

我可以通过运行命令在带有日志的屏幕上看到抓取的结果
scrapy 抓取 myspider
我可以通过在命令中添加选项将抓取的结果保存到 json/csv/xml 文件
scrapy crawl myspider -o item.json -t json 获取结果 json文件。

我的问题是只有当 scrapy 完成爬行时,scrapy 才会将抓取的结果转储到 item.json。意味着必须等到爬行结束。所以对于大项目,我将不得不等待非常非常长的时间,因为我猜 scrapy 会在所有爬行完成后将抓取的结果写入 json 文件。

我希望 scrapy 立即或几乎立即或在抓取过程中写入 json 文件,这样我就可以看到在 scrapy 运行时抓取的网站的结果。

我知道 scrapy 中一定有一些我无法捕捉到的内置东西。我试图从 http://doc.scrapy.org/en/latest/topics/feed-exports.html 获得帮助

http://doc.scrapy.org/en/latest/topics/exporters.html
但无法解决我的问题。所以我正在寻找一些帮助或示例代码,否则我必须向 parse(self, response) 函数添加几行以创建 json/csv 文件并将抓取的结果写入其中。

最佳答案

这就是写入文件的方式。有一个缓冲区只有在它已满时才会写入磁盘。

例如,在一个shell中用python打开一个文件:

$ ipython

In [1]: fp = open('myfile', 'w')

在另一个shell中监控文件内容:

$ tail -f myfile

回到python shell,写一些内容:

In [2]: _ = [fp.write("This is my file content\n") for i in range(100)]

在我的例子中,我没有在 tail 输出中看到任何内容。写更多内容:

In [3]: _ = [fp.write("This is my file content\n") for i in range(100)]

现在我在 tail 输出中看到了这些行。

事实上,您可以更改文件缓冲(参见[1])。再次打开一个文件:

$ ipython

In [1]: fp = open('myfile', 'w', buffering=0)

在另一个shell中监控文件内容:

$ tail -f myfile

写点东西看看tail输出:

In [2]: fp.write("Hello there\n")

最好启用缓冲(减少磁盘 I/O)。您的项目文件最终将获得输出,但您可能希望将格式更改为默认的 jsonlines(不需要 -t 参数),这样您将获得一个 json 对象每行。这是一种被广泛使用的流媒体格式。

您可以轻松阅读jsonlines(.jl 扩展名):

import json

for line in open('items.jl'):
data = json.loads(line)
# do stuff with data

甚至其他工具,如 head + json.tooljq(参见 [2]):

$ head -1 items.jl | python -m json.tool
$ jq -I . items.jl

到目前为止,将项目写入 .jl 文件(或任何其他格式)时,我还没有发现任何问题。然而,如果您的工作被终止,您将丢失缓冲区中的最后一项。这可以通过将项目存储在数据库或类似的东西中来解决。

[1] http://docs.python.org/2/library/functions.html#open

[2] http://stedolan.github.io/jq/manual/

关于python - 使用 scrapy 将抓取的项目保存到 json/csv/xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21557117/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com