小小的PHP能干啥

小小的PHP能干啥 查看完整档案

邢台编辑  |  填写毕业院校  |  填写所在公司/组织 张成林.中国 编辑
编辑

ERROR

个人动态

小小的PHP能干啥 赞了回答 · 1月29日

实战|省市区三级联动数据爬取

我记得有github 上有一个爬菜鸟物流的数据的脚本,可以爬取 五级数据

https://github.com/wi1dcard/c...

关注 2 回答 1

小小的PHP能干啥 提出了问题 · 1月29日

实战|省市区三级联动数据爬取

原文有步骤的源文章地址:
实战|省市区三级联动数据爬取

QueryList版本的三级联动数据爬取的源代码地址:
https://github.com/zhangcheng...

抛砖引玉,希望能有更多的QueryList实例和公开的实用数据地址共享。

另外我觉得应该改个名字,叫 php-html-parser
更贴切点、高端点吧。

本问题最佳答案为提供最给力的实例或者实用的数据地址的为最佳了。
标准为点赞数量。
不值得也不会发文章,所以就发个问题了。

关注 2 回答 1

小小的PHP能干啥 关注了标签 · 1月24日

querylist

QueryList是一套简洁、优雅、可扩展的PHP采集工具(爬虫),基于phpQuery

关注 45

小小的PHP能干啥 赞了文章 · 1月21日

实战|省市区三级联动数据爬取

前言

  最近收到客服反应,系统的省市区数据好像不准,并且缺了一些地区。经过询问同事得知,数据库内的数据是从老项目拷贝过来的,有些年头了。难怪会缺一些数据。正好最近在对接网商银行,发现网商提供了省市区的数据的接口。这就很舒服了哇,抄起键盘就是干,很快的就把同步程序写好了。

  然后在同步的过程中,发现网商提供的数据和数据库有些对不上。于是默默的打开淘宝京东添加收货地址,看看到底是谁错了。对比到后面发现都有些差异。这就很蛋疼了。看来这个时候谁都不能相信了,只能信国家了。于是我打开了中华人民共和国民政部网站来比对异常的数据。

  对比的过程中,石锤网商数据不准。值得的是表扬淘宝京东已经同步了最新的数据了。但是呢,我并没有找到它们的数据接口。为了修正系统的数据,只能自己爬取了。

锁定爬取目标

爬取地址如下:

https://preview.www.mca.gov.c...

  爬取原理很简单,就是解析HTML元素,然后获取到相应的属性值保存下来就好了。由于使用Java进行开发,所以选用Jsoup来完成这个工作。

<!-- HTML解析器 -->
<dependency>
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.13.1</version>
</dependency>

网页数据分析

  由于需要解析HTML才能取到数据,所以需要知道数据存储在什么元素上。我们可以打开chrom的控制台,然后选中对应的数据,即可查看存储数据的元素。

  通过分析,发现每一行数据都是存储在一个<tr>标签下。我们需要的 区域码区域名称存储在第一和第二个<td>内 。与此同时还要很多空白<td>标签,在编写代码是需要将其过滤掉。

定义基础代码

  先定义好我们的爬取目标,以及Area实体类。

public class AreaSpider{

    // 爬取目标
    private static final String TARGET = "http://preview.www.mca.gov.cn/article/sj/xzqh/2020/2020/202101041104.html";

    @Data
    @AllArgsConstructor
    private static class Area {

        // 区域码
        private String code;

        // 区域名称
        private String name;

        // 父级
        private String parent;

    }
}

爬虫代码编写

public static void main(String[] args) throws IOException{
  // 请求网页
  Jsoup.connect(TARGET).timeout(10000).get()
    // 筛选出 tr 标签
    .select("tr")
    // 筛选出 tr 下的 td 标签
    .forEach(tr -> tr.select("td")
    // 过滤 值为空的 td 标签
    .stream().filter(td -> StringUtils.isNotBlank(td.text()))
    // 输出结果
    .forEach(td -> System.out.println(td.text())));
}

解析结果

代码优化

  通过上面的代码,我们已经爬取到了页面上的数据。但是并没有达到我们的预期,所以进一步处理将其转换为Area实体。

