我正在从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 crawl 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文件并将废弃结果写入其中。
答案 0 :(得分:1)
这就是写入文件的方式。只有当磁盘已满时,才会有一个缓冲区写入磁盘。
例如,在一个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)是一件好事。您的items文件最终将获得输出,但您可能希望将格式更改为默认的jsonlines
(不需要-t
参数),每行得到一个json对象。它是一种使用频率很高的流媒体格式。
您可以轻松阅读jsonlines
(.jl
分机号码):
import json
for line in open('items.jl'):
data = json.loads(line)
# do stuff with data
甚至包括head
+ json.tool
或jq
等其他工具(参见[2]):
$ head -1 items.jl | python -m json.tool
$ jq -I . items.jl
到目前为止,我还没有看到任何问题,有大量的工作将项目写入.jl
文件(或任何其他格式)。然而,如果你的工作被杀,你将丢失缓冲区中的最后一项。这可以通过将项目存储在数据库或类似的东西中来解决。
答案 1 :(得分:0)
scrapy crawl myspider -o item.json -t json
仅在抓取时保存抓取的结果。我不必等待爬行才能完成。在爬虫运行时我可以看到文件item.json的内容
所以不需要包含用于将获取的数据写入蜘蛛文件的代码。