ShoppingPeeker

这个项目是蜘蛛项目的可视化任务站点。

项目github地址:ShoppingPeeker

开发语言:C#

开发工具:Visual Studio 2017 +.Net Core2.1

运行平台:Linux/Windows

# 概述 ShoppingPeeker 是项目:ShoppingWebCrawler的可视化任务工具。

项目使用.net core2.x进行构建。可以运行在Windwos/Linux/Mac平台。

项目采用Socket通信模式,实现本地采集任务与蜘蛛服务器进行通信。稳定高效。

如何部署?

1、克隆ShoppingWebCrawler项目到本地。如:d:\src\ShoppingWebCrawler;

2、克隆ShoppingPeeker项目到本地。d:\src\ShoppingPeeker;

(注意:两个项目必须在同一个目录下,因为使用了文件编译引用!!!!)

3、启动蜘蛛 ShoppingWebCrawler。

4、使用visual studio 2017   或者cmd/powershell 进入项目文件夹   使用命令:dotnet build;dotnet run

5、恭喜,项目成功启动,示范站点的输入框,是一个根据输入的商品词,抓取对应电商平台的商品列表的功能示范!

项目构成

ShoppingPeeker.Web: .net core 2.x asp.net mvc 站点 插件模式: 不同的电商平台使用插件模式进行采集任务的解析。在站点启动的时候,扫描插件目录。对插件进行附加,并监视查询的变更!

数据持久化

基于Dapper的数据交互DataAccess.封装对Linq 方式,实现对原始表数据的 增删改查操作。

TCP 进行蜘蛛通信示范

封装TCP通信,基于ADP.NET的连接方式,上手简单容易,可配置。

基本通信:

var connStr = ConfigHelper.WebCrawlerSection.ConnectionStringCollection.First();

            using (var conn = new SoapTcpConnection(connStr))
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
} ///发送ping var str = conn.SendString(CommandConstants.CMD_Ping);
resut = string.Concat("time :", DateTime.Now.ToString(), "; tcp server response: ", str);
}

采集请求:

var connStrConfig = webArgs.SystemAttachParas["SoapTcpConnectionString"] as WebCrawlerConnection;

                    //重写解析地址-首页的分片jsonp地址
string urlOfSlicedJsonp = this.ResolveSlicedSearchPageSilcedUrl(webArgs, next_start, show_items);
webArgs.ResolvedUrl = new ResolvedSearchUrlWithParas { Url = urlOfSlicedJsonp };
using (var conn = new SoapTcpConnection(connStrConfig))
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
} //发送soap
var soapCmd = new SoapMessage() { Head = CommandConstants.CMD_FetchPage };
soapCmd.Body = JsonConvert.SerializeObject(webArgs);
var dataContainer = conn.SendSoapMessage(soapCmd);
if (null != dataContainer && dataContainer.Status == )
{
htmlItemsContent = dataContainer.Result;
}
else
{
StringBuilder errMsg = new StringBuilder("抓取网页请求失败!参数:");
errMsg.Append(soapCmd.Body);
if (null != dataContainer && !string.IsNullOrEmpty(dataContainer.ErrorMsg))
{
errMsg.Append(";服务端错误消息:")
.Append(dataContainer.ErrorMsg);
}
PluginContext.Logger.Error(errMsg.ToString());
}
}

数据交互示范

///

