Python爬虫:输入公司名称,爬取企查查网站中的公司信息

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

以下文章来源于Python爬虫数据分析挖掘 ,作者:李运辰

Python爬虫:输入公司名称,爬取企查查网站中的公司信息

 

根据输入的公司名称来爬取企查查网站中公司的详细信息

  • 1、获取headers
  • 2、登录成功后,可根据输入的公司名称进行查询操作,得到所需要的内容。
  • 3、将获取到的文本进行文本特殊化处理,并将其汇总成一个dataframe,方便后面保存为csv
  • 4、输入公司名称
  • 5、最后执行此代码,查询companys列表中所有公司名称的详细信息并保存为csv。

1、获取headers

1、进入企查查官网进行注册并登录。
2、然后按F12弹出开发者工具,点击Network,然后你会看到企查查这个网址,点击一下

Python爬虫:输入公司名称,爬取企查查网站中的公司信息

 


然后可以找到我们需要复制的header,这是非常关键的步骤,切记这个header是自己注册之后登录成功所获取的header,这样方便后面保存一次之后就可以在一定时间内无限访问网址进行查询的操作。

Python爬虫:输入公司名称,爬取企查查网站中的公司信息

 

from bs4 import BeautifulSoup
import requests
import time


# 保持会话
# 新建一个session对象
sess = requests.session()


# 添加headers(header为自己登录的企查查网址,输入账号密码登录之后所显示的header,此代码的上方介绍了获取方法)
afterLogin_headers = {'User-Agent': '此代码上方介绍了获取的方法'}


# post请求(代表着登录行为,登录一次即可保存,方便后面执行查询指令)
login = {'user':'自己注册的账号','password':'密码'}
sess.post('https://www.qcc.com',data=login,headers=afterLogin_headers)

 

整段代码的含义为:伪装成用户进行登录行为(返回200状态码代表着登录成功)。

2、登录成功后,可根据输入的公司名称进行查询操作,得到所需要的内容。

def get_company_message(company):
    # 获取查询到的网页内容(全部)
    search = sess.get('https://www.qcc.com/search?key={}'.format(company),headers=afterLogin_headers,timeout=10)
    search.raise_for_status()
    search.encoding = 'utf-8' #linux utf-8
    soup = BeautifulSoup(search.text,features="html.parser")
    href = soup.find_all('a',{'class': 'title'})[0].get('href')
    time.sleep(4)
    # 获取查询到的网页内容(全部)
    details = sess.get(href,headers=afterLogin_headers,timeout=10)
    details.raise_for_status()
    details.encoding = 'utf-8' #linux utf-8
    details_soup = BeautifulSoup(details.text,features="html.parser")
    message = details_soup.text
    time.sleep(2)
    return message

 

上面的代码代表着执行了两个步骤。

  • ①查询某公司
  • ②点击进入第一位搜索结果的新网站,并返回该网址的文本内容。

3、将获取到的文本进行文本特殊化处理,并将其汇总成一个dataframe,方便后面保存为csv

import pandas as pd


