前言

  昨天实现了python简单的数据采集之后本来还挺高兴的,结果发现在.NET读取txt文件后反序列化总是报错。具体错误原因好像是从txt读取数据之后会自动加一个隐藏的字符串,没错,肉眼看不见,就导致不是合法的json格式,最终失败。不说了,反序列化浪费了我大量的时间,下面进入正题。

代码重构

  问题就出来保存上,所以保存的文件我首先把 .txt 换成 .json 文件,后来在仔细看生成的文档,发现少了中括号[]和每条数据之间的逗号。于是乎,修改后的代码如下。

  1. import match
  2. import os
  3. import datetime
  4. import json
  5.  
  6. def writeToTxt(list_name,file_path):
  7. try:
  8. #这里直接write item 即可,不要自己给序列化在写入,会导致json格式不正确的问题
  9. fp = open(file_path,"w+",encoding='utf-8')
  10. l = len(list_name)
  11. i = 0
  12. #添加左中括号
  13. fp.write('[')
  14. for item in list_name:
  15. #直接将项目write到 json文件中
  16. fp.write(item)
  17. #添加每一项之间的逗号
  18. if i<l-1:
  19. fp.write(',\n')
  20. i += 1
  21. fp.write(']')
  22. #添加右中括号
  23. fp.close()
  24. except IOError:
  25. print("fail to open file")
  26.  
  27. #def getStr(item):
  28. #之前用这段代码处理item,后来发现,不用处理,直接保存反而更好,自己处理了,会导致博客中乱七八糟的字符影响反序列化
  29. # return str(item).replace('\'','\"')+',\n'
  30.  
  31. def saveBlogs():
  32. for i in range(1,2):
  33. print('request for '+str(i)+'...')
  34. blogs = match.blogParser(i,10)
  35. #保存到文件
  36. path = createFile()
  37. writeToTxt(blogs,path+'/blog_'+ str(i) +'.json')
  38. print('第'+ str(i) +'页已经完成')
  39. return 'success'
  40.  
  41. def createFile():
  42. date = datetime.datetime.now().strftime('%Y-%m-%d')
  43. path = '/'+date
  44. if os.path.exists(path):
  45. return path
  46. else:
  47. os.mkdir(path)
  48. return path
  49.  
  50. result = saveBlogs()
  51. print(result)

  最终生成了完美的json。下图只粘贴其中一项,当然是我昨天发的那篇啦。PS 前篇地址:http://www.cnblogs.com/panzi/p/6421826.html

  

转战.NET CORE

  终于把数据格式搞定了。下面就是到数据的事情了,很简单,不过在写代码过程中顺便看了一下 .NET Core的文件系统[3]:由PhysicalFileProvider构建的物理文件系统 。然后进行实战。首先,json都存放在在文件中,肯定要遍历文件了。

  

  从那篇博客中copy部分代码,来实现文件系统的访问和解析。

  定义IFileManager 接口

  1. public interface IFileManager
  2. {
  3. /// <summary>
  4. /// 读取文件,获取文件内容
  5. /// </summary>
  6. /// <param name="fileHandler"></param>
  7. void HandleFile(Action<string> fileHandler);
  8. }

  然后实现接口内容,主要呢,第一,遍历文件夹得到文件,然后输出相应的文件内容。第二,反序列化文本内容转成实体。第三,加入到Elastisearch中。

  1.      public IFileProvider FileProvider { get; private set; }
  2.  
  3. public FileManager(IFileProvider fileProvider)
  4. {
  5. this.FileProvider = fileProvider;
  6. }
  7.  
  8. public void HandleFile(Action<string> fileHandler)
  9. {
  10. //通过FileProvider读取文件,遍历
  11. foreach (var fileInfo in this.FileProvider.GetDirectoryContents(""))
  12. {
  13. //读取文件内容(json)
  14. string result = ReadAllTextAsync(fileInfo.Name).Result;
  15. //执行处理
  16. fileHandler(result);
  17. }
  18.  
  19. }

  以上为FileManger部分代码。

  然后反序列化得到的文本内容。

  1.      //遍历已经搜集好的json文档
  2. manager.HandleFile(json =>
  3. {
  4. //反序列化得到实体
  5. var entities = serializer.JsonToEntities<DotNetLive.Search.Entities.CnBlogs.Blog>(json);
  6. //批量添加到ES中
  7. int result = search.IndexMany(entities);
  8.  
  9. Console.WriteLine("加入" + result + "数据");
  10. });

  当然,程序启动的时候要注册相应的服务。

  1.     public static IServiceProvider RegisterServices() {
  2.  
  3. string folder = DateTime.Now.ToString("yyyy-MM-dd");
  4. var service = new ServiceCollection()
  5. //定位到文件夹,当前日期
  6. .AddSingleton<IFileProvider>(new PhysicalFileProvider($@"D:\{folder}"))
  7. .AddSingleton<IFileManager, FileManager>()
  8. //序列化器
  9. .AddSingleton<ISerializer,CnBlogsSerializer>()
  10. .BuildServiceProvider();
  11. return service;
  12. }

