前言

  昨天实现了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. MongoDB的$type操作符

    字段类型定义: db.col.find({"title" : {$type : 2}})

  2. session锁问题

    碰到个问题,在使用了session时(如用户登录),如果当前请求时间过长,再执行其他请求都不会有响应,查找了网上资料发现,这个是session锁的问题 目前我们的程序基本流程如下: (1)加载Sess ...

  3. centos服务器设置代理上网的方法

    这里以centos7.0为例,记录代理服务器设置过程: 1.全局的代理设置: vi /etc/profile 添加下面内容 http_proxy = http://username:password@ ...

  4. dp中表示无限取的写法

    dp[i][j]=dp[i-a[i][j]+dp[i-a[i]][j-1]; 其中前一项j不变表示j这一项无限取

  5. 属性(Attribute)资源

    前面已经介绍过自定义View组件的开发,自定义View组件与Android系统提供的View组件一样,即可在Java代码中使用,也可在XML界面布局代码中使用. 当在XML布局文件中使用Android ...

  6. --@angularjs-- $location.path('/login')-$location服务用法示例

    $httpProvider interceptor .factory('auth403', ['$rootScope', '$q', '$location', function auth403($ro ...

  7. JSP page指令

    JSP page指令: JSP文件: <%@ page language="java"%> <%@ page import="java.util.*&q ...

  8. FMS中的onStatus

    在FlashCom中的Camera, Microphone, LocalConnection, NetConnection,NetStream和 SharedObject对象都提供了事件响应,onst ...

  9. C#如何给PDF文档添加注释

    整理文档时,我们可能会需要在一些或一段文字上添加注释加以说明,那如何以编程的方式实现呢?本文将实例讲述C#中如何使用免费组件给PDF文档添加文本注释,包括自由文本注释.自由文本注释能允许我们自定义它的 ...

  10. jQuery实践-别踩白块儿网页版

    ▓▓▓▓▓▓ 大致介绍 终于结束了考试,放假回家了.这次的别踩白块儿网页版要比之前做的 jQuery实践-网页版2048小游戏 要简单一点,基本的思路都差不多. 预览:别踩白块网页版 这篇博客并不是详 ...