PHP爬取企业详情(百度信用)

作者: 华仔233 | 来源:发表于2020-04-22 19:49 被阅读0次

    1、爬取思想

    百度信用网站 https://xin.baidu.com/

    1.1、尝试获取数据和查看url链接

    1、我们可以随便搜索法人代表,例如输入:马云

    2、我们尝试搜索公司名称,例如输入:阿里巴巴

    3、我们尝试搜索社会统一信用码,例如输入:91330100716105852F

    4、我们尝试搜索企业地址,例如输入:浙江省杭州市滨江区网商路699号

    综述:其中对应的q=后面的值就是 搜索关键词,因为编码问题显示的不是中文而是%E9%A9%AC%E4%BA%91,而t=后面的值对应的是 搜索类型 如下,有8种:0=全部,1=企业名/注册号,2=法人代表,3=地址,4=经营范围,5=股东,6=高管,7=商标

    1.2、查看网页源代码的内容
    • 可以通过右键查看源代码
    • 使用Postman等测试工具查看,如下图


      image.png

    从上图可以看出返回的数据中有json数据,大部分获取数据都是从这里取出来的。
    所以我们只需要截取这里面的内容,转换下就可以了。

    2、PHP代码实现

    2.1、爬取企业信息
    //获取公司统一社会信用代码
    $keyword = input('keyword') ?? 0;
    if (!$keyword) $this->error('请填写关键词!');
    $url = 'https://xin.baidu.com/s?q=' . $keyword . '&t=0';
    $res = file_get_contents($url);
    
    //获取爬取到数据的对象
    $start = strpos($res, 'define(\'global/tplData\',', 0) + 25;
    $end = strpos($res, '}]})', $start) + 3;
    $info = json_decode(substr($res, $start, $end - $start), 1)['resultList'];
    
    $this->success('获取公司详情成功!', $info);
    
    
    • strpos 方法是用于计算字符串出现该字符的第一个位置
    • substr 方法是用于截取字符串的

    其中 define('global/tplData', 后面的数据才是我们要的,所以开始的位置是 取到的位置 + 25个字符,从源代码也可以知道结束的位置是 }]}) ,所以结束的位置是 取到的位置 + 3个字符,所以截取的字符串就是 开始位置 截取,长度为 结束位置 - 开始位置,从获取的内容是 resultList 里面。

    2.2、爬取内容分析
    • 举例:输入的关键词为 阿里巴巴,输出的话我这里只显示一部分给大家分析
    {
        "code": 1,
        "msg": "获取公司详情成功!",
        "time": "1587554169",
        "data": [
            {
                "pid": "xlTM-TogKuTwvxosgH5poHE*cNI4uVFPdAmd",
                "entName": "<em>阿</em><em>里</em><em>巴巴</em>(中国)网络技术有限公司",
                "entType": "有限责任公司(台港澳与境内合资)",
                "validityFrom": "1999-09-09",
                "domicile": "浙江省杭州市滨江区网商路699号",
                "entLogo": "https://zhengxin-pub.bj.bcebos.com/logopic/71071e73a15c072e0955938dceab03ef_fullsize.jpg",
                "openStatus": "开业",
                "legalPerson": "戴珊",
                "tags": {
                    "laTaxer": "<span class=\"zx-ent-tag laTaxer\">A级纳税人(2018)</span>"
                },
                "logoWord": "阿里巴巴",
                "titleName": "阿里巴巴(中国)网络技术有限公司",
                "titleLegal": "戴珊",
                "titleDomicile": "浙江省杭州市滨江区网商路699号",
                "levelAtaxer": [
                    2018,
                    2017,
                    2016,
                    2015,
                    2014
                ],
                "regCap": "1,072,526.0万",
                "bid": "573261311273",
                "scope": "开发、销售计算机网络应用软件;设计、制作、加工计算机网络产品并提供相关技术服务和咨询服务;服务:自有物业租赁,翻译,成年人的非证书劳动职业技能培训(涉及许可证的除外)。(依法须经批准的项目,经相关部门批准后方可开展经营活动)",
                "hitReason": [
                    {
                        "品牌项目": "<em>阿里巴巴</em>"
                    },
                    {
                        "企业名称": "<em>阿</em><em>里</em><em>巴巴</em>(中国)网络技术有限公司"
                    },
                    {
                        "网站名称": "<em>阿里巴巴</em>国际站APP下载短连接"
                    }
                ]
            }
        ]
    }
    

    从上面数据可以看出我们要的内容:

    • logoWord ---LOGO关键词, titleName ---企业名称,titleLegal ---企业法人
    • regCap ---企业注册资产, scope ---企业经营范围,entType ---企业类型
    • openStatus ---企业开业状态, validityFrom ---企业注册时间,titleDomicile ---企业地址
    • 大体上需要的信息就在上面了,其中有些字段,例如:entNamedomicilelegalPerson 这些有可能是搜索的关键词,会出现 <em> 高亮的标签,这样会影响我们取数据。
    2.3、详细的处理数据并输出
    //获取公司统一社会信用代码
    $keyword = input('keyword') ?? 0;
    if (!$keyword) $this->error('请填写关键词!');
    $url = 'https://xin.baidu.com/s?q=' . $keyword . '&t=0';
    $res = file_get_contents($url);
    
    //获取爬取到数据的对象
    $start = strpos($res, 'define(\'global/tplData\',', 0) + 25;
    $end = strpos($res, '}]})', $start) + 3;
    $info = json_decode(substr($res, $start, $end - $start), 1)['resultList'];
    
    $data = [];
    foreach ($info as $key => $val) {
        $inData = [
            'titleName' => $val['titleName'], //公司名称
            'entType' => $val['entType'], //公司类型
            'titleDomicile' => $val['titleDomicile'], //公司地址
            'titleLegal' => $val['titleLegal'], //公司法人
            'openStatus' => $val['openStatus'], //开业状态
            'regCap' => $val['regCap'], //公司注册资产
            'scope' => $val['scope'], //公司信息
            'validityFrom' => $val['validityFrom'], //注册时间
        ];
        $data[] = $inData;
    }
    
    $this->success('获取公司详情成功!', $data);
    
    • 通过搜索关键词 阿里巴巴 ,我们得到的结果如下:
    {
        "code": 1,
        "msg": "获取公司详情成功!",
        "time": "1587555747",
        "data": [
            {
                "titleName": "阿里巴巴(中国)网络技术有限公司",
                "entType": "有限责任公司(台港澳与境内合资)",
                "titleDomicile": "浙江省杭州市滨江区网商路699号",
                "titleLegal": "戴珊",
                "openStatus": "开业",
                "regCap": "1,072,526.0万",
                "scope": "开发、销售计算机网络应用软件;设计、制作、加工计算机网络产品并提供相关技术服务和咨询服务;服务:自有物业租赁,翻译,成年人的非证书劳动职业技能培训(涉及许可证的除外)。(依法须经批准的项目,经相关部门批准后方可开展经营活动)",
                "validityFrom": "1999-09-09"
            },
            {
                "titleName": "阿里巴巴(中国)有限公司",
                "entType": "有限责任公司(台港澳法人独资)",
                "titleDomicile": "浙江省杭州市滨江区长河街道网商路699号4号楼5楼508室",
                "titleLegal": "张勇",
                "openStatus": "开业",
                "regCap": "15,298.0万",
                "scope": "服务:企业管理,计算机系统服务,电脑动画设计,经济信息咨询服务(除商品中介),成年人的非证书劳动职业技能培训和成年人的非文化教育培训(涉及前置审批的项目除外);生产:计算机软件;销售自产产品。(国家禁止和限制的除外,凡涉及许可证制度的凭证经营)",
                "validityFrom": "2007-03-26"
            }
        ]
    }
    

    这样就可以得到我们要的数据了

    • 作者我建议还是让用户输入社会统一信用码来精准搜索会好点,代码如下:
    //获取公司统一社会信用代码
    $creditCode = input('credit_code') ?? 0;
    if (!$creditCode) $this->error('请填写统一社会信用代码!');
    $url = 'https://xin.baidu.com/s?q=' . $creditCode . '&t=1';
    $res = file_get_contents($url);
    
    //获取爬取到数据的对象
    $start = strpos($res, 'define(\'global/tplData\',', 0) + 25;
    $end = strpos($res, '}]})', $start) + 3;
    $info = json_decode(substr($res, $start, $end - $start), 1)['resultList'][0];
    
    $data = [];
    $data['titleName'] = $info['titleName'];//公司名称
    $data['entType'] = $info['entType'];//公司类型
    $data['titleDomicile'] = $info['titleDomicile'];//公司地址
    $data['titleLegal'] = $info['titleLegal'];//公司法人
    $data['openStatus'] = $info['openStatus'];//开业状态
    $data['regCap'] = $info['regCap'];//公司注册资产
    $data['scope'] = $info['scope'];//公司信息
    $data['validityFrom'] = $info['validityFrom'];//注册时间
    
    $this->success('获取公司详情成功!', $data);
    

    结果输出如下:

    {
        "code": 1,
        "msg": "获取公司详情成功!",
        "time": "1587556071",
        "data": {
            "titleName": "贵州龙恒农业生态发展有限公司",
            "entType": "有限责任公司(自然人投资或控股)",
            "titleDomicile": "贵州省贵阳市南明区花果园后街彭家湾花果园项目E区第E8(国际金融街2号)栋(E8)1单元19层12号[花果园社区]",
            "titleLegal": "黄恩祥",
            "openStatus": "开业",
            "regCap": "100.0万",
            "scope": "法律、法规、国务院决定规定禁止的不得经营;法律、法规、国务院决定规定应当许可(审批)的,经审批机关批准后凭许可(审批)文件经营;法律、法规、国务院决定规定无需许可(审批)的,市场主体自主选择经营。(农业生态项目开发;销售:农产品、办公设备、五金交电、玩具、办公用品、日用百货、服装、家用电器、电脑耗材、电子产品、通讯器材、消防器材、安防器材、环保器材、橡胶制品、矿产品、矿渣、铝合金制品、建筑材料、电线电缆、润滑油、金属材料、工艺品、珠宝首饰、钟表眼镜、二三类机电产品;工程劳务分包;房地产经纪。)",
            "validityFrom": "2012-03-23"
        }
    }
    
    谢谢大家的观赏,如果有什么错误的地方请多指教。

    相关文章

      网友评论

        本文标题:PHP爬取企业详情(百度信用)

        本文链接:https://www.haomeiwen.com/subject/igswihtx.html