运行结果

  

  至于为什么是180条,因为我在python获取接口的时候写的是 for in range(1,10),每次请求接口返回20条,请求了9次,然后合并成一个json文件存储。

  好的,最后在看一下ES中的数据:

  

总结

  纸上得来终觉浅,绝知此事要躬行。这句话一点没错,看和做真是两码事。不过还好,数据采集阶段就告一段落了。不扯了,跑程序去了。小伙伴们下期再见。

  github代码参见:https://github.com/dotnetlive/dotnetlive.search/tree/master/src/Tools/cnblogs  PS:有兴趣的小伙伴可以加入dotnetlive团队。无薪,可学习,哈哈。

一个Python小白5个小时爬虫经历 【续】的更多相关文章

  1. 一个Python小白5个小时爬虫经历

    前言 最近业余在做一个基于.NET Core的搜索项目,奈何基层代码写好了,没有看起来很华丽的数据供测试.很巧的也是博客搜索,于是乎想到了博客园.C#也能做做页面数据抓取的,不过在博客园看到的大部分都 ...

  2. 一个Python小白如何快速完成爬虫

    很人或多或少都听说过python爬虫,但不知道如何通过python爬虫来爬取自己想要的内容,今天我就给大家说一个爬虫教程来实现自己第一次python爬虫. 环境搭建 既然用python,那么自然少不了 ...

  3. 一个python小白的学习之路

    本人是个网管,在佛山工作,现在已经学习了一段时间python了,还是学开基础,但近段时间有一点的突破出来了,找到了一个很好的自学视频,等自己有能力了就想找一个特训班试试.已经看了视频两个星期了,有小小 ...

  4. python小白的初步爬虫

    前序:  最近工作不是很忙,领导突然找我谈话,说是谈话,其实就是分配活呗.果不其然,很快进入正题, 给了我一个网址链接,然后说需要商品的信息...巴拉巴拉.好吧,去做吧. 我当时的内心是崩溃的,pyt ...

  5. 一个python爬虫小程序

    起因 深夜忽然想下载一点电子书来扩充一下kindle,就想起来python学得太浅,什么“装饰器”啊.“多线程”啊都没有学到. 想到廖雪峰大神的python教程很经典.很著名.就想找找有木有pdf版的 ...

  6. 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求

    第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...

  7. 我的第一个python web开发框架(21)——小结

    这个小网站终于成功上线,小白除了收获一笔不多的费用外,还得到女神小美的赞赏,心中满满的成就感.这一天下班后,他请老菜一起下馆子,兑现请吃饭的承诺,顺便让老菜点评一下. 小白:老大,在你的指导下终于完成 ...

  8. python小白入门

    阅读目录 一python介绍 二安装python解释器 三第一个python程序 四变量 五用户与程序交互 六基本数据类型 七格式化输出 八基本运算符 九流程控制之if...else 十流程控制之wh ...

  9. Python小白的数学建模课-A3.12 个新冠疫情数模竞赛赛题与点评

    新冠疫情深刻和全面地影响着社会和生活,已经成为数学建模竞赛的背景帝. 本文收集了与新冠疫情相关的的数学建模竞赛赛题,供大家参考,欢迎收藏关注. 『Python小白的数学建模课 @ Youcans』带你 ...

随机推荐

  1. DTCoreText

    背景:使用DTCoreText实现epub阅读器的内容排版 基础准备:coretext,HTML+CSS渲染机制,epub文件格式 一:ios端epub实现:主要是两种,coretext,webvie ...

  2. C++的封装性

    C++的封装性 C++的阶段,我想根据C++的一些特有的特性分别写一些专题,每个专题我都捎带讲一些语法,当然不会很多,我还是会像C语言那样,内存结构贯穿始终,有汇编就有真相…… 本专题,我们讲述封装性 ...

  3. Linux 下如何安装 JDK ,以 Ubuntu 为例。

    http://www.cnblogs.com/memory4young/p/ubuntu-install-jdk.html 一.下载 首先,当然是要下载了. 地址:http://www.oracle. ...

  4. Max Sum of Rectangle No Larger Than K

    Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...

  5. GitHub优秀的Android 开源项目

    GitHub上优秀Android开源项目 转载自 : http://my.eoe.cn/sisuer/archive/3348.html http://my.eoe.cn/sisuer/archive ...

  6. iOS 添加导航栏两侧按钮

    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"首页" style ...

  7. java_web学习(12)JDBC

    数据持久化       持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的 ...

  8. PHP格式化字符串函数 sprintf()

    定义和用法 sprintf() 函数把格式化的字符串写入一个变量中. 语法 sprintf(format,arg1,arg2,arg++) 参数 描述 format 必需.转换格式. arg1 必需. ...

  9. systemd的命令systemctl set-property testSpeed CPUQuota=10%

    总结 systemd 的资源限制一般要写到unit文件中,但是,现在测试发现会有 被值被覆盖的现象:经过排查发现是,没有 使用systemd的接口,凡是使用echo "" > ...

  10. [ Android 五种数据存储方式之一 ] —— SharedPreferences存储数据

    SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数. 主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceS ...