【原创】Scrapyd 的 .net 客户端

最近项目需要部署Scrapy爬虫,采用最简单的Scrapyd服务进行部署,基于.net core 进行了客户端的封装。

1)Scrapyd API文档:http://scrapyd.readthedocs.io/en/latest/api.html

2)使用HttpClient进行交互

比较麻烦的是部署爬虫所需要的使用 HttpClient 上传文件的代码,使用了  “MultipartFormDataContent”  对象进行上传,添加字符串内容,及StreamContent,直接可以将MVC中的File对象传入,不用自行处理临时文件。

 var content = new MultipartFormDataContent("Upload-----" + Guid.NewGuid().ToString().Replace("-", ""));

                content.Add(new StringContent(project), "\"project\"");
                content.Add(new StringContent(version), "\"version\"");
                content.Add(new StreamContent(eggStream), "\"egg\"", "\"" + project + ".egg" + "\"");

                var resp = client.PostAsync("addversion.json", content).Result;

                var strResult = resp.Content.ReadAsStringAsync().Result;

                return JsonConvert.DeserializeObject<AddVersionResponse>(strResult);

完整代码

  1 using System;
  2 using System.Collections.Generic;
  3 using System.IO;
  4 using System.Linq;
  5 using System.Net.Http;
  6 using System.Text;
  7 using Newtonsoft.Json;
  8 using Scrapyd.Client.Response;
  9
 10 namespace Scrapyd.Client
 11 {
 12     /// <summary>
 13     /// A Client used to communicate with the Scrapyd Daemon
 14     /// </summary>
 15     public class ScrapydClient
 16     {
 17         private readonly string _host;
 18         private readonly int _port;
 19
 20         public ScrapydClient(string host, int port)
 21         {
 22             _host = host;
 23             _port = port;
 24         }
 25
 26         /// <summary>
 27         /// 查询状态
 28         /// </summary>
 29         /// <returns></returns>
 30         public DaemonStatusResponse QueryStatus()
 31         {
 32             HttpClient client = new HttpClient()
 33             {
 34                 BaseAddress = new Uri($"http://{_host}:{_port}")
 35             };
 36
 37             try
 38             {
 39                 var strResult = client.GetStringAsync("daemonstatus.json").Result;
 40
 41                 var jresult = JsonConvert.DeserializeObject<DaemonStatusResponse>(strResult);
 42                 return jresult;
 43             }
 44             catch (Exception e)
 45             {
 46                 return new DaemonStatusResponse { status = "failed", message = e.Message };
 47             }
 48         }
 49
 50         public AddVersionResponse AddVersion(string project, string version, Stream eggStream)
 51         {
 52             if (string.IsNullOrEmpty(project)) throw new ArgumentNullException(nameof(project));
 53             if (eggStream == null) throw new ArgumentNullException(nameof(eggStream));
 54
 55             var client = new HttpClient()
 56             {
 57                 BaseAddress = new Uri($"http://{_host}:{_port}")
 58             };
 59
 60             try
 61             {
 62                 var content = new MultipartFormDataContent("Upload-----" + Guid.NewGuid().ToString().Replace("-", ""));
 63
 64                 content.Add(new StringContent(project), "\"project\"");
 65                 content.Add(new StringContent(version), "\"version\"");
 66                 content.Add(new StreamContent(eggStream), "\"egg\"", "\"" + project + ".egg" + "\"");
 67
 68                 var resp = client.PostAsync("addversion.json", content).Result;
 69
 70                 var strResult = resp.Content.ReadAsStringAsync().Result;
 71
 72                 return JsonConvert.DeserializeObject<AddVersionResponse>(strResult);
 73             }
 74             catch (Exception e)
 75             {
 76                 return new AddVersionResponse { status = "failed", message = e.Message };
 77             }
 78         }
 79
 80         public ScheduleResponse ScheduleJob(string project, string spider,
 81             string setting = "",
 82             string jobid = "",
 83             string version = "",
 84             Dictionary<string, string> arguments = null)
 85         {
 86             if (string.IsNullOrEmpty(project)) throw new ArgumentNullException(nameof(project));
 87             if (string.IsNullOrEmpty(spider)) throw new ArgumentNullException(nameof(spider));
 88
 89
 90             var client = new HttpClient()
 91             {
 92                 BaseAddress = new Uri($"http://{_host}:{_port}")
 93             };
 94
 95             try
 96             {
 97                 var data = new Dictionary<string, string>()
 98                 {
 99                     {"project", project},
100                     {"spider", spider}
101                 };
102
103                 if (!string.IsNullOrEmpty(jobid))
104                 {
105                     data.Add("jobid", jobid);
106                 }
107                 if (!string.IsNullOrEmpty(setting))
108                 {
109                     data.Add("setting", setting);
110                 }
111
112                 if (!string.IsNullOrEmpty(version))
113                 {
114                     data.Add("_version", version);
115                 }
116
117                 if (arguments != null && arguments.Count > 0)
118                 {
119                     foreach (var argument in arguments)
120                     {
121                         data.Add(argument.Key, argument.Value);
122                     }
123                 }
124
125                 var strResult =
126                     client.PostAsync("schedule.json", new FormUrlEncodedContent(data))
127                         .Result.Content.ReadAsStringAsync()
128                         .Result;
129
130                 return JsonConvert.DeserializeObject<ScheduleResponse>(strResult);
131
132             }
133             catch (Exception e)
134             {
135                 return new ScheduleResponse { status = "failed", message = e.Message };
136             }
137         }
138
139         public CancelResponse CancelJob(string project, string jobid)
140         {
141             if (string.IsNullOrEmpty(project)) throw new ArgumentNullException(nameof(project));
142             if (string.IsNullOrEmpty(jobid)) throw new ArgumentNullException(nameof(jobid));
143
144
145             var client = new HttpClient()
146             {
147                 BaseAddress = new Uri($"http://{_host}:{_port}")
148             };
149
150             try
151             {
152                 var content = new FormUrlEncodedContent(new Dictionary<string, string>()
153                 {
154                     {"project", project},
155                     {"job", jobid}
156                 });
157                 var strResult = client.PostAsync($"/cancel.json", content).Result.Content.ReadAsStringAsync().Result;
158
159                 return JsonConvert.DeserializeObject<CancelResponse>(strResult);
160
161             }
162             catch (Exception e)
163             {
164                 return new CancelResponse { status = "failed", message = e.Message };
165             }
166         }
167
168         public ListProjectsResponse ListProjects()
169         {
170             try
171             {
172                 var client = new HttpClient
173                 {
174                     BaseAddress = new Uri($"http://{_host}:{_port}")
175                 };
176                 var result = client.GetStringAsync("listprojects.json").Result;
177                 return JsonConvert.DeserializeObject<ListProjectsResponse>(result);
178             }
179             catch (Exception e)
180             {
181                 return new ListProjectsResponse { status = "failed", message = e.Message };
182             }
183         }
184
185         public ListVersionsResponse ListVersions(string project)
186         {
187             if (string.IsNullOrEmpty(project)) throw new ArgumentNullException(nameof(project));
188
189             try
190             {
191                 var client = new HttpClient
192                 {
193                     BaseAddress = new Uri($"http://{_host}:{_port}")
194                 };
195
196                 var result = client.GetStringAsync($"listversions.json?project={project}").Result;
197                 return JsonConvert.DeserializeObject<ListVersionsResponse>(result);
198             }
199             catch (Exception e)
200             {
201                 return new ListVersionsResponse { status = "failed", message = e.Message };
202             }
203         }
204
205         public ListSpidersResponse ListSpiders(string project, string version = "")
206         {
207             if (string.IsNullOrEmpty(project)) throw new ArgumentNullException(nameof(project));
208
209             try
210             {
211                 var client = new HttpClient
212                 {
213                     BaseAddress = new Uri($"http://{_host}:{_port}")
214                 };
215
216                 var result = client.GetStringAsync($"listspiders.json?project={project}&_version={version}").Result;
217                 return JsonConvert.DeserializeObject<ListSpidersResponse>(result);
218             }
219             catch (Exception e)
220             {
221                 return new ListSpidersResponse { status = "failed", message = e.Message };
222             }
223         }
224
225         public ListJobsResponse ListJobs(string project)
226         {
227             if (string.IsNullOrEmpty(project)) throw new ArgumentNullException(nameof(project));
228
229             try
230             {
231                 var client = new HttpClient
232                 {
233                     BaseAddress = new Uri($"http://{_host}:{_port}")
234                 };
235
236                 var result = client.GetStringAsync($"listjobs.json?project={project}").Result;
237                 return JsonConvert.DeserializeObject<ListJobsResponse>(result);
238             }
239             catch (Exception e)
240             {
241                 return new ListJobsResponse { status = "failed", message = e.Message };
242             }
243         }
244
245         public ScrapydResponse DeleteVersion(string project, string version)
246         {
247             if (string.IsNullOrEmpty(project)) throw new ArgumentNullException(nameof(project));
248             if (string.IsNullOrEmpty(version)) throw new ArgumentNullException(nameof(version));
249
250             var client = new HttpClient()
251             {
252                 BaseAddress = new Uri($"http://{_host}:{_port}")
253             };
254
255             try
256             {
257                 var data = new Dictionary<string, string>()
258                 {
259                     {"project", project},
260                     {"version", version}
261                 };
262
263                 var strResult =
264                     client.PostAsync("delversion.json", new FormUrlEncodedContent(data))
265                         .Result.Content.ReadAsStringAsync()
266                         .Result;
267
268                 return JsonConvert.DeserializeObject<ScrapydResponse>(strResult);
269
270             }
271             catch (Exception e)
272             {
273                 return new ScrapydResponse { status = "failed", message = e.Message };
274             }
275         }
276
277         public ScrapydResponse DeleteProject(string project)
278         {
279             if (string.IsNullOrEmpty(project)) throw new ArgumentNullException(nameof(project));
280
281
282             var client = new HttpClient()
283             {
284                 BaseAddress = new Uri($"http://{_host}:{_port}")
285             };
286
287             try
288             {
289                 var data = new Dictionary<string, string>()
290                 {
291                     {"project", project}
292                 };
293
294                 var strResult =
295                     client.PostAsync("delproject.json", new FormUrlEncodedContent(data))
296                         .Result.Content.ReadAsStringAsync()
297                         .Result;
298
299                 return JsonConvert.DeserializeObject<ScrapydResponse>(strResult);
300
301             }
302             catch (Exception e)
303             {
304                 return new ScrapydResponse { status = "failed", message = e.Message };
305             }
306         }
307
308     }
309
310 }

博客地址 : http://www.cnblogs.com/mobwiz/

时间: 2024-08-12 14:48:14

【原创】Scrapyd 的 .net 客户端的相关文章

Scrapy学习-25-Scrapyd部署spider

Scrapyd部署爬虫项目 github项目  https://github.com/scrapy/scrapyd  官方文档  http://scrapyd.readthedocs.org/  安装scrapyd  http://scrapyd.readthedocs.io/en/stable/install.html  运行 # 在虚拟环境中使用scrapd命令 # scrapyd是一个服务器监听在本地的6800端口 scrapyd 安装scrapd客户端 pip install scrap

微信七年回顾:历经多少质疑和差评,才配拥有今天的强大

本文原作者: 夏之南,感谢原作者的分享. 1.前言 不知不觉,微信已经诞生七年了. 从第一版到现在,微信的演变史,很像一部创业史,很好地诠释了创业者能经得起多少质疑和差评,才配拥有多大的成功. 编者注:微信作为移动端IM的标杆,无论是产品定义还是技术追求(关于微信团队对技术的极致追求,可以在即时通讯网找到很多微信团队分享的文章,从文字中完全可以理解微信团队的技术追求),都值得广大即时通讯技术开发者学习. 就像我在前天的文章<为什么说即时通讯社交APP创业就是一个坑?>中回复的一样:"

腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

本文来自腾讯前端开发工程师" wendygogogo"的技术分享,作者自评:"在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦." 1.GIF格式的历史 GIF ( Graphics Interchange Format )原义是"图像互换格式",是 CompuServe 公司在1987年开发出的图像文件格式,可以说是互联网界的老古董了. GIF 格式可以存储多幅彩色图像,如果将这些图像((https://www.q

【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南

申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 [email protected]:点击进入 MobileIMSDK的Android客户端SDK文档:点击进入 学习交流 讨论学习和资料区:点此进入 推荐 移动端即时通讯交流: 215891622 推荐 bug/建议发送至:[email protected] [写在前面] MobileIMSDK的An

【原创】我所理解的自动更新-客户端更新流程

创建更新线程,跟ui主线程通过message进行交互.1,去http://version.mygame.com/check.php? channelid=%d&appver=%d&resver=%d获取客户端最新版本信息.用curl获取,代码如下,至于curl的具体参数,man或者搜索引擎会告诉你答案 1 static size_t funcGetHttpText(void *ptr, size_t size, size_t nmemb, void *userdata) { 2 size_

[原创]Ubuntu下 使用scrapyd+Supervisor管理爬虫

1. 安装 scrapyd pip install scrapyd 2. 安装 scrapyd 客户端 scrapyd-client pip install scrapyd-client 3. 安装 supervisor. 这里一定要加sudo,否则会安装失败.我是root用户登录的,不知道为什么一定要加sudo? sudo pip install supervisor 4. 创建 supervisor 配置文件 echo_supervisord_conf > /etc/supervisord.

第4章4节《MonkeyRunner源码剖析》ADB协议及服务: ADB命令行客户端使用简介(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 从前面几个小节我们知道ADB命令行客户端是存在与主机端的一个命令,用户可以使用该命令来发送服务请求到ADB服务器,ADB服务器再判断该服务请求是主机服务请求还是本地服务请求来决定是否应该将请求传送给远程adbd守护进程

[原创] zabbix学习之旅四:mail客户端安装

相信大家使用zabbix的最主要目的就是当被监控机器发生故障时,能通过zabbix获得第一时间的报警提醒.zabbix常用的报警媒介有email,短信,jabber和脚本,这其中脚本类型最为灵活,尤其当邮件服务器.短信服务器不与zabbix server在同一台服务器时,自定义脚本基本上成为我们唯一可靠的方式. 在本文中,我们将在zabbix server上安装邮件客户端,并以脚本方式将报警信息通过邮件发出来,若以后想做短信提醒.微信提醒,技术路径都是一样的. 安装msmtp msmtp是一个S

(原创)优酷android客户端 下载中 bug 解决

在网络情况不好的情况下,优酷android客户端下载视频会终止,用户放弃下载点击 删除该任务以后,切换到网络好的情况下进行下载,会显示该视频已在下载队列里,然后客户端UI界面却什么都看不到.导致用户根本无法下载. 其实优酷的下载都是使用读文件形式的 在优酷android的文件目录那里,(目前不考虑挂在SD卡和其他存储优化)就是内存设备/youku/offinedata里有很多下载视频的文件夹,里面有文件夹创建的时间.图片.flv形式的分集.info文件.youku.m3u8文件 下载信息(包括下