public static void main(String[] args) throws IOException{
  // 请求网页
  List<Area> areaList = Jsoup.connect(TARGET).timeout(10000).get()
    // 筛选出 tr 标签
    .select("tr")
    // 筛选出 tr 下的 td 标签
    .stream().map(tr -> tr.select("td")
    // 过滤 值为空的 td 标签,并转换为 td 列表
    .stream().filter(td -> StringUtils.isNotBlank(td.text())).collect(Collectors.toList()))
    // 前面提到,区域码和区域名称分别存储在 第一和第二个td,所以过滤掉不符合规范的数据行。
    .filter(e -> e.size() == 2)
    // 转换为 area 对象
    .map(e -> new Area(e.get(0).text(), e.get(1).text(), "0")).collect(Collectors.toList());
  
    // 遍历数据
  areaList.forEach(area -> System.out.println(JSONUtil.toJsonStr(area)));
}

解析结果

  至此,离我们想要的数据还差了父级区域码 ,我们可以通过区域码计算出来。以河北省为例:河北省:130000石家庄市:130100长安区:130102可以发现规律:0000 结尾是省份,00是市。所以就有了如下代码:

private static String calcParent(String areaCode){
    // 省 - 针对第一行特殊处理
    if(areaCode.contains("0000") || areaCode.equals("行政区划代码")){
        return "0";
    // 市
    }else if (areaCode.contains("00")) {
        return String.valueOf(Integer.parseInt(areaCode) / 10000 * 10000);
    // 区
    }else {
        return String.valueOf(Integer.parseInt(areaCode) / 100 * 100);
    }
}

最终代码

public class AreaSpider{

    // 爬取目标
    private static final String TARGET = "http://preview.www.mca.gov.cn/article/sj/xzqh/2020/2020/202101041104.html";

    @Data
    @AllArgsConstructor
    private static class Area{

        // 区域码
        private String code;

        // 区域名称
        private String name;

        // 父级
        private String parent;

    }

    public static void main(String[] args) throws IOException{
        // 请求网页
        List<Area> areaList = Jsoup.connect(TARGET).timeout(10000).get()
                // 筛选出 tr 标签
                .select("tr")
                // 筛选出 tr 下的 td 标签
                .stream().map(tr -> tr.select("td")
                // 过滤 值为空的 td 标签,并转换为 td 列表
                .stream().filter(td -> StringUtils.isNotBlank(td.text())).collect(Collectors.toList()))
                // 前面提到,区域码和区域名称分别存储在 第一和第二个td,所以过滤掉不符合规范的数据行。
                .filter(e -> e.size() == 2)
                // 转换为 area 对象
                .map(e -> new Area(e.get(0).text(), e.get(1).text(), calcParent(e.get(0).text()))).collect(Collectors.toList());

        // 去除 第一行 "行政区划代码|单位名称"
        areaList.remove(0);

        areaList.forEach(area -> System.out.println(JSONUtil.toJsonStr(area)));
    }

    private static String calcParent(String areaCode){
        // 省 - 针对第一行特殊处理
        if(areaCode.contains("0000") || areaCode.equals("行政区划代码")){
            return "0";
        // 市
        }else if (areaCode.contains("00")) {
            return String.valueOf(Integer.parseInt(areaCode) / 10000 * 10000);
        // 区
        }else {
            return String.valueOf(Integer.parseInt(areaCode) / 100 * 100);
        }
    }
}

数据修正

  由于我们需要的是省市区三级数据联动,但是了直辖市只有两级,所以我们人工的给它加上一级。以北京市为例:变成了 北京 -> 北京市- >东城区,对于其他的直辖市也是同样的处理逻辑。

  修正好的数据奉上,有需要的小伙伴可以自取哦。

对于直辖市也可以做两级的,这个主要看产品的需求吧

总结

  总体来讲,这个爬虫比较简单,只有简单的几行代码。毕竟网站也没啥反扒的机制,所以很轻松的就拿到了数据。

结尾

  嘿嘿话说,你都爬过哪些网站呢?

  如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。

  我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!

查看原文

赞 11 收藏 6 评论 1

