Python批量爬取企业工商信息并截图实战指南
2025.09.18 15:58浏览量:0简介:本文详细介绍如何使用Python实现企业工商信息的批量查询与截图,覆盖技术选型、反爬策略、数据存储与可视化全流程。
Python批量爬取企业工商信息并截图实战指南
一、技术选型与前期准备
1.1 核心工具链
企业工商信息爬取需结合自动化测试框架与OCR技术,推荐使用以下工具组合:
- Selenium:浏览器自动化控制,支持动态页面渲染
- Playwright(备选):更现代的浏览器自动化工具,支持无头模式
- Pillow:图像处理库,用于截图与水印添加
- Requests+BeautifulSoup:静态页面解析(适用于简单场景)
示例环境配置代码:
# 安装依赖包
!pip install selenium pillow requests beautifulsoup4 webdriver-manager
# 浏览器驱动配置(以Chrome为例)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
1.2 目标网站分析
以国家企业信用信息公示系统为例,需重点分析:
- 请求特征:XHR请求参数、加密参数生成规律
- 反爬机制:IP频率限制、验证码类型(滑块/点选)
- 数据结构:JSON返回字段与HTML嵌套关系
建议使用浏览器开发者工具的Network面板,记录完整请求链路。对于复杂网站,可考虑使用中间人代理工具(如Charles)解析加密参数。
二、批量查询实现方案
2.1 企业名称列表处理
import pandas as pd
# 从Excel读取企业列表
def load_companies(file_path):
df = pd.read_excel(file_path)
return df['企业名称'].tolist()
# 生成查询URL(示例为模拟URL)
def generate_query_url(company_name):
base_url = "https://www.gsxt.gov.cn/search"
params = {
'keyword': company_name,
'page': 1
}
# 实际开发中需处理参数加密
return f"{base_url}?{'&'.join([f'{k}={v}' for k,v in params.items()])}"
2.2 动态页面处理策略
针对JavaScript渲染的页面,推荐使用Selenium的显式等待:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def extract_company_info(driver, company_name):
try:
# 等待企业信息区域加载
info_section = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".company-info"))
)
# 提取关键字段
name = info_section.find_element(By.CSS_SELECTOR, ".name").text
legal_person = info_section.find_element(By.CSS_SELECTOR, ".legal-person").text
# 其他字段提取...
return {
'企业名称': name,
'法定代表人': legal_person,
# 其他字段...
}
except Exception as e:
print(f"提取{company_name}信息失败: {str(e)}")
return None
三、反爬虫应对策略
3.1 IP代理池配置
import random
PROXY_POOL = [
"http://proxy1.example.com:8080",
"http://proxy2.example.com:8080",
# 更多代理...
]
def get_random_proxy():
return random.choice(PROXY_POOL)
# Selenium代理设置
from selenium.webdriver.common.proxy import Proxy, ProxyType
def setup_proxy():
proxy = Proxy({
'proxyType': ProxyType.MANUAL,
'httpProxy': get_random_proxy(),
'sslProxy': get_random_proxy()
})
capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
return webdriver.Chrome(desired_capabilities=capabilities)
3.2 请求头伪装
def get_random_headers():
return {
'User-Agent': random.choice([
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15'
]),
'Referer': 'https://www.gsxt.gov.cn/',
'X-Requested-With': 'XMLHttpRequest'
}
四、自动化截图与存储
4.1 全页截图实现
def capture_screenshot(driver, company_name, output_dir="screenshots"):
import os
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 获取完整页面高度
total_height = driver.execute_script("return document.body.scrollHeight")
driver.set_window_size(1920, total_height)
# 截图并保存
file_path = os.path.join(output_dir, f"{company_name}.png")
driver.save_screenshot(file_path)
return file_path
4.2 关键信息区域截图
from PIL import Image
def capture_specific_area(driver, element_locator, company_name):
element = driver.find_element(*element_locator)
location = element.location
size = element.size
# 截取整个页面
driver.save_screenshot("temp.png")
im = Image.open("temp.png")
# 裁剪指定区域
left = location['x']
top = location['y']
right = left + size['width']
bottom = top + size['height']
im_crop = im.crop((left, top, right, bottom))
# 保存并清理临时文件
im_crop.save(f"screenshots/{company_name}_info.png")
os.remove("temp.png")
五、完整流程示例
def main():
companies = load_companies("companies.xlsx")
results = []
for company in companies[:5]: # 测试时限制数量
try:
driver = webdriver.Chrome() # 实际应使用带代理和headers的配置
driver.get(generate_query_url(company))
# 等待并提取信息
info = extract_company_info(driver, company)
if info:
# 截图操作
capture_screenshot(driver, company)
results.append(info)
except Exception as e:
print(f"处理{company}时出错: {str(e)}")
finally:
driver.quit()
# 保存结果到CSV
pd.DataFrame(results).to_csv("company_info.csv", index=False)
if __name__ == "__main__":
main()
六、法律合规与最佳实践
合规性检查:
- 确认目标网站Robots协议允许爬取
- 避免高频请求(建议间隔3-5秒/次)
- 仅存储公开可查的非敏感信息
性能优化:
- 使用多线程/异步IO提升效率(如aiohttp)
- 实现断点续爬功能
- 定期更新代理IP池
错误处理:
- 建立重试机制(最多3次)
- 记录失败案例供人工核查
- 设置每日最大请求量限制
七、扩展应用场景
- 数据可视化:将爬取结果用Pyecharts生成地域分布图
- 变更监控:定期爬取对比工商信息变更
- API封装:将功能封装为Flask/FastAPI服务
本文提供的代码框架需根据目标网站实际结构调整选择器与参数。建议先在测试环境验证,再投入生产使用。对于大规模爬取,建议考虑使用Scrapy框架或分布式爬虫架构。
发表评论
登录后可评论,请前往 登录 或 注册