淘宝地址爬取及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. Maven(三)在Eclipse中使用Maven与Maven坐标

    这一篇讲解一下在eclipse中使用maven,在一些高版本的eclipse中是自带maven插件的.所以这里就不在讲解怎么安装插件了. 接下来我们创建一个MavenFirst项目 一.在Eclips ...

  2. 队列的存储结构的实现(C/C++实现)

    存档 #include "iostream.h" #include "stdlib.h" #define max 20 typedef char elemtyp ...

  3. codechef [snackdown2017 Onsite Final] Fusing Weapons

    传送门 题目描述 大厨最近迷上了一款勇者斗恶龙的游戏. 游戏每局开始前,会有 N 件武器摆成一圈.每件武器有一个整数的等级.大厨可以选择两件 相邻的等级相同(不妨设同为 A 级)的武器,将它们合成.这 ...

  4. 【Java学习笔记之三】java中的变量和常量

    变量和常量 在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量. 在实际的程序中,可以根据 ...

  5. BZOJ 3097: Hash Killer I【构造题,思维题】

    3097: Hash Killer I Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 963  Solved: 36 ...

  6. Python系列之入门篇——HDFS

    Python系列之入门篇--HDFS 简介 HDFS (Hadoop Distributed File System) Hadoop分布式文件系统,具有高容错性,适合部署在廉价的机器上.Python ...

  7. 访问 Tomcat支配项目去除项目名和端口号通过IP地址(或域名)访问

    Tomcat去除项目名称和端口号 1. 去除端口号 将端口设为80: <Connector port="80" protocol="HTTP/1.1" c ...

  8. rexray在CentOS上不能创建ceph rbd的docker volume问题定位

    背景 我们通过docker的rexray插件来创建ceph rbd设备的docker volume,但总提示创建失败. # docker volume create --driver=rexray - ...

  9. SDK是什么?什么是SDK

    从 SDK导航 看到的 应该比较专业! SDK的英文全名是:software development kit,翻译成中文的意思就是"软件开发工具包" 通俗一点的理解,是指由第三方服 ...

  10. VisualSFM+PMVS生成稠密点云

    利用相机拍摄一个场景不同角度的图片,使用VisualSFM能够得到稀疏点云,如果想要得到稠密点云,可以在VisualSFM中加入PMVS的应用程序,PMVS会作为一个插件运行将稀疏点云插成稠密的点云. ...