[开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [四] JSON数据解析
2017-04-14 10:26
603 查看
[DotnetSpider 系列目录]
一、初衷与架构设计二、基本使用
三、配置式爬虫
四、JSON数据解析与配置系统
五、如何做全站采集
场景模拟
接上一篇, 假设由于漏存JD SKU对应的店铺信息。这时我们需要重新完全采集所有的SKU数据吗?补爬的话历史数据就用不了了。因此,去京东页面上找看是否有提供相关的接口。查找API请求接口
安装 Fiddler, 并打开在谷歌浏览器中访问: http://list.jd.com/list.html?cat=1315,1343,9719
在Fiddler查找一条条的访问记录,找到我们想要的接口
编写爬虫
分析返回的数据结果,我们可以先写出数据对象的定义(观察Expression的值已经是JsonPath查询表达式了,同时Type必须设置为Type = SelectorType.JsonPath)。另外需要注意的是,这次的爬虫是更新型爬虫,就是说采集到的数据补充回原表,那么就一定要设置主键是什么,即在数据类上添加主键的定义[Schema("jd", "sku_v2", TableSuffix.Monday)] [EntitySelector(Expression = "$.[*]", Type = SelectorType.JsonPath)] [Indexes(Primary = "sku")] public class ProductUpdater : ISpiderEntity { [StoredAs("sku", DataType.String, 25)] [PropertySelector(Expression = "$.pid", Type = SelectorType.JsonPath)] public string Sku { get; set; } [StoredAs("shopname", DataType.String, 100)] [PropertySelector(Expression = "$.seller", Type = SelectorType.JsonPath)] public string ShopName { get; set; } [StoredAs("shopid", DataType.String, 25)] [PropertySelector(Expression = "$.shopId", Type = SelectorType.JsonPath)] public string ShopId { get; set; } }
定义Pipeline的类型为Update
context.AddEntityPipeline(new MySqlEntityPipeline { ConnectString = "Database='taobao';Data Source= ;User ID=root;Password=1qazZAQ!;Port=4306", Mode = PipelineMode.Update });
由于返回的数据中还有一个json()这样的pagging,所以需要先做一个截取操作,框架提供了PageHandler接口,并且我们实现了大量常用的Handler,用于HTML的解析前的一些处理操作,因此完整的代码如下
public class JdShopDetailSpider : EntitySpiderBuilder
{
protected override EntitySpider GetEntitySpider()
{
var context = new EntitySpider(new Site())
{
TaskGroup = "JD SKU Weekly",
Identity = "JD Shop details " + DateTimeUtils.MondayRunId,
CachedSize = 1,
ThreadNum = 8,
Downloader = new HttpClientDownloader
{
DownloadCompleteHandlers = new IDownloadCompleteHandler[]
{
new SubContentHandler
{
Start = "json(",
End = ");",
StartOffset = 5,
EndOffset = 0
}
}
},
PrepareStartUrls = new PrepareStartUrls[]
{
new BaseDbPrepareStartUrls()
{
Source = DataSource.MySql,
ConnectString = "Database='test';Data Source= localhost;User ID=root;Password=1qazZAQ!;Port=3306",
QueryString = $"SELECT * FROM jd.sku_v2_{DateTimeUtils.MondayRunId} WHERE shopname is null or shopid is null order by sku",
Columns = new [] {new DataColumn { Name = "sku"} },
FormateStrings = new List<string> { "http://chat1.jd.com/api/checkChat?my=list&pidList={0}&callback=json" }
}
}
};
context.AddEntityPipeline(new MySqlEntityPipeline
{
ConnectString = "Database='taobao';Data Source=localhost ;User ID=root;Password=1qazZAQ!;Port=4306",
Mode = PipelineMode.Update
});
context.AddEntityType(typeof(ProductUpdater), new TargetUrlExtractor
{
Region = new Selector { Type = SelectorType.XPath, Expression = "//*[@id=\"J_bottomPage\"]" },
Patterns = new List<string> { @"&page=[0-9]+&" }
});
return context;
}
[Schema("jd", "sku_v2", TableSuffix.Monday)] [EntitySelector(Expression = "$.[*]", Type = SelectorType.JsonPath)] [Indexes(Primary = "sku")] public class ProductUpdater : ISpiderEntity { [StoredAs("sku", DataType.String, 25)] [PropertySelector(Expression = "$.pid", Type = SelectorType.JsonPath)] public string Sku { get; set; } [StoredAs("shopname", DataType.String, 100)] [PropertySelector(Expression = "$.seller", Type = SelectorType.JsonPath)] public string ShopName { get; set; } [StoredAs("shopid", DataType.String, 25)] [PropertySelector(Expression = "$.shopId", Type = SelectorType.JsonPath)] public string ShopId { get; set; } }
}
相关文章推荐
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [四] JSON数据解析与配置系统
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [五] 如何做全站采集?
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [二] 基本使用
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [五] 如何做全站采集?
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [三] 配置式爬虫
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计 - ModestMT.Zou - 博客园
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [三] 模型配置方式实现爬虫
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [二] 最基本,最自由的使用方式
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
- [初探爬虫框架: DotnetSpider] 一 采集博客园
- 【开源.NET】轻量级内容管理框架Grissom.CMS(第三篇解析配置文件和数据以转换成 sql)
- 【转载】使用Json比用string返回数据更友好,也更面向对象一些 |Asp.net MVC 2.0 + Unity 2.0(IoC) + EF4.0 实例:RoRoWoBlog 开源项目框架代码
- 【开源.NET】轻量级内容管理框架Grissom.CMS(第三篇解析配置文件和数据以转换成 sql)
- 【开源.NET】轻量级内容管理框架Grissom.CMS(第三篇解析配置文件和数据以转换成 sql)
- 节前送礼:PDF.NET(PWMIS数据开发框架)V3.0版开源
- 站内搜索(主要技术点:Luncene.Net搜索引擎核心,Log4Net:日志,定时框架:quartz.Net,Jquery,Json,AJAX)
- 一起谈.NET技术,ASP.NET缓存全解析4:应用程序数据缓存