logo

Python批量爬取企业工商信息并截图实战指南

作者:起个名字好难2025.09.18 15:58浏览量:0

简介:本文详细介绍如何使用Python实现企业工商信息的批量查询与截图,覆盖技术选型、反爬策略、数据存储与可视化全流程。

Python批量爬取企业工商信息并截图实战指南

一、技术选型与前期准备

1.1 核心工具链

企业工商信息爬取需结合自动化测试框架与OCR技术,推荐使用以下工具组合:

  • Selenium:浏览器自动化控制,支持动态页面渲染
  • Playwright(备选):更现代的浏览器自动化工具,支持无头模式
  • Pillow:图像处理库,用于截图与水印添加
  • Requests+BeautifulSoup:静态页面解析(适用于简单场景)

示例环境配置代码:

  1. # 安装依赖包
  2. !pip install selenium pillow requests beautifulsoup4 webdriver-manager
  3. # 浏览器驱动配置(以Chrome为例)
  4. from selenium import webdriver
  5. from selenium.webdriver.chrome.service import Service
  6. from webdriver_manager.chrome import ChromeDriverManager
  7. driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

1.2 目标网站分析

以国家企业信用信息公示系统为例,需重点分析:

  • 请求特征:XHR请求参数、加密参数生成规律
  • 反爬机制:IP频率限制、验证码类型(滑块/点选)
  • 数据结构:JSON返回字段与HTML嵌套关系

建议使用浏览器开发者工具的Network面板,记录完整请求链路。对于复杂网站,可考虑使用中间人代理工具(如Charles)解析加密参数。

二、批量查询实现方案

2.1 企业名称列表处理

  1. import pandas as pd
  2. # 从Excel读取企业列表
  3. def load_companies(file_path):
  4. df = pd.read_excel(file_path)
  5. return df['企业名称'].tolist()
  6. # 生成查询URL(示例为模拟URL)
  7. def generate_query_url(company_name):
  8. base_url = "https://www.gsxt.gov.cn/search"
  9. params = {
  10. 'keyword': company_name,
  11. 'page': 1
  12. }
  13. # 实际开发中需处理参数加密
  14. return f"{base_url}?{'&'.join([f'{k}={v}' for k,v in params.items()])}"

2.2 动态页面处理策略

针对JavaScript渲染的页面,推荐使用Selenium的显式等待:

  1. from selenium.webdriver.common.by import By
  2. from selenium.webdriver.support.ui import WebDriverWait
  3. from selenium.webdriver.support import expected_conditions as EC
  4. def extract_company_info(driver, company_name):
  5. try:
  6. # 等待企业信息区域加载
  7. info_section = WebDriverWait(driver, 10).until(
  8. EC.presence_of_element_located((By.CSS_SELECTOR, ".company-info"))
  9. )
  10. # 提取关键字段
  11. name = info_section.find_element(By.CSS_SELECTOR, ".name").text
  12. legal_person = info_section.find_element(By.CSS_SELECTOR, ".legal-person").text
  13. # 其他字段提取...
  14. return {
  15. '企业名称': name,
  16. '法定代表人': legal_person,
  17. # 其他字段...
  18. }
  19. except Exception as e:
  20. print(f"提取{company_name}信息失败: {str(e)}")
  21. return None

三、反爬虫应对策略

3.1 IP代理池配置

  1. import random
  2. PROXY_POOL = [
  3. "http://proxy1.example.com:8080",
  4. "http://proxy2.example.com:8080",
  5. # 更多代理...
  6. ]
  7. def get_random_proxy():
  8. return random.choice(PROXY_POOL)
  9. # Selenium代理设置
  10. from selenium.webdriver.common.proxy import Proxy, ProxyType
  11. def setup_proxy():
  12. proxy = Proxy({
  13. 'proxyType': ProxyType.MANUAL,
  14. 'httpProxy': get_random_proxy(),
  15. 'sslProxy': get_random_proxy()
  16. })
  17. capabilities = webdriver.DesiredCapabilities.CHROME
  18. proxy.add_to_capabilities(capabilities)
  19. return webdriver.Chrome(desired_capabilities=capabilities)

3.2 请求头伪装

  1. def get_random_headers():
  2. return {
  3. 'User-Agent': random.choice([
  4. 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
  5. 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15'
  6. ]),
  7. 'Referer': 'https://www.gsxt.gov.cn/',
  8. 'X-Requested-With': 'XMLHttpRequest'
  9. }

四、自动化截图与存储

4.1 全页截图实现

  1. def capture_screenshot(driver, company_name, output_dir="screenshots"):
  2. import os
  3. if not os.path.exists(output_dir):
  4. os.makedirs(output_dir)
  5. # 获取完整页面高度
  6. total_height = driver.execute_script("return document.body.scrollHeight")
  7. driver.set_window_size(1920, total_height)
  8. # 截图并保存
  9. file_path = os.path.join(output_dir, f"{company_name}.png")
  10. driver.save_screenshot(file_path)
  11. return file_path

4.2 关键信息区域截图

  1. from PIL import Image
  2. def capture_specific_area(driver, element_locator, company_name):
  3. element = driver.find_element(*element_locator)
  4. location = element.location
  5. size = element.size
  6. # 截取整个页面
  7. driver.save_screenshot("temp.png")
  8. im = Image.open("temp.png")
  9. # 裁剪指定区域
  10. left = location['x']
  11. top = location['y']
  12. right = left + size['width']
  13. bottom = top + size['height']
  14. im_crop = im.crop((left, top, right, bottom))
  15. # 保存并清理临时文件
  16. im_crop.save(f"screenshots/{company_name}_info.png")
  17. os.remove("temp.png")

五、完整流程示例

  1. def main():
  2. companies = load_companies("companies.xlsx")
  3. results = []
  4. for company in companies[:5]: # 测试时限制数量
  5. try:
  6. driver = webdriver.Chrome() # 实际应使用带代理和headers的配置
  7. driver.get(generate_query_url(company))
  8. # 等待并提取信息
  9. info = extract_company_info(driver, company)
  10. if info:
  11. # 截图操作
  12. capture_screenshot(driver, company)
  13. results.append(info)
  14. except Exception as e:
  15. print(f"处理{company}时出错: {str(e)}")
  16. finally:
  17. driver.quit()
  18. # 保存结果到CSV
  19. pd.DataFrame(results).to_csv("company_info.csv", index=False)
  20. if __name__ == "__main__":
  21. main()

六、法律合规与最佳实践

  1. 合规性检查

    • 确认目标网站Robots协议允许爬取
    • 避免高频请求(建议间隔3-5秒/次)
    • 仅存储公开可查的非敏感信息
  2. 性能优化

    • 使用多线程/异步IO提升效率(如aiohttp)
    • 实现断点续爬功能
    • 定期更新代理IP池
  3. 错误处理

    • 建立重试机制(最多3次)
    • 记录失败案例供人工核查
    • 设置每日最大请求量限制

七、扩展应用场景

  1. 数据可视化:将爬取结果用Pyecharts生成地域分布图
  2. 变更监控:定期爬取对比工商信息变更
  3. API封装:将功能封装为Flask/FastAPI服务

本文提供的代码框架需根据目标网站实际结构调整选择器与参数。建议先在测试环境验证,再投入生产使用。对于大规模爬取,建议考虑使用Scrapy框架或分布式爬虫架构。

相关文章推荐

发表评论