Python批量爬取企业工商信息并截图实战指南
2025.09.18 15:58浏览量:4简介:本文详细介绍如何使用Python实现企业工商信息的批量查询与截图,覆盖技术选型、反爬策略、数据存储与可视化全流程。
Python批量爬取企业工商信息并截图实战指南
一、技术选型与前期准备
1.1 核心工具链
企业工商信息爬取需结合自动化测试框架与OCR技术,推荐使用以下工具组合:
- Selenium:浏览器自动化控制,支持动态页面渲染
- Playwright(备选):更现代的浏览器自动化工具,支持无头模式
- Pillow:图像处理库,用于截图与水印添加
- Requests+BeautifulSoup:静态页面解析(适用于简单场景)
示例环境配置代码:
# 安装依赖包!pip install selenium pillow requests beautifulsoup4 webdriver-manager# 浏览器驱动配置(以Chrome为例)from selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom webdriver_manager.chrome import ChromeDriverManagerdriver = 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 Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdef 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").textlegal_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 randomPROXY_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, ProxyTypedef setup_proxy():proxy = Proxy({'proxyType': ProxyType.MANUAL,'httpProxy': get_random_proxy(),'sslProxy': get_random_proxy()})capabilities = webdriver.DesiredCapabilities.CHROMEproxy.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 osif 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 Imagedef capture_specific_area(driver, element_locator, company_name):element = driver.find_element(*element_locator)location = element.locationsize = 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()# 保存结果到CSVpd.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框架或分布式爬虫架构。

发表评论
登录后可评论,请前往 登录 或 注册