小小的PHP能干啥 关注了标签 · 2020-12-28

nginx

nginx(发音同engine x)是一款由俄罗斯程序员Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。

关注 6537

小小的PHP能干啥 赞了回答 · 2020-12-22

这个sdk中这个文件的使用方法是什么?

你指的是 @method 这个东西?

这个是 phpdocumenter 具体有哪些可以看看 https://www.phpdoc.org/ 这个网址

你发的这个文件,主要意义就是他的文件名,, 给 IDE使用,给用户完成提示.

另外,你说的每个分类文件夹下一个 composer.json ,这个可能涉及到阿里云的 openapi 的早期设计,,早期,阿里云开放平台里,只有你的账号申请并获批了某个服务的权限之后,后台才会给你展示对应服务的 api 的下载地址.我记得阿里的开放平台之前还有一个功能就是,如果你的权限特别多,下载 api 的时候,会有一个页面,让你选在你要下载的 sdk 的访问服务,然后你会下载一个压缩包,压缩包里只有你选在的服务的 sdk. 其实思想上都是分包了嘛,他现在 alibabacloud/sdk 这个包也就是其内部所有包的集合而已.

关注 3 回答 2

小小的PHP能干啥 赞了回答 · 2020-12-22

这个sdk中这个文件的使用方法是什么?

1、注释是作为提示用的,比如你在ide中调用的时候能自动提示和补全类型和名称,在一些动态加载的时候用的比较多
2、每个分类都是一个独立的模块,可以独立安装的,也可以打包安装,所以你会看到每个模块中都有个composer.json
3、没有什么优点,只是aliyun的sdk比较多,需要按需安装

关注 3 回答 2

小小的PHP能干啥 提出了问题 · 2020-12-22

这个sdk中这个文件的使用方法是什么?

标题不知道咋起了,随便起了一个。
涉及的文件地址如下:

aliyun/openapi-sdk-php/src/IdeHelper.php

https://github.com/aliyun/ope...

上面的文件中的注释中的这种写法是什么意思?
还有就是这个sdk的文件结构为什么这么设计,具体是指每个分类文件夹中都另外包含了composer.json文件。

我最主要为什么看源码的原因是,在自己发布composer的时候,用这种有什么优点吗。

另外:对贵公司的业务并无冒犯之意,只是看看大神们的代码。

关注 3 回答 2

小小的PHP能干啥 分享了头条 · 2020-12-13

感觉这种的解释比较通俗易懂,如果咱们思否没有类似的文章,请通过审核。补充作者博客原文地址https://overtrue.me/about-php...

赞 0 收藏 0 评论 0

小小的PHP能干啥 赞了文章 · 2020-12-07

Keycode对照表(键码对照表)

字母和数字键的键码值(keyCode)

按键键码按键键码按键键码按键键码
A65J74S83149
B66K75T84250
C67L76U85351
D68M77V86452
E69N78W87553
F70O79X88654
G71P80Y89755
H72Q81Z90856
I73R82048957

数字键盘上的键的键码值(keyCode)

按键键码按键键码
0968104
1979105
298*106
399+107
4100Enter108
5101-109
6102.110
7103/111

功能键键码值(keyCode)

按键键码按键键码
F1112F7118
F2113F8119
F3114F9120
F4115F10121
F5116F11122
F6117F12123

控制键键码值(keyCode)

按键键码按键键码按键键码按键键码
BackSpace8Esc27Right Arrow39-_189
Tab9Spacebar32Dw Arrow40.>190
Clear12Page Up33Insert45/?191
Enter13Page Down34Delete46`~192
Shift16End35Num Lock144[{219
Control17Home36;:186\|220
Alt18Left Arrow37=+187]}221
Cape Lock20Up Arrow38,<188'"222

多媒体键码值(keyCode)

按键键码
音量加175
音量减174
停止179
静音173
浏览器172
邮件180
搜索170
收藏171
查看原文

赞 7 收藏 11 评论 0

认证与成就

  • 获得 35 次点赞
  • 获得 76 枚徽章 获得 1 枚金徽章, 获得 21 枚银徽章, 获得 54 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2015-04-21
个人主页被 1.7k 人浏览