def message_to_df(message,company):
    list_companys = []
    Registration_status = []
    Date_of_Establishment = []
    registered_capital = []
    contributed_capital = []
    Approved_date = []
    Unified_social_credit_code = []
    Organization_Code = []
    companyNo = []
    Taxpayer_Identification_Number = []
    sub_Industry = []
    enterprise_type = []
    Business_Term = []
    Registration_Authority = []
    staff_size = []
    Number_of_participants = []
    sub_area = []
    company_adress = []
    Business_Scope = []


    list_companys.append(company)
    Registration_status.append(message.split('登记状态')[1].split('\n')[1].split('成立日期')[0].replace(' ',''))
    Date_of_Establishment.append(message.split('成立日期')[1].split('\n')[1].replace(' ',''))
    registered_capital.append(message.split('注册资本')[1].split('人民币')[0].replace(' ',''))
    contributed_capital.append(message.split('实缴资本')[1].split('人民币')[0].replace(' ',''))
    Approved_date.append(message.split('核准日期')[1].split('\n')[1].replace(' ',''))
    try:
        credit = message.split('统一社会信用代码')[1].split('\n')[1].replace(' ','')
        Unified_social_credit_code.append(credit)
    except:
        credit = message.split('统一社会信用代码')[3].split('\n')[1].replace(' ','')
        Unified_social_credit_code.append(credit)
    Organization_Code.append(message.split('组织机构代码')[1].split('\n')[1].replace(' ',''))
    companyNo.append(message.split('工商注册号')[1].split('\n')[1].replace(' ',''))
    Taxpayer_Identification_Number.append(message.split('纳税人识别号')[1].split('\n')[1].replace(' ',''))
    try:
        sub = message.split('所属行业')[1].split('\n')[1].replace(' ','')
        sub_Industry.append(sub)
    except:
        sub = message.split('所属行业')[1].split('')[1].split('')[0]
        sub_Industry.append(sub)
    enterprise_type.append(message.split('企业类型')[1].split('\n')[1].replace(' ',''))
    Business_Term.append(message.split('营业期限')[1].split('登记机关')[0].split('\n')[-1].replace(' ',''))
    Registration_Authority.append(message.split('登记机关')[1].split('\n')[1].replace(' ',''))
    staff_size.append(message.split('人员规模')[1].split('')[0].split('\n')[-1].replace(' ',''))
    Number_of_participants.append(message.split('参保人数')[1].split('所属地区')[0].replace(' ','').split('\n')[2])
    sub_area.append(message.split('所属地区')[1].split('\n')[1].replace(' ',''))
    try:
        adress = message.split('经营范围')[0].split('企业地址')[1].split('查看地图')[0].split('\n')[2].replace(' ','')
        company_adress.append(adress)
    except:
        adress = message.split('经营范围')[1].split('企业地址')[1].split()[0]
        company_adress.append(adress)
    Business_Scope.append(message.split('经营范围')[1].split('\n')[1].replace(' ',''))
    df = pd.DataFrame({'公司':company,\
                      '登记状态':Registration_status,\
                      '成立日期':Date_of_Establishment,\
                      '注册资本':registered_capital,\
                      '实缴资本':contributed_capital,\
                      '核准日期':Approved_date,\
                      '统一社会信用代码':Unified_social_credit_code,\
                      '组织机构代码':Organization_Code,\
                      '工商注册号':companyNo,\
                      '纳税人识别号':Taxpayer_Identification_Number,\
                      '所属行业':sub_Industry,\
                      '企业类型':enterprise_type,\
                      '营业期限':Business_Term,\
                      '登记机关':Registration_Authority,\
                      '人员规模':staff_size,\
                      '参保人数':Number_of_participants,\
                      '所属地区':sub_area,\
                      '企业地址':company_adress,\
                      '经营范围':Business_Scope})
    
    return df

 

这段代码是对获取到的文本内容进行文本识别处理,只能处理大部分的内容,可能会有极个别的是空值,大家有兴趣可以自己重写。

4、输入公司名称

这里只是写个案例,所以随便写了个列表,一般跑自己代码的是读取自己的csv文件关于公司名称的那一列,然后转为列表)

# 测试所用
companys = ['深圳市腾讯计算机系统有限公司','阿里巴巴(中国)有限公司']


# 实际所用
# df_companys = pd.read_csv('自己目录的绝对路径/某某.csv')
# companys = df_companys['公司名称'].tolist()

 

5、最后执行此代码,查询companys列表中所有公司名称的详细信息并保存为csv。

for company in companys:
    try:
        messages = get_company_message(company)
    except:
        pass
    else:
        df = message_to_df(messages,company)
        if(company==companys[0]):
            df.to_csv('自己目录的绝对路径/某某.csv',index=False,header=True)
        else:
            df.to_csv('自己目录的绝对路径/某某.csv',mode='a+',index=False,header=False)
    time.sleep(1)

 

至此,就可以得到这两家公司的一些详细信息。

ps:如果大家在 soup.find_all(‘a’,{‘class’: ‘title’})[0].get(‘href’)这里遇到点错误,可能是天眼查那边更新了网页代码,大家可以根据这个操作来更新代码。

①按F12进入开发者调试页面

Python爬虫:输入公司名称,爬取企查查网站中的公司信息

 


②就点击“深圳市腾讯计算机系统有限公司”这个点击操作而言,右击,然后选择“检查”选项,然后就可以看到开发者调试页面那里也自动跳转到了相关的位置。

Python爬虫:输入公司名称,爬取企查查网站中的公司信息

 


③我们可以看到,这是一个a标签,class为title的html代码,所以,如果报错,可根据这个操作更换。比如,class改为了company_title,那代码也可对应的改为:soup.find_all(‘a’,{‘class’: ‘company_title’})[0].get(‘href’)

