强迫症的我凑个国庆节注册了账号,直接这么发好似不太好。受到某位女生的工作需求,加上重色轻友的心,所以先拿企查查开刀吧。

首先企查查这个网站不登陆也能查公司,不过坑人的就是只能查那么几次,然后就必须要登录了。我想想为了那几次不值得,就搞个登录的爬虫程序吧。

众所周知,登录最重要的参数是Cookie,这个一般在浏览器的XHR(XMLHttpRequest对象/Ajax对象等)里复制任意一个元素的Cookie就可以了,建议使用CV大法复制,右击Copy value可能会复制到中文,在此先献上不知道从哪搜到的读取谷歌浏览器Cookie的方法:

# _*_ coding:utf-8 _*_
# FileName: get_cookies.py
# IDE: PyCharm
# 菜菜代码,永无BUG!import sys
import json
import base64
import getpass
import sqlite3
import urllib3
import ctypes.wintypes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modesurllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)class DataBlob(ctypes.Structure):_fields_ = [('cbData', ctypes.wintypes.DWORD), ('pbData', ctypes.POINTER(ctypes.c_char))]def dp_api_decrypt(encrypted):p = ctypes.create_string_buffer(encrypted, len(encrypted))blob_out = DataBlob()ret_val = ctypes.windll.crypt32.CryptUnprotectData(ctypes.byref(DataBlob(ctypes.sizeof(p), p)), None, None, None, None, 0, ctypes.byref(blob_out))if not ret_val:raise ctypes.WinError()result = ctypes.string_at(blob_out.pbData, blob_out.cbData)ctypes.windll.kernel32.LocalFree(blob_out.pbData)return resultdef aes_decrypt(encrypted_txt):with open(f'C:\\Users\\{getpass.getuser()}\\AppData\\Local\\Google\\Chrome\\User Data\\Local State', encoding='utf-8', mode="r") as f:jsn = json.loads(str(f.readline()))encrypted_key = base64.b64decode(jsn["os_crypt"]["encrypted_key"].encode())encrypted_key = encrypted_key[5:]cipher = Cipher(algorithms.AES(dp_api_decrypt(encrypted_key)), None, backend=default_backend())cipher.mode = modes.GCM(encrypted_txt[3:15])return cipher.decryptor().update(encrypted_txt[15:])def chrome_decrypt(encrypted_txt):if sys.platform == 'win32':try:if encrypted_txt[:4] == b'x01x00x00x00':return dp_api_decrypt(encrypted_txt).decode()elif encrypted_txt[:3] == b'v10':return aes_decrypt(encrypted_txt)[:-16].decode()except WindowsError:return Noneelse:raise WindowsErrordef get_cookies_from_chrome(d):con = sqlite3.connect(f'C:\\Users\\{getpass.getuser()}\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Cookies')con.row_factory = sqlite3.Rowcur = con.cursor()cur.execute(f'SELECT name, encrypted_value as value FROM cookies where host_key like "%{d}%"')cookie = ''for row in cur:if row['value'] is not None:value = chrome_decrypt(row['value'])if value is not None:cookie += row['name'] + '=' + value + ';'return cookie

有了这段代码无疑打开浏览器就不用去打开浏览器开发调试工具了,不过有时候还得手动复制Cookie,因为企查查登录后所拥有的Cookie不止来自一个域。

好了开始用Cookie进入企查查拿到数据,首先headers中有referer和user-agent能大大减少异常请求的几率,显得更“真实”,我不采用解析企查查表格,我选择解析其数据源(解析表格的搜的到,虽然我没有试现在还能不能使用),字典window.__INITIAL_STATE__,有概率会不出现在页面源码中,但只要坚持不断重新执行程序,我相信总会出现的(数据源中的数据多,虽然我并不需要那么多数据,但完美点肯定是好的)。

我写的程序对公司名匹配仅包括去括号和和去括号及括号内容来匹配公司名一致,如有需要可以稍微改动,公司名为name_变量,匹配规则在它的下面两行,下面是源码:

# _*_ coding:utf-8 _*_
# FileName: get_qcc_company.py
# IDE: PyCharm
# 菜菜代码,永无BUG!import json
import time
import requests
from urllib import parse
from bs4 import BeautifulSoup
from get_cookies import get_cookies_from_chrome# https://www.qcc.com/str_time = lambda _: _ == 253392422400 and "9999-09-09" or _ and time.strftime("%Y-%m-%d", time.localtime(_)) or "无固定期限"  # 格式化日期# 对接企查查登录查询headers = {"referer": "https://www.qcc.com/","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
}search_url = "https://www.qcc.com/web/search?"  # 搜索结果网页# 用ctrl+c复制,不然可能会有中文;用谷歌浏览器访问企查查并登录,稍微过会等待cookie数据写入本地数据库
cookie = get_cookies_from_chrome('qcc.com') + get_cookies_from_chrome('www.qcc.com')def get_company(company_name):r = requests.get(search_url + parse.urlencode({"key": company_name}), headers=headers, cookies={"cookie": cookie})if r.ok:soup = BeautifulSoup(r.text, "html.parser")table = soup.find("table", attrs={"class": "ntable ntable-list"})if table is None:return f"未搜寻到公司 “{company_name}” !"for tr in table.find_all("tr"):info = tr.find_all("td")[2].find("div")if info.find("a").find("span") is None:continuename_ = info.find("a").find("span").text.replace('(', '(').replace(')', ')')url = info.find("a")["href"]if company_name != name_.replace(name_[name_.find('('): name_.rfind(')') + 1], '') and company_name != name_.replace('(', '').replace(')', ''):continuer = requests.get(url, headers=headers, cookies={"cookie": cookie})if r.ok:r.encoding = 'utf-8'soup = BeautifulSoup(r.text, "html.parser")script = soup.find_all('script')for s in script:if 'window.__INITIAL_STATE__' in s.text:script = s.textbreakelse:return '请清除谷歌浏览器缓存,并重新登录企查查重新执行程序!如果多次出现此提示,请手动复制任意XHR的cookie值赋予到cookie变量!'information = json.loads(script[script.find('{'): script.rfind('};') + 1])  # 全部细节# 开始从字典中获取信息detail = information["company"]["companyDetail"]  # 企业细节name = detail["Name"]  # 企业名称update = str_time(detail["UpdatedDate"])  # 信息更新时间person = detail["Oper"]["Name"]  # 法定代表人status = detail["Status"]  # 登记状态credit_code = detail["CreditCode"]  # 统一社会信用代码no = detail["No"]  # 工商注册号org_code = detail["OrgNo"]  # 组织机构代码tax_code = detail["TaxNo"]  # 纳税人识别号tax_type = detail.get("TaxpayerType", "")  # 纳税人资质register_capital = detail["RegistCapi"]  # 注册资本paid_capital = detail["RecCap"]  # 实缴资本belong_org = detail["BelongOrg"]  # 登记机关time_start = str_time(detail["TermStart"])  # 成立日期check_date = str_time(detail["CheckDate"])  # 核准日期time_range = f'{str_time(detail["TermStart"])}至{str_time(detail["TeamEnd"])}'  # 营业期限address = detail["Address"]  # 注册地址scope = detail["Scope"]  # 宗旨和业务范围kind = detail["EconKind"]  # 企业类型industry = detail["Industry"]["SubIndustry"]  # 所属行业area = detail["Area"]["Province"]  # 所属地区person_num = detail["profile"]["Info"]  # 人员规模can_bao = [_["Value"] for _ in detail["CommonList"] if _.get("KeyDesc", "") == "参保人数"]  # 参保人数can_bao = can_bao and can_bao[0] or ''  # 参保人数english = detail["EnglishName"]  # 英文名if detail["OriginalName"] is None:organization_names = []  # 曾用名else:organization_names = [_["Name"] for _ in detail["OriginalName"]]  # 曾用名company = {"企业名称": name,"信息更新时间": update,"法定代表人": person,"登记状态": status,"统一社会信用代码": credit_code,"工商注册号": no,"组织机构代码": org_code,"纳税人识别号": tax_code,"纳税人资质": tax_type,"注册资本": register_capital,"实缴资本": paid_capital,"登记机关": belong_org,"成立日期": time_start,"核准日期": check_date,"营业期限": time_range,"注册地址": address,"宗旨和业务范围": scope,"企业类型": kind,"所属行业": industry,"所属地区": area,"人员规模": person_num,"参保人数": can_bao,"英文名": english,"曾用名": organization_names}return companyreturn f"获取公司 “{name_}” 详情信息失败!"return f"未搜寻到公司 “{company_name}” !"return "搜索失败!"print(get_company("需要查询的公司名"))

看到由短到长的import,有没有感觉到我那无处安放的强迫症?我热爱钻研创作,不过可能不会经常发布博客,谢谢你能看到这里,如有需要,CV大法后给我个关注吧~(等这第一篇文章通过后,还会发布爱企查和天眼查的~)

国庆节,企查查我来啦~相关推荐

  1. 读书笔记(十)——python简单爬取企查查网企业信息,并以excel格式存储

    2019独角兽企业重金招聘Python工程师标准>>> 今天这个小爬虫是应朋友,帮忙写的一个简单的爬虫,目的是爬取企查查这个网站的企业信息. 编程最终要的就是搭建编程环境,这里我们的 ...

  2. Elasticsearch生态技术峰会 | Elasticsearch在企查查的应用实践

    简介: 开源最大的特征就是开放性,云生态则让开源技术更具开放性与创造性,Elastic 与阿里云的合作正是开源与云生态共生共荣的典范.值此合作三周年之际,我们邀请业界资深人士相聚云端,共话云上Elas ...

  3. 恒大拟36.6亿元出售水晶城项目 企查查显示管理公司曾因违规建设被罚超900万...

    3月30日,浙江建投(002761)发布关于部分应收款项拟进行重组暨关联交易的公告.根据公告内容,浙江建设为加快化解公司涉及中国恒大集团及下属公司应收款项逾期问题,公司全资子公司浙江省建工集团有限责任 ...

  4. “征信修复”可信吗?企查查显示信用修复相关企业超1.7万家

    花钱就能"洗白"不良征信记录?如果有人称能"修复征信"该相信吗?千万别"病急乱投医"! 记者在企查查搜索发现,有关"征信修复&qu ...

  5. 喜茶部分产品降价,企查查显示其最新估值达600亿元

    自1月7日起,在小红书等社交平台上陆续有消费者发现喜茶有产品售价下调了,例如芝芝芒芒由32元降至29元.纯绿妍由13元降至9元.芝士降低1元. 据界面新闻报道,喜茶方面回应称,确实对部分产品价格进行了 ...

  6. 登录页面怎么弄_python爬虫另辟蹊径绕过企查查的登录验证,我太冇财了

    从企查查爬取企业信息,如果没有登录直接检索,邮箱.电话都被隐藏了 点击详情,部分信息同样会被隐藏 毕竟只是打工的,没钱不能任性! 想要查看更完整的企业信息,只有登录了. 但登录需要滑块验证,有时可能还 ...

  7. 调用企查查上的接口,实现通过公司名称查询公司列表

    引入架包 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>htt ...

  8. Java 查询企业基本信息接口实现(企查查)

    因项目需要,系统中需要添加根据企业名称或统一信用代码查询企业信息的功能,所以整合了企查查的查询接口 接口文档地址 Java请求示例: /*** 版权申明: 苏州朗动科技有限公司<br>* ...

  9. d3 企业图谱 仿天眼查 企查查

    最近接到一个需求,终端要加入企业图谱的功能.能无线穿透下去,之前写过一个类似树形图但是节点长度没有自适应(如下图),样式也不够好看,产品提出做一个类似企查查那种的企业图谱,能更直观的展示企业信息,无奈 ...

  10. 企查查之seleium自动化操作

    企查查之seleium自动化操作:该脚本可按照Excel已有企业名称数据在企查查上自动搜索企业地址,法人等信息. 例如:需要查找重庆上市企业信息,已有企业名称,遂编写该脚本实现自动化操作. 代码连接 ...

最新文章

  1. java button名字_如何实现java按钮的名字输出到文本框鄙人刚学java,题目如 爱问知识人...
  2. tomcat升级_「shell脚本」懒人运维之自动升级tomcat应用(war包)
  3. Struts1.x框架基本原理
  4. 封装caffe-windows-gpu(支持模型有多个输出)
  5. 几款流行的HTML5 UI 框架比较
  6. Alsa中PCM参数设置
  7. 一个超轻量级工作流引擎:Workflow-Core
  8. 容器编排技术 -- Kubernetes kubectl create rolebinding 命令详解
  9. 简单使用Spring Boot+JpaRepository+hibernate搭建项目
  10. 2021亚太杯数学建模C题全网成品论文+代码+详细思路+数据+参考文献
  11. 关于Ubuntu循环登陆界面
  12. python 画等边三角形
  13. iOS 3DTouch 开发
  14. CentOS7 ftp服务离线安装
  15. 猜数字游戏,用户充值版(Java)
  16. USB3.0无法识别U盘解决办法
  17. 艾司博讯:拼多多直通车自动调价要不要开启
  18. C++之友元:是朋友(friend)也是破坏者
  19. html崩溃手机代码15,这12行代码分分钟让你电脑崩溃手机重启
  20. 如何修改vue的网页图标

热门文章

  1. 手写迷你Spring框架
  2. COMMAND NOT SUPPORTED 解决方法
  3. 2016年上半年光伏企业沉浮录
  4. DSP BIOS任务通信和同步(pend/post举例)
  5. 推荐系统学习笔记召回策略之基于内容召回
  6. AndroidSwipeLayout:最强大的 Swipe Layout
  7. Problem G: 切煎饼
  8. 凯文·凯利写给年轻人的99条人生建议(99 Additional Bits of Unsolicited Advice)
  9. 沙巴克皇宫门修复后需要重启服务器,关于传奇3.0的沙巴克设置问题解决
  10. 如何运用MATLAB实现K-MEANS聚类分析