Python爬虫根据公司名称爬取信息并保存为json格式的txt文件qcc

使用BeautifulSoup 根据公司名称来爬取企查查网站中该公司的详细信息

本篇文章主要参考了BeautifulSoup 根据输入的公司名称来爬取公司的详细信息 所提供的代码,后续根据自己的需求对代码进行了修改,在此感谢该作者。
因为工作需要一些企业的部分信息,手动又慢又累人,所以开始突击python。
直接附上源码吧

import traceback
from bs4 import BeautifulSoup
import requests
import time
# 保持会话
# 新建一个session对象
sess = requests.session()
# 添加headers
afterLogin_headers = {
    'User-Agent': '上面给出的链接里有操作方法,这里就不复述了', 'cookie': '如果需要获取电话号码,需要填cookie'}
# post请求(代表着登录行为,登录一次即可保存,方便后面执行查询指令)
login = {'user': '用户名', 'password': '密码'}
sess.post('https://www.qcc.com', data=login, headers=afterLogin_headers)
def get_company_message(company):
    # 获取查询到的网页内容(全部)
    # 下面这个url,如果出现获取不到的情况,可以试一下替换成https://www.qcc.com/web/search?key={} ,查找url的操作上面给出的链接讲得很详细,这里就不复述了
    search = sess.get('https://www.qcc.co/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")

    # 获取电话号码 
    phone = details_soup.find('span', {'class': 'fc'}).find_all('span', {'class': 'cvlu'})
       try:
        phone = (phone[0].findAll('span'))[2].get_text().strip()
        # print(phone)
    except:
        phone = ' '
    	# 企业类型
    try:
        ctype = details_soup.find('section', {'id': 'Cominfo'}).find_all('table', {'class': 'ntable'})[0].findAll('tr')[4].findAll('td')[1].get_text().strip()
        # print(ctype)
    except:
        ctype = ' '
    try:
        # 获取企业描述
        d_desc = details_soup.find('span', {'id': 'desc_content'}).get_text()
    except:# 异常处理
        print('d_descerror')
        d_desc = ''
    for tag in details_soup.find_all('table', {'class': 'ntable'}):
        m_tr = tag.findAll('tr')
        # 统一社会信用代码
        try:
            d_tongyi = m_tr[2].findAll('td')[1].get_text().strip()
        except:# 异常处理
            print('d_tongyierror')
            continue
        # 组织机构代码
        try:
            d_zuzhi = m_tr[2].findAll('td')[3].get_text().strip()
        except:# 异常处理
            print('d_zuzhierror')
            continue
        # 工商注册号
        try:
            d_gongshan = m_tr[2].findAll('td')[5].get_text().strip()
        except:# 异常处理
            print('d_gongshanerror')
            continue
        # 纳税人识别号
        try:
            d_nashui= m_tr[3].findAll('td')[1].get_text().strip()
        except:# 异常处理
            print('d_nashuierror')
            continue
       # 存json形式的txt文件,后续爬取完后需要手动在txt文件的头、尾加上[、]
        infors = {}
        infors['企业名称'] = company
        infors['企业描述'] = d_desc
        infors['统一社会信用代码'] = d_tongyi
        infors['组织机构代码'] = d_zuzhi
        infors['工商注册号'] = d_gongshan
        infors['纳税人识别号'] = d_nashui
        jStr = json.dumps(infors, ensure_ascii=False)
        print('json数据保存操作')
        print(jStr)
        f = open("需要写入到的文件路径.txt", 'a')  # 若文件不存在,系统自动创建。'a'表示可连续写入到文件,保留原内容,在原内容之后写入。可修改该模式('w+','w','wb'等)
        f.write(jStr)  # 将字符串写入文件中
        f.write(",\n")  # 换行
        print('ok')
    time.sleep(2)

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

# 实际所用 把公司名称保存在txt文件之后读取,注意,每个公司名称独占一行
f = open("公司名称路径.txt", "r", encoding='UTF-8')
# 设置文件对象
line = f.readline()
line = line[:-1]
while line:  # 循环获取公司名称,直到读取完文件
    line = f.readline()  # 读取一行文件,包括换行符
    line = line[:-1]  # 去掉换行符,也可以不去
    get_company_message(line) # 调用方法,保存到txt文件
    time.sleep(10)
f.close()

第一次使用python编程,如果有错误的地方还请谅解。

说明:如果利用该代码进行非法行为与本人无关。

补充:今天检查数据发现了一个问题,如果该企业是上市公司,页面默认显示的是上市信息,这时候爬取的数据就会乱来。
解决方法:在这里插入图片描述
先获取该id包含内容,再获取class
details_soup.find(‘section’, {‘id’: ‘Cominfo’}).find_all(‘table’, {‘class’: ‘ntable’})
测试成功,可以使用。

  • 1
    点赞
  • 2
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值