Python爬虫:输入公司名称,爬取企查查网站中的公司信息

 


最后,大家需要注意的是,爬取的时候需要适当的设置一下睡眠时间,不然会被检测到是爬虫机器人在操作,可能会弹出弹窗让你验证,这样会导致循环被中断。第二个就是某个时间段爬取量尽量不要太大,不然也是会被检测到的。

此处贴上完整代码,大家可参考着学习BeautifuSoup的妙用哦。

from bs4 import BeautifulSoup
import requests
import time
# 保持会话
# 新建一个session对象
sess = requests.session()


# 添加headers(header为自己登录的企查查网址,输入账号密码登录之后所显示的header,此代码的上方介绍了获取方法)
afterLogin_headers = {'User-Agent': '此代码上方介绍了获取的方法'}


# post请求(代表着登录行为,登录一次即可保存,方便后面执行查询指令)
login = {'user':'自己注册的账号','password':'密码'}
sess.post('https://www.qcc.com',data=login,headers=afterLogin_headers)


def get_company_message(company):
    # 获取查询到的网页内容(全部)
    search = sess.get('https://www.qcc.com/search?key={}'.format(company),headers=afterLogin_headers,timeout=10)
    search.raise_for_status()
    search.encoding = 'utf-8' #linux utf-8
    soup = BeautifulSoup(search.text,features="html.parser")
    href = soup.find_all('a',{'class': 'title'})[0].get('href')
    time.sleep(4)
    # 获取查询到的网页内容(全部)
    details = sess.get(href,headers=afterLogin_headers,timeout=10)
    details.raise_for_status()
    details.encoding = 'utf-8' #linux utf-8
    details_soup = BeautifulSoup(details.text,features="html.parser")
    message = details_soup.text
    time.sleep(2)
    return message


import pandas as pd


def message_to_df(message,company):
    list_companys = []
    Registration_status = []
    Date_of_Establishment = []
    registered_capital = []
    contributed_capital = []
    Approved_date = []
    Unified_social_credit_code = []
    Organization_Code = []
    companyNo = []
    Taxpayer_Identification_Number = []
    sub_Industry = []
    enterprise_type = []
    Business_Term = []
    Registration_Authority = []
    staff_size = []
    Number_of_participants = []
    sub_area = []
    company_adress = []
    Business_Scope = []


    list_companys.append(company)
    Registration_status.append(message.split('登记状态')[1].split('\n')[1].split('成立日期')[0].replace(' ',''))
    Date_of_Establishment.append(message.split('成立日期')[1].split('\n')[1].replace(' ',''))
    registered_capital.append(message.split('注册资本')[1].split('人民币')[0].replace(' ',''))
    contributed_capital.append(message.split('实缴资本')[1].split('人民币')[0].replace(' ',''))
    Approved_date.append(message.split('核准日期')[1].split('\n')[1].replace(' ',''))
    try:
        credit = message.split('统一社会信用代码')[1].split('\n')[1].replace(' ','')
        Unified_social_credit_code.append(credit)
    except:
        credit = message.split('统一社会信用代码')[3].split('\n')[1].replace(' ','')
        Unified_social_credit_code.append(credit)
    Organization_Code.append(message.split('组织机构代码')[1].split('\n')[1].replace(' ',''))
    companyNo.append(message.split('工商注册号')[1].split('\n')[1].replace(' ',''))
    Taxpayer_Identification_Number.append(message.split('纳税人识别号')[1].split('\n')[1].replace(' ',''))
    try:
        sub = message.split('所属行业')[1].split('\n')[1].replace(' ','')
        sub_Industry.append(sub)
    except:
        sub = message.split('所属行业')[1].split('')[1].split('')[0]
        sub_Industry.append(sub)
    enterprise_type.append(message.split('企业类型')[1].split('\n')[1].replace(' ',''))
    Business_Term.append(message.split('营业期限')[1].split('登记机关')[0].split('\n')[-1].replace(' ',''))
    Registration_Authority.append(message.split('登记机关')[1].split('\n')[1].replace(' ',''))
    staff_size.append(message.split('人员规模')[1].split('')[0].split('\n')[-1].replace(' ',''))
    Number_of_participants.append(message.split('参保人数')[1].split('所属地区')[0].replace(' ','').split('\n')[2])
    sub_area.append(message.split('所属地区')[1].split('\n')[1].replace(' ',''))
    try:
        adress = message.split('经营范围')[0].split('企业地址')[1].split('查看地图')[0].split('\n')[2].replace(' ','')
        company_adress.append(adress)
    except:
        adress = message.split('经营范围')[1].split('企业地址')[1].split()[0]
        company_adress.append(adress)
    Business_Scope.append(message.split('经营范围')[1].split('\n')[1].replace(' ',''))
    df = pd.DataFrame({'公司':company,\
                      '登记状态':Registration_status,\
                      '成立日期':Date_of_Establishment,\
                      '注册资本':registered_capital,\
                      '实缴资本':contributed_capital,\
                      '核准日期':Approved_date,\
                      '统一社会信用代码':Unified_social_credit_code,\
                      '组织机构代码':Organization_Code,\
                      '工商注册号':companyNo,\
                      '纳税人识别号':Taxpayer_Identification_Number,\
                      '所属行业':sub_Industry,\
                      '企业类型':enterprise_type,\
                      '营业期限':Business_Term,\
                      '登记机关':Registration_Authority,\
                      '人员规模':staff_size,\
                      '参保人数':Number_of_participants,\
                      '所属地区':sub_area,\
                      '企业地址':company_adress,\
                      '经营范围':Business_Scope})
    
    return df