/// 增加 ///[TestMethod()] public void AddOneStudentsModelTest() {

        var model = new StudentsModel
{ Name = "你猜猜-" + DateTime.Now.ToString(),
Age = DateTime.Now.Second,
Sex = true,
Score = 55.98m,
Longitude = 555555.6666,
AddTime = DateTime.Now
}; var result = serviceOfStudents.AddOneStudentsModel(model); var watch = new System.Diagnostics.Stopwatch();
watch.Start(); model = new StudentsModel
{ Name = "你猜222222222猜-" + DateTime.Now.ToString(),
Age = DateTime.Now.Second,
Sex = true,
Score =6655.98m,
Longitude = ,
AddTime = DateTime.Now
}; result = serviceOfStudents.AddOneStudentsModel(model); watch.Stop(); Console.WriteLine(string.Format("real for insert one data use time is :{0} ms.", watch.ElapsedMilliseconds)); Assert.IsTrue(result > );
} /// <summary>
/// 批量增加
/// </summary> [TestMethod()]
public void AddMulitiStudentsModelsTest()
{
var lstData = new List<StudentsModel>();
var rand = new Random(DateTime.Now.Millisecond); for (int i = ; i < ; i++)
{
var model = new StudentsModel
{
Name = "你猜猜-" + Guid.NewGuid().ToString(),
Age = rand.Next(, ),
Sex = false,
Score = 33355.98m,
Longitude = ,
AddTime = DateTime.Now
};
lstData.Add(model);
}
var result = serviceOfStudents.AddMulitiStudentsModels(lstData);
Assert.IsTrue( == ); } /// <summary>
/// 更新数据实体-by主键
/// </summary> [TestMethod()]
public void UpdateOneStudentsModelTest()
{
var model = new StudentsModel
{
Id = ,
Age =
}; var result = serviceOfStudents.UpdateOneStudentsModel(model);
Assert.IsTrue(result);
} /// <summary>
/// 条件更新
/// 多个条件 and
///
/// </summary> [TestMethod()]
public void UpdateStudentsModelsByConditionTest()
{
var model = new StudentsModel
{
Age =
};
var result = serviceOfStudents.UpdateStudentsModelsByCondition(
model,
x => x.Id > && x.Name.Contains("你猜猜%")); Assert.IsTrue(result); } /// </summary>
[TestMethod()]
public void GetstudentsElementByIdTest()
{ var model = this.serviceOfStudents
.GetstudentsElementById(); Assert.IsTrue(null!= model); } /// <summary>
/// 条件获取
/// 或 /// </summary>
[TestMethod()]
public void GetfStudentsElementsByConditionTest()
{ var lstData = this.serviceOfStudents
.GetstudentsElementsByCondition(
x => x.Id == || x.Name.Contains("你猜猜%")
);//(x => x.PubSubWsAddr.LenFuncInSql() > 0); Assert.IsTrue(lstData.Count > ); lstData = this.serviceOfStudents
.GetstudentsElementsByCondition(null); Assert.IsTrue(lstData.Count > );
}
/// <summary>
/// 条件删除
/// </summary>
[TestMethod()]
public void DeleteMulitiservicesAddressByConditionTest()
{
//var result = this.serviceOfStudents
// .DeleteMulitiservicesAddressByCondition(x => x.PubSubWsAddr.LenFuncInSql() > 0); var result = this.serviceOfStudents
.DeleteMulitistudentsByCondition(
x => x.Id == || x.Name.Contains("你猜猜%")
);
Assert.IsTrue(result);
} //多个查询条件构建 (使用Lambda表达式构建 进行条件body的合并) [TestMethod()]
public void GetByMultipleConditionsTest()
{
//组合条件
var predicate = PredicateBuilder.CreatNew<StudentsModel>(); string id = "";
if (!string.IsNullOrEmpty(id) && id.ToInt() > )
{
predicate = predicate.And(s => s.Id <= id.ToInt());
} //开始组合表达式body
predicate = predicate.Or(s => s.Name.Contains("你猜猜-2%")); var model = this.serviceOfStudents.GetstudentsElementsByCondition(predicate); Assert.IsNotNull(model); } [TestMethod()]
public void GetStudentsModelsElementsByPagerAndConditionTest()
{
var pageSize = ;
var pageIndex = ;
var totalRecords = -;
var totalPages = -; var lstData = this.serviceOfStudents
.GetstudentsElementsByPagerAndCondition(pageIndex,
pageSize,
out totalRecords,
out totalPages, x => x.Id > ,//PubSubWsAddr.LenFuncInSql()
"Id",
OrderRule.DESC);
Assert.IsTrue(lstData.Count > ); }

联系作者

MyBlog:http://www.cnblogs.com/micro-chen/ 
QQ:1021776019

