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

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等测试工具查看或者页面右键点击查看网页源代码,如下图


从上图 window.pageData = 后面可以看出返回的数据中有 json 数据
所以我们只需要截取这里面的内容,转换下就可以了。

1.3、使用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, 'window.pageData = ', 0) + 18;
$end = strpos($res, '}};', $start) + 2;
$info = json_decode(substr($res, $start, $end - $start), 1)['result']['resultList'];

if (empty($info)) $this->error('未找到该企业!');

$this->success('获取公司详情成功!', $info);

  • strpos 方法是用于计算字符串出现该字符的第一个位置
  • substr 方法是用于截取字符串的

其中 window.pageData = 后面的数据才是我们要的,所以开始的位置是 取到的位置 + 18个字符,从源代码也可以知道结束的位置是 }}; ,所以结束的位置是 取到的位置 + 2个字符,所以截取的字符串就是 开始位置 截取,长度为 结束位置 - 开始位置,从获取的内容是 result 里面的 resultList 里面。

2、分析与实现

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, 'window.pageData = ', 0) + 18;
$end = strpos($res, '}};', $start) + 2;
$info = json_decode(substr($res, $start, $end - $start), 1)['result']['resultList'];

if (empty($info)) $this->error('未找到该企业!');

//获取企业信息
$info = $info[0];
//需要判断一次是否信用代码一致(如果公司名称里面有则代表不是正确的信用码)
if (strpos($info['titleName'], $creditCode) !== false) $this->error('请填写正确的信用代码!');

$data = [];
$data['titleName'] = $info['titleName'];//公司名称
$data['entType'] = $info['entType'];//公司类型
$data['titleDomicile'] = $info['titleDomicile'];//公司地址
$data['titleLegal'] = $info['titleLegal'];//公司法人
$data['openStatus'] = $info['openStatus'];//开业状态
$data['regCap'] = isset($info['regCap']) ? $info['regCap'] : '0万元';//公司注册资产
$data['scope'] = isset($info['scope']) ? $info['scope'] : '';//公司信息
$data['validityFrom'] = $info['validityFrom'];//注册时间

$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, 'window.pageData = ', 0) + 18;
$end = strpos($res, '}};', $start) + 2;
$info = json_decode(substr($res, $start, $end - $start), 1)['result']['resultList'];

//判断是否存在该企业
if (empty($info)) $this->error('未找到该企业!');

//获取企业信息
$info = $info[0];
//需要判断一次是否信用代码一致(如果公司名称里面有则代表不是正确的信用码)
if (strpos($info['titleName'], $creditCode) !== false) $this->error('请填写正确的信用代码!');

$data = [];
$data['titleName'] = $info['titleName'];//公司名称
$data['entType'] = $info['entType'];//公司类型
$data['titleDomicile'] = $info['titleDomicile'];//公司地址
$data['titleLegal'] = $info['titleLegal'];//公司法人
$data['openStatus'] = $info['openStatus'];//开业状态
$data['regCap'] = isset($info['regCap']) ? $info['regCap'] : '0万元';//公司注册资产
$data['scope'] = isset($info['scope']) ? $info['scope'] : '';//公司信息
$data['validityFrom'] = $info['validityFrom'];//注册时间

$this->success('获取公司详情成功!', $data);
  • 如果只查询信用码的话需要判断是否正确的信用码,我这里直接去判断信用码是否在企业名字符串中,因为我们传的类型 t=1 是包括信用码和企业名的查询参数。

结果输出如下:

{
    "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"
    }
}
谢谢大家的观赏,如果有什么错误的地方请多指教。

PS:仅供学习和参考,禁止商用。如果触犯法律请并承担法律责任与赔偿!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容