一个Python小白5个小时爬虫经历 【续】
前言
昨天实现了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个小时爬虫经历 【续】的更多相关文章
- 一个Python小白5个小时爬虫经历
前言 最近业余在做一个基于.NET Core的搜索项目,奈何基层代码写好了,没有看起来很华丽的数据供测试.很巧的也是博客搜索,于是乎想到了博客园.C#也能做做页面数据抓取的,不过在博客园看到的大部分都 ...
- 一个Python小白如何快速完成爬虫
很人或多或少都听说过python爬虫,但不知道如何通过python爬虫来爬取自己想要的内容,今天我就给大家说一个爬虫教程来实现自己第一次python爬虫. 环境搭建 既然用python,那么自然少不了 ...
- 一个python小白的学习之路
本人是个网管,在佛山工作,现在已经学习了一段时间python了,还是学开基础,但近段时间有一点的突破出来了,找到了一个很好的自学视频,等自己有能力了就想找一个特训班试试.已经看了视频两个星期了,有小小 ...
- python小白的初步爬虫
前序: 最近工作不是很忙,领导突然找我谈话,说是谈话,其实就是分配活呗.果不其然,很快进入正题, 给了我一个网址链接,然后说需要商品的信息...巴拉巴拉.好吧,去做吧. 我当时的内心是崩溃的,pyt ...
- 一个python爬虫小程序
起因 深夜忽然想下载一点电子书来扩充一下kindle,就想起来python学得太浅,什么“装饰器”啊.“多线程”啊都没有学到. 想到廖雪峰大神的python教程很经典.很著名.就想找找有木有pdf版的 ...
- 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求
第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...
- 我的第一个python web开发框架(21)——小结
这个小网站终于成功上线,小白除了收获一笔不多的费用外,还得到女神小美的赞赏,心中满满的成就感.这一天下班后,他请老菜一起下馆子,兑现请吃饭的承诺,顺便让老菜点评一下. 小白:老大,在你的指导下终于完成 ...
- python小白入门
阅读目录 一python介绍 二安装python解释器 三第一个python程序 四变量 五用户与程序交互 六基本数据类型 七格式化输出 八基本运算符 九流程控制之if...else 十流程控制之wh ...
- Python小白的数学建模课-A3.12 个新冠疫情数模竞赛赛题与点评
新冠疫情深刻和全面地影响着社会和生活,已经成为数学建模竞赛的背景帝. 本文收集了与新冠疫情相关的的数学建模竞赛赛题,供大家参考,欢迎收藏关注. 『Python小白的数学建模课 @ Youcans』带你 ...
随机推荐
- DTCoreText
背景:使用DTCoreText实现epub阅读器的内容排版 基础准备:coretext,HTML+CSS渲染机制,epub文件格式 一:ios端epub实现:主要是两种,coretext,webvie ...
- C++的封装性
C++的封装性 C++的阶段,我想根据C++的一些特有的特性分别写一些专题,每个专题我都捎带讲一些语法,当然不会很多,我还是会像C语言那样,内存结构贯穿始终,有汇编就有真相…… 本专题,我们讲述封装性 ...
- Linux 下如何安装 JDK ,以 Ubuntu 为例。
http://www.cnblogs.com/memory4young/p/ubuntu-install-jdk.html 一.下载 首先,当然是要下载了. 地址:http://www.oracle. ...
- 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 ...
- GitHub优秀的Android 开源项目
GitHub上优秀Android开源项目 转载自 : http://my.eoe.cn/sisuer/archive/3348.html http://my.eoe.cn/sisuer/archive ...
- iOS 添加导航栏两侧按钮
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"首页" style ...
- java_web学习(12)JDBC
数据持久化 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的 ...
- PHP格式化字符串函数 sprintf()
定义和用法 sprintf() 函数把格式化的字符串写入一个变量中. 语法 sprintf(format,arg1,arg2,arg++) 参数 描述 format 必需.转换格式. arg1 必需. ...
- systemd的命令systemctl set-property testSpeed CPUQuota=10%
总结 systemd 的资源限制一般要写到unit文件中,但是,现在测试发现会有 被值被覆盖的现象:经过排查发现是,没有 使用systemd的接口,凡是使用echo "" > ...
- [ Android 五种数据存储方式之一 ] —— SharedPreferences存储数据
SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数. 主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceS ...