淘宝地址爬取及UI展示

淘宝国家省市区街道获取

参考 foxiswhotaobao-area-php 部分代码,改由c#重构。

引用如下:

  • Autofac
  • MediatR
  • Swagger
  • HangFire 生成街道数据爬取任务。

演示

https://akinix.github.io/Taobao-Area-CSharp/index.html

前端源码稍后上传,请关注 deepfunc


Release

生成的release中包含省市区县.js和街道.json.

下载地址


目的

为了方便获取中国大陆及港澳台省市区县街道相关数据,根据 淘宝地址js,解析并生成相关数据。


设置

所有设置都在 appsettings.json

说明 默认值
TaobaoJsVersion 淘宝js的版本,方便淘宝js更新后修改 6.0.14
TaobaoAreaJsUrl 默认值中有占位符,会替换为TaobaoJsVersion的值 https://g.alicdn.com/vip/address/{0}/index-min.js
JsDirectoryName 生成的相关js及json文件的目录 js
JsTemplate 生成的js模版 见代码
AreaPickerDataJsName 生成的js文件名,默认值中有占位符,会替换为TaobaoJsVersion的值 area.picker.data.{0}.js
TaobaoStreetUrl 爬取街道使用的url https://lsp.wuliu.taobao.com/locationservice/addr/output_address_town_array.do?l1={0}&l2={1}&l3={2}
TempDirectoryName 临时目录,下载淘宝js用 temp

使用

  • 克隆或下载代码,打开解决方案。

  • F5Ctrl+F5 调试代码。

  • 访问http://localhost:55516/ ,默认会进入Swagger页面。

  • 再打开一个新页面,访问Hangfire面板 http://localhost:55516/hangfire/jobs/enqueued, 可以查看爬取街道的任务执行情况.

  • 如需演示整个流程,请在Swagger页面,执行 /api/v1/TaobaoAreas/ReBuild,该逻辑会重新下载js及重新爬取街道信息;执行/api/v1/TaobaoAreas/Build则会根据js是否存在来下载,根据json是否存在来爬取数据.


设计说明

概述

核心逻辑说明:

详细

  1. 项目基于Asp.net Core,使用了几个核心包:

    Autofac.Extensions.DependencyInjection:替换core的默认Ioc容器.

    MediatR:用于业务逻辑解耦.

    Swashbuckle.AspNetCore:生成Api的文档,供测试.

    HangFire:后台任务,处理爬取街道逻辑.

    Hangfire.MemoryStorage:只使用内存存储Hangfire任务

  2. 配置TaobaoAreaSettings.cs代码如下:

       public class TaobaoAreaSettings
{
public string TempDirectoryName { get; set; } public string TaobaoJsVersion { get; set; } public string TaobaoAreaJsUrl { get; set; } public string JsTemplate { get; set; } public string AreaPickerDataJsName { get; set; } public string TaobaoStreetUrl { get; set; } public string JsDirectoryName { get; set; }
}

详细说明参见上面 设置

  1. 上下文AreaContextService,代码片段如下,详情请查看github源码,该类注入为InstancePerLifetimeScope,每次请求会创建一个新对象,注入相关代码查看AutofacModules\ApplicationModule.cs
   builder.Register(c => new AreaContextService())
.As<AreaContextService>()
.InstancePerLifetimeScope();

其内部主要维护整个逻辑执行过程中需要的数据

   public bool IsForce { get; private set; } // 是否强制重新生成js及重新爬取街道数据

   public Dictionary<string, object> MainDictionary { get; set; } // 主数据字典:最终生成js时需要的数据

   public string ProvinceString { get; private set; }

   public string GangAoString { get; private set; }
//... 拆分所需字段
  1. MediatR相关服务注入:
   builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly)
.AsImplementedInterfaces(); // 注入IRequestHandler和INotificationHandler的相关实现
// Send -> RequestHandler
// Publish -> NotificationHandler
var mediatrOpenTypes = new[]
{
typeof(IRequestHandler<,>),
typeof(IRequestHandler<>),
typeof(INotificationHandler<>),
}; foreach (var mediatrOpenType in mediatrOpenTypes)
{
builder
.RegisterAssemblyTypes(typeof(MediatorModule).GetTypeInfo().Assembly)
.AsClosedTypesOf(mediatrOpenType)
.AsImplementedInterfaces();
} // 参照官网
builder.Register<SingleInstanceFactory>(context =>
{
var componentContext = context.Resolve<IComponentContext>();
return t => { object o; return componentContext.TryResolve(t, out o) ? o : null; };
}); builder.Register<MultiInstanceFactory>(context =>
{
var componentContext = context.Resolve<IComponentContext>(); return t =>
{
var resolved = (IEnumerable<object>)componentContext.Resolve(typeof(IEnumerable<>).MakeGenericType(t));
return resolved;
};
}); builder.RegisterGeneric(typeof(LoggingBehavior<,>)).As(typeof(IPipelineBehavior<,>));

流程说明

淘宝地址爬取及UI展示的更多相关文章

  1. Python post请求模拟登录淘宝并爬取商品列表

    一.前言 大概是一个月前就开始做淘宝的爬虫了,从最开始的用selenium用户配置到selenium模拟登录,再到这次的post请求模拟登录.一共是三篇博客,记录了我爬取淘宝网的经历.期间也有朋友向我 ...

  2. [分享]ip地址爬取过滤的shell

    http://www.hbbzy.me/分享ip地址爬取过滤的shell #!/bin/base #ip zhi地址匹配 #获取最新的ip地址 #author:haifeng #wget ftp:// ...

  3. 淘宝封装的一款ui 非常不错

    好用的淘宝ui http://m.sui.taobao.org/demos/  手机端访问地址

  4. python+echarts+flask实现对全国疫情数据的爬取并可视化展示

    用Python进行数据爬取并存储到数据库,3.15学习总结(Python爬取网站数据并存入数据库) - 天岁 - 博客园 (cnblogs.com) 通过echarts+flask实现数据的可视化展示 ...

  5. vue仿淘宝地址选择组件

    Vue组件:省市区地址选择组件 <template> <div v-show="addressSelectShow" :style="{'left': ...

  6. IP地址爬取

    ip_spider.py= = = #!/usr/bin/python # coding: utf-8 import os import sys import requests import re i ...

  7. selenium实现淘宝的商品爬取

    一.问题 本次利用selenium自动化测试,完成对淘宝的爬取,这样可以避免一些反爬的措施,也是一种爬虫常用的手段.本次实战的难点: 1.如何利用selenium绕过淘宝的登录界面 2.获取淘宝的页面 ...

  8. Python 爬虫知识点 - 淘宝商品检索结果抓包分析(续一)

    通过前一节得出地址可能的构建规律,如下: https://s.taobao.com/search?data-key=s&data-value=44&ajax=true&_ksT ...

  9. ip地址库 新浪,淘宝

    原文连接地址:http://www.9958.pw/post/city_ip function getAddressFromIp($ip){ $urlTaobao = 'http://ip.taoba ...

随机推荐

  1. C陷阱:求数组长度

    // 这是一篇导入进来的旧博客,可能有时效性问题. 程序中,当我们建立了一个int型数组:int a[]={1,2,3,4,5,6};随后我们可能需要知道它的长度,此时可以用这种方法:length = ...

  2. UML建模之时序图(Sequence Diagram)

    一.时序图简介(Brief introduction) 二.时序图元素(Sequence Diagram Elements) 角色(Actor) 对象(Object) 生命线(Lifeline) 控制 ...

  3. 移动端APP列表点透事件处理方法

    关于点透事件这里不再赘述,如果不清楚的可以上网搜一搜,或者看小火柴的这篇文章. 这里是自己在做移动端时,在列表滑动的时候,遇到的点透问题.出现这个问题的来由是因为在转场的时候,各个手机的转场效果不一样 ...

  4. 学习笔记-express路径问题

    在页面渲染成功之后,报错出现静态文件css样式引用路径出错,于是我就根据express api文档,托管静态文件作出修改,最后全是徒劳.于是我又从引用开始找起,<link rel="s ...

  5. UVALive 3882 - And Then There Was One【约瑟夫问题】

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  6. Codeforces 626D Jerry's Protest(暴力枚举+概率)

    D. Jerry's Protest time limit per test:2 seconds memory limit per test:256 megabytes input:standard ...

  7. BZOJ1786: [Ahoi2008]Pair 配对/1831: [AHOI2008]逆序对

    这两道题是一样的. 可以发现,-1变成的数是单调不降. 记录下原有的逆序对个数. 预处理出每个点取每个值所产生的逆序对个数,然后dp转移. #include<cstring> #inclu ...

  8. mui 区域三级联动

    <link href="../../css/mui.picker.css" rel="stylesheet" /><link href=&qu ...

  9. [国嵌攻略][054][NandFlash驱动设计_写]

    Nand Flash支持按页写和随机写两种方式,在下面实现的是按页写.闪存在写数据时,只能写入1,不能写入0,所以写函数必须和擦除函数一起使用,并且擦除函数是按块擦除. /************** ...

  10. React Native学习(六)—— 轮播图

    本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...