【ShoppingPeeker】-基于Webkit内核的爬虫蜘蛛引擎 ShoppingWebCrawler的姊妹篇-可视化任务Web管理的更多相关文章

  1. 【ShoppingWebCrawler】-基于Webkit内核的爬虫蜘蛛引擎概述

    写在开头 在各个电商平台发展日渐成熟的今天.很多时候,我们需要一些平台上的基础数据.比如:商品分类,分类下的商品详细,甚至业务订单数据.电商平台大多数提供了相应的业务接口.允许ISV接入,用来扩展自身 ...

  2. Webkit内核开源爬虫蜘蛛引擎

    C#开发的基于Webkit内核开源爬虫蜘蛛引擎 https://www.cnblogs.com/micro-chen/p/9075590.html 概述 在各个电商平台发展日渐成熟的今天.很多时候,我 ...

  3. 浅谈关于QT中Webkit内核浏览器

    关于QT中Webkit内核浏览器是本文要介绍的内容,主要是来学习QT中webkit中浏览器的使用.提起WebKit,大家自然而然地想到浏览器.作为浏览器内部的主要构件,WebKit的主要工作是渲染.给 ...

  4. [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析

    [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...

  5. 将webkit内核封装为duilib的浏览器控件

    转载请说明出处,谢谢~~ 原本的duilib是自带浏览器控件的,但是使用了IE内核,我在做仿酷狗音乐播放器时,在右侧乐库要用到浏览器控件,而我使用自带的IE控件却发现了不少缺点,这也是duilib一直 ...

  6. 八大Webkit内核浏览器

    列举出时下最流行的Webkit内核浏览器,所以我们并不会做出评测和对比.PS:本文列举的浏览器有一部分为IE+Webkit双核浏览器,如果您对其他IE内核浏览器很感兴趣<抛弃数据!用体验和感觉告 ...

  7. 【WebKit内核 CEF3 】 第一篇:下载分支代码并本地编译

    关于CEF  Chromium Embedded Framework 简单说就是  WebKit内核的 对外绑定. 当前主流浏览器内核 一.Trident内核代表产品Internet Explorer ...

  8. WebKit内核分析之Page

    参考地址:http://blog.csdn.net/dlmu2001/article/details/6213377 注:本系列博客是在原博主博客基础上增加了自己的理解和片段,可以看源博文获得清晰的结 ...

  9. iOS:WebKit内核框架的应用与解析

    原文:http://www.cnblogs.com/fengmin/p/5737355.html 一.摘要: WebKit是iOS8之后引入的专门负责处理网页视图的框架,其比UIWebView更加强大 ...

随机推荐

  1. js在字符串中提取数字

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Spring之对象依赖关系(依赖注入Dependency Injection)

    承接上篇: Spring中,如何给对象的属性赋值: 1:通过构造函数,如下所示: <!-- 1:构造函数赋初始值 --><bean id="user1" clas ...

  3. springbank 开发日志 一次因为多线程问题导致的applicationContext.getBean()阻塞

    几天前遇到的这个问题.由于交易是配置的,不同的交易是同一个类的不同实例,所以不可能提前将其以@autowired类似的方式注入到需要的类中 <op:transaction id="Re ...

  4. usaco 校园网

    题解: 显然当一个图上的点是一个环时能满足题目要求 那么我们来考虑怎么形成一个环 很显然的是要先缩点 缩完点就成为了森林,如何让森林成环呢? 考虑一下环上的点的入度出度一定都大于1 而连一条边可以增加 ...

  5. 在Ubuntu下解决 adb devices :???????????? no permissions 方法

    http://sdvdxl.blog.51cto.com/3845763/1126539 MODE表示读取模式,0666表示任何人都可以访问. 最后 adb devices查看

  6. k8s 关键字以及管理流程。

    一.流程图如下 二.用户通过kubectl提交需要运行的docker container(pod). 三.api server把请求存储在etcd里面. 四.scheduler(调度)扫描,分配机器. ...

  7. 为什么NULL指针也能访问成员函数?(但不能访问成员变量)

    查看更加详细的解析请参考这篇文章:http://blog.51cto.com/9291927/2148695 看一个静态绑定的例子: 1 #include <iostream> 2 3 u ...

  8. 算法进阶面试题04——平衡二叉搜索树、AVL/红黑/SB树、删除和调整平衡的方法、输出大楼轮廓、累加和等于num的最长数组、滴滴Xor

    接着第三课的内容和讲了第四课的部分内容 1.介绍二叉搜索树 在二叉树上,何为一个节点的后继节点? 何为搜索二叉树? 如何实现搜索二叉树的查找?插入?删除? 二叉树的概念上衍生出的. 任何一个节点,左比 ...

  9. flask源码剖析

    这段时间想重新写个自己的博客系统,又正好在看一些框架源码,然后就想要不顺便写个小框架吧,既然想写框架,要不再顺便写个orm吧,再写个小的异步Server吧..事实证明饭要一口一口吃 先梳理一下flas ...

  10. html/css实现阴影蒙版覆盖原网页并显示浮框的功能

    在提供用户修改资料/密码等功能的时候,往往希望给用户这样的使用体验,在不跳转,不弹框的情况下完成对这些功能的操作. 这可以通过一种效果来实现,在同一页面下阴影覆盖整个当前网页并使得原网页中元素无法使用 ...