前言

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

代码重构

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

import match
import os
import datetime
import json def writeToTxt(list_name,file_path):
try:
#这里直接write item 即可,不要自己给序列化在写入,会导致json格式不正确的问题
fp = open(file_path,"w+",encoding='utf-8')
l = len(list_name)
i = 0
#添加左中括号
fp.write('[')
for item in list_name:
#直接将项目write到 json文件中
fp.write(item)
#添加每一项之间的逗号
if i<l-1:
fp.write(',\n')
i += 1
fp.write(']')
#添加右中括号
fp.close()
except IOError:
print("fail to open file") #def getStr(item):
#之前用这段代码处理item,后来发现,不用处理,直接保存反而更好,自己处理了,会导致博客中乱七八糟的字符影响反序列化
# return str(item).replace('\'','\"')+',\n' def saveBlogs():
for i in range(1,2):
print('request for '+str(i)+'...')
blogs = match.blogParser(i,10)
#保存到文件
path = createFile()
writeToTxt(blogs,path+'/blog_'+ str(i) +'.json')
print('第'+ str(i) +'页已经完成')
return 'success' def createFile():
date = datetime.datetime.now().strftime('%Y-%m-%d')
path = '/'+date
if os.path.exists(path):
return path
else:
os.mkdir(path)
return path result = saveBlogs()
print(result)

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

  

转战.NET CORE

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

  

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

  定义IFileManager 接口

public interface IFileManager
{
/// <summary>
/// 读取文件,获取文件内容
/// </summary>
/// <param name="fileHandler"></param>
void HandleFile(Action<string> fileHandler);
}

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

     public IFileProvider FileProvider { get; private set; }

        public FileManager(IFileProvider fileProvider)
{
this.FileProvider = fileProvider;
} public void HandleFile(Action<string> fileHandler)
{
//通过FileProvider读取文件,遍历
foreach (var fileInfo in this.FileProvider.GetDirectoryContents(""))
{
//读取文件内容(json)
string result = ReadAllTextAsync(fileInfo.Name).Result;
//执行处理
fileHandler(result);
} }

  以上为FileManger部分代码。

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

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

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

    public static IServiceProvider RegisterServices() {

            string folder = DateTime.Now.ToString("yyyy-MM-dd");
var service = new ServiceCollection()
//定位到文件夹,当前日期
.AddSingleton<IFileProvider>(new PhysicalFileProvider($@"D:\{folder}"))
.AddSingleton<IFileManager, FileManager>()
//序列化器
.AddSingleton<ISerializer,CnBlogsSerializer>()
.BuildServiceProvider();
return service;
}

运行结果

  

  至于为什么是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. S3C2440硬件连接解析

    S3c2440是三星公司推出的一款基于ARM920T的处理器,采用ARM内核,不同于单片机,无片上rom与ram,必须搭配相应的外围电路进行使用,现在,让我们从零开始进行这一块MCU的学习,为了入门简 ...

  2. 写一个程序,统计自己C语言共写了多少行代码。ver2.00

    概要 完成一个程序,作用是统计一个文件夹下面所有文件的代码行数.输入是一个文件夹的绝对路径,输出是代码行数.所以此程序的新特点有两个: 统计某一文件夹下的所有文件: 可以任意指定本机硬盘上任何位置的某 ...

  3. c#中反射

    在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释 ...

  4. java系列--类和对象

    一.成员属性,构造方法,成员方法 1.类名首字母一般大写 2.方法名的首字母一般是小写,使用驼峰法(匈牙利法) myCry, 下划线法 my_cry 3.方法的声明没有函数体(接口,抽象类),数据类型 ...

  5. javascript AOP

    Function.prototype.bind = function(b) { var a = this; return function() { a.apply(b, arguments) } }; ...

  6. iOS 之 OC开发实战

    iOS 开发之登陆 iOS 程序初始一个带导航栏的视图 iOS 添加导航栏两侧按钮 iOS UITabBar

  7. Android开发:View的几种布局及实践

    引言 View的布局显示方式有下面几种:线性布局(Linear Layout).相对布局(Relative Layout).表格布局(Table Layout).网格视图(Grid View).标签布 ...

  8. lepus3.7 天兔监控安装手册 CentOS6.5+mysql5.6

    lepus3.7 天兔监控安装配置手册 CentOS6.5+mysql5.6 整体环境 192.168.1.250为监控机 192.168.1.248为被监控机 安装LAMP环境 [root@HE3~ ...

  9. EF 4.1 学习资源汇总

    微软发布了EF 4.1以后,结合asp.net mvc3,网站的开发可谓是非常方便.但是作为一种新技术,如何开始你的学习之路呢? 首先是关于 EF 4.1的安装和介绍,以及nuget的使用. http ...

  10. V8编程入门

    本文档介绍了V8引擎的一些关键概念,并提供了例子hello world指引你入门. Hello World 让我们看一个Hello World的示例,它将一个字符串参数作为JavaScript语句,执 ...