# 测试所用
companys = ['深圳市腾讯计算机系统有限公司','阿里巴巴(中国)有限公司']


# 实际所用
# df_companys = pd.read_csv('自己目录的绝对路径/某某.csv')
# companys = df_companys['公司名称'].tolist()


for company in companys:
    try:
        messages = get_company_message(company)
    except:
        pass
    else:
        df = message_to_df(messages,company)
        if(company==companys[0]):
            df.to_csv('自己目录的绝对路径/某某.csv',index=False,header=True)
        else:
            df.to_csv('自己目录的绝对路径/某某.csv',mode='a+',index=False,header=False)
    time.sleep(1)

 

文章源

https://blog.youkuaiyun.com/qq_40694671/article/details/110671900

 

### 使用Python编写爬虫抓取查查数据 #### 了解目标网站结构 在着手编写任何类型的爬虫之前,理解目标网站的工作原理至关重要。对于像查查这样的信息查询平台,通常会涉及复杂的前端交互以及后端API调用[^4]。 #### 遵守法律与道德准则 值得注意的是,在实施任何形式的数据收集活动前,应当仔细阅读并严格遵循目标站点的服务条款,确保行为合法合规。此外,尊重他人的劳动成果也是每位开发者应尽的责任之一[^5]。 #### 技术选型考量 鉴于部分现代Web应用依赖JavaScript动态渲染页面内容,单纯依靠`requests`库可能无法满足需求;此时可考虑引入Selenium等自动化测试框架辅助完成任务。不过需要注意的是,这类方案往往伴随着性能开销较大的缺点,因此建议仅当必要时采用[^3]。 #### 实现思路概述 针对具体应用场景——即从查查获取公司详情页中的公开资料片段为例: 1. **发送HTTP请求** 利用`requests.Session()`对象保持会话状态,模拟真实浏览器访问流程。 2. **解析HTML文档** 借助BeautifulSoup或lxml解析器提取所需字段值。 3. **处理分页逻辑** 若存在多页记录,则需循环遍历直至结束条件达成为止。 4. **存储结果集** 将最终得到的信息保存至本地文件系统或是数据库表内以便后续分析利用。 下面给出一段简化版示范代码供参考学习之用: ```python import requests from bs4 import BeautifulSoup def fetch_company_info(keyword, page=1): url = f"https://www.qcc.com/search?key={keyword}&p={page}" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", # 更多header项可根据实际观察补充... } session = requests.session() resp = session.get(url=url, headers=headers) soup = BeautifulSoup(resp.content.decode(), 'html.parser') items = [] for item in soup.select('.ma_h1'): name = item.text.strip() detail_link = item.find_parent('a')['href'] items.append({ 'name': name, 'detail_url': detail_link }) return items if __name__ == '__main__': keyword = input("请输入要搜索的关键字:") results = fetch_company_info(keyword) for result in results: print(f"{result['name']} -> {result['detail_url']}") ``` 此脚本实现了基于关键词检索对应业的基本功能,但并未深入探讨诸如登录态维持、验证码绕过等问题解决方案。如果计划开展更高级别的操作,请务必谨慎行事,并充分评估潜在风险因素。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值