【爬虫实战】国家企业公示网-项目分析

前言

介绍

根据企业名称抓取国家企业信息公示网 中的企业信息数据

网址:

  • 主站url http://www.gsxt.gov.cn/
  • 江苏地区url http://www.jsgsj.gov.cn:58888/province/

提示:该网站极其不稳定

内容

  • 项目分析
  • webapi:类flask框架quart
  • node_server:节点内启动爬虫
  • crawler:利用selenium进行数据抓取
  • 运行效果截图

学习目标:

  1. 了解 获取数据的抓取流程
  2. 了解 每个组件的功能
  3. 了解 项目运行流程

演示运行效果,确定被抓取网站状态正常

1. 确定抓取流程,确定数据位置

使用selenium控制浏览器进行抓取

1.1 网站首页

在这里插入图片描述

1.2 行为验证图片

在输入企业名称点击查询后有可能会跳出验证图片,我们可以采取手动打码或使用第三方打码平台的方式来获取验证图片的点击坐标

在这里插入图片描述

1.3 选择列表页中第一个公司

在这里插入图片描述

1.4 确定数据位置

在这里插入图片描述

1.5 保存数据页面

数据量庞大,可以先保存数据的各个页面到本地,后续再进行提取

在这里插入图片描述

2. 项目代码组件

基于数据抓取的流程,可以确定项目代码所需要的组件

  • 消息中间件
  • webapi
  • node_server节点任务调度
  • crawler爬虫

3. 消息中间件(消息总线)

使用redis作为消息总线

3.1 token队列

  • key:gsxt_token
  • 功能:存储唯一识别码token,生产存储,等待被消费
  • 数据结构:List
[token1, token2, ...]

3.2 任务详情hashmap

  • key:gsxt_task:token
  • 功能:根据token存储各自抓取任务的详细信息,包含返回的数据
  • 数据结构:Hashmap
{
	company_name, 
		str # 公司名称
	token, 
		str # 任务唯一识别码
	crack_captcha_mode, 
		str # 默认'0'(手动破解); '1'为调用打码平台破解
	status, 
		str # 'wait', 任务没开始
        str # 'crawling', 抓取中
    	str # 'failed', 失败
    	str # 'done', 完成
	msg, 
		str # status状态描述信息
	data, 
		json_str # 数据
	captcha_params,
		str # 图片验证码打码结果字符串
}

4. webapi

4.1 功能

  • 启动爬虫
  • 手动打码
  • 获取抓取结果

4.2 设计接口

  • 首页接口说明文档
  • 爬虫启动接口
  • 手动打码静态页面接口
  • 手动打码获取验证码信息接口
  • 获取任务状态或结果接口

4.2.1 首页接口说明文档

GET /

4.2.2 爬虫启动接口

GET /company
入参:
	company_name
	crack_captcha_mode
返回任务详情json_str:
	gsxt_task:token

4.2.3 手动打码静态页面接口

GET /crack_captcha
入参:
	token
返回:
	手动打码的html页面

4.2.4 手动打码获取验证码信息接口

POST /crack_captcha
入参:
	token
    captcha_params
返回任务详情json_str:
	gsxt_task:token

4.2.5 获取任务状态或结果接口

GET /result
入参:
	token
返回任务详情json_str:
	gsxt_task:token

5. node_server节点任务调度

  • 轮询gsxt_token队列,取出token
  • 根据token从gsxt_task:token中读取任务信息
  • 启动爬虫并传递参数

6. crawler爬虫

  1. 根据入参抓取企业数据
  2. 捕捉并记录异常的页面
  3. 向gsxt_task:token中注册任务状态status和msg
  4. 从gsxt_task:token中轮询读取打码结果captcha_params
  5. 向gsxt_task:token返回数据data

7. 组件以及功能流程图

在这里插入图片描述

8. 项目运行流程

8.1 接口启动爬虫

  • 调用webapi启动爬虫/company接口生成token并向redis的gsxt_token队列中注册token,同时将任务详情字典写入gsxt_task:token

8.2 节点调度启动爬虫

  • node_server轮询gsxt_token队列,获取token,读取gsxt_task:token得到参数字典,启动crawler,并传入参数字典

8.3 爬虫抓取

  1. 初始化driver
  2. 输入公司名称,并点击
  3. 判断是否需要验证
  4. 如果需要验证,获取验证图片并保存
  5. 获取打码坐标
  6. 点击验证图片
  7. 判断查询结果
  8. 选择第一条查询结果
  9. 获取主要信息
  10. 保存数据页面
  11. 向redis中发送信息
  12. 对失败情况进行保存,关闭driver,推送失败信息
  13. 组织抓取逻辑,成功关闭driver

小结

  1. 了解 获取数据的抓取流程
  2. 了解 每个组件的功能
  3. 了解 项目运行流程

,从数据采集、人工标注、模型构建、训练和验证的过程,最终构建形成demo演示 爬虫(Web Crawler)是一种自动化程序,用于从互联上收集信息。其主要功能是访问页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对站造成过大负担或触发反爬虫机制,爬虫需要遵守站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重站的使用政策,并确保对被访问站的服务器负责。
### 编写 Python 爬虫代码获取国家企业信用信息公示系统的异常经营状态 要实现通过 Python 获取国家企业信用信息公示系统中的异常经营状态数据,可以采用 `requests` 和 `BeautifulSoup` 库来完成页请求与解析的任务。以下是详细的说明以及示例代码: #### 请求目标站并处理反爬机制 国家企业信用信息公示系统通常会设置一定的反爬措施,例如动态加载内容、验证码验证或者 IP 频率限制等。因此,在编写爬虫前需注意以下几点[^1]: - 使用合法的 User-Agent 来模拟浏览器访问。 - 添加必要的 headers 参数以减少被识别为机器的概率。 - 如果涉及登录操作,则需要分析页面表单提交逻辑。 ```python import requests from bs4 import BeautifulSoup import time headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } def fetch_company_abnormal_status(company_name): base_url = "http://www.gsxt.gov.cn/index.html" # 构建查询参数 params = {'searchword': company_name} try: response = requests.get(base_url, params=params, headers=headers) response.raise_for_status() soup = BeautifulSoup(response.text, 'html.parser') abnormal_info_section = soup.find('section', class_='abnormal-info') # 假设存在特定标签结构 if not abnormal_info_section: return f"未找到 {company_name} 的异常经营信息。" data_list = [] items = abnormal_info_section.find_all('div', class_='item') for item in items: title = item.find('h3').get_text(strip=True) details = item.find('p').get_text(strip=True) entry = {"title": title, "details": details} data_list.append(entry) return data_list except Exception as e: return str(e) if __name__ == "__main__": result = fetch_company_abnormal_status("某公司名称") # 替换为目标公司的具体名称 print(result) ``` 上述代码实现了基本的功能框架,但需要注意实际部署时可能遇到的具体情况调整[^2]。 #### 数据存储方式的选择 对于抓取到的数据可以选择多种方式进行保存,比如 JSON 文件、CSV 表格或者是数据库记录等形式。这里提供一个简单的例子展示如何将结果存入 CSV 中: ```python import csv def save_to_csv(data, filename="output.csv"): keys = ["title", "details"] with open(filename, mode='w', newline='', encoding='utf-8') as file: writer = csv.DictWriter(file, fieldnames=keys) writer.writeheader() writer.writerows(data) data = [{"title":"列入原因","details":"未按时年报"}] save_to_csv(data) ``` 此部分功能可以根据项目需求进一步扩展优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chaser&upper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值