python爬虫(一)---之 爬取巨潮资讯网上市公司的年报

第一步:创建所需要爬取的企业代码——国泰安即可获取。

第二步:爬取企业年报——代码如下

代码:
# 1、定义股票代码列表 和 爬取结果输出地址(最好指定一个空的文件夹)———必选项

Codelist_path = r"D:\教学视频\企业代码.xls"

Output_path = r"D:\教学视频\年报"

# 2、定义要爬取的报表类型(若同时爬取多项中间用;连接)———必选项

# 公司年度报告:category_ndbg_szsh

# 公司治理报告:category_gszl_szsh

Category_All = "category_ndbg_szsh;category_sjdbg_szsh;category_dshgg_szsh;category_rcjy_szsh;category_sf_szsh;category_pg_szsh;category_kzzq_szsh;category_bcgz_szsh;category_tbclts_szsh;category_tszlq_szsh;category_cqdq_szsh;category_qtrz_szsh;category_jj_szsh;category_zf_szsh;category_gszl_szsh;category_jshgg_szsh;category_yjygjxz_szsh;category_bndbg_szsh;category_yjdbg_szsh;category_qyfpxzcs_szsh;category_gddh_szsh;category_zj_szsh;category_gqjl_szsh;category_gszq_szsh;category_gqbd_szsh;category_fxts_szsh;"

# Category_A = Category_All

# Category_A = "category_ndbg_szsh;"

Category_A = "category_ndbg_szsh"

# 3、定义要爬取的时间段———必选项

SeDate_A = '2015-01-01~2017-01-01'

# 4、定义爬取指定报告的关键词(若不指定则保持为空即可)———可选项

Search_key = ''

import requests

# 用于获取网页内容

from urllib.request import urlretrieve

# 用于下载网络文件到本地

import re

# 用于正则匹配

import math

# 用于调用数学函数

import json

# 用于解析json

import xlwt

# 用于写入excel

import xlrd

# 用于读取excel

import os

# 用于实现系统功能

import pandas as pd

# 导入pandas工具库

<think>好的,我现在要处理用户关于使用爬虫巨潮资讯网抓取年报的问题。首先,我需要理解用户的具体需求。他们提到了使用Python、Scrapy和Selenium,所以应该需要结合这些工具的技术方法。 根据用户提供的引用内容,特别是引用[2]和[3],里面有提到用PhantomJS+Selenium+Scrapy来抓取巨潮资讯网的信息。这意味着用户可能已经看过这些资料,但需要更详细的指导。我需要整理这些信息,给出个结构化的回答,涵盖技术选型、步骤、代码示例以及注意事项。 接下来,我要确认技术方案。Scrapy适合处理结构化爬取,但巨潮资讯网可能有动态加载的内容,所以需要Selenium来渲染JavaScript。同时,年报可能是PDF文件,需要考虑如何下载和处理这些文件。引用中提到处理动态加载数据、分页和验证码,这些都需要在步骤中说明。 然后,我需要规划回答的结构。从技术选型开始,说明为什么选择这些工具,然后是具体步骤,包括分析页面、模拟登录、处理分页、提取链接、下载PDF和存储数据。代码示例部分需要展示Scrapy和Selenium的结合使用,比如中间件和Spider的编写。 还要注意用户提到的反爬机制,比如频率限制和验证码,需要给出应对策略,比如设置下载延迟和使用OCR库。此外,存储部分需要建议多种方式,如本地存储、数据库或云存储,这样用户可以根据需求选择。 最后,生成相关问题时要围绕技术难点、优化方法、法律风险等方面,帮助用户进步探索。同时确保所有引用标注正确,特别是引用[2]和[3]的内容,在相关部分自然添加标识符。</think>### 从巨潮资讯网抓取年报的技术方法 #### 技术选型与核心思路 巨潮资讯网(www.cninfo.com.cn)采用动态加载技术,年报数据通过JavaScript渲染生成,因此需要结合以下技术: 1. **Scrapy框架**:用于构建爬虫主架构,处理请求调度和数据管道[^1] 2. **Selenium/Playwright**:模拟浏览器操作,解决动态渲染问题[^2] 3. **PyPDF2/pdfplumber**:用于后续处理下载的PDF年报文件 #### 具体实现步骤 1. **页面结构分析** - 使用Chrome开发者工具(F12)分析年报列表加载方式 - 发现数据接口为`http://www.cninfo.com.cn/new/hisAnnouncement/query` - 请求方式为POST,参数包含`stock`、`pageNum`等关键字段[^3] 2. **模拟登录与请求头设置** ```python # Scrapy中间件示例 from selenium import webdriver class SeleniumMiddleware: def __init__(self): options = webdriver.ChromeOptions() options.add_argument('--headless') self.driver = webdriver.Chrome(options=options) def process_request(self, request, spider): if request.meta.get('selenium'): self.driver.get(request.url) return HtmlResponse(url=self.driver.current_url, body=self.driver.page_source, encoding='utf-8', request=request) ``` 3. **分页处理逻辑** ```python # Spider核心代码 class CninfoSpider(scrapy.Spider): name = 'cninfo' custom_settings = { 'DOWNLOAD_DELAY': 3, 'SELENIUM_REQUESTS': True } def start_requests(self): formdata = { 'stock': '000001', 'tabName': 'fulltext', 'pageSize': 30, 'pageNum': 1 } yield scrapy.FormRequest( url='http://www.cninfo.com.cn/new/hisAnnouncement/query', formdata=formdata, meta={'selenium': True} ) ``` 4. **PDF链接提取与下载** ```python # 解析年报下载链接 def parse(self, response): data = json.loads(response.text) for item in data['announcements']: pdf_url = f"http://www.cninfo.com.cn/{item['adjunctUrl']}" yield { 'title': item['announcementTitle'], 'date': item['announcementTime'], 'pdf_url': pdf_url } yield scrapy.Request(pdf_url, callback=self.save_pdf) # PDF保存处理 def save_pdf(self, response): filename = response.url.split('/')[-1] with open(f'pdfs/{filename}', 'wb') as f: f.write(response.body) ``` #### 反爬应对策略 1. **IP频率限制**:设置`DOWNLOAD_DELAY`(建议≥3秒) 2. **验证码识别**:使用`django-simple-captcha`或第三方OCR服务 3. **请求头随机化**:通过`fake_useragent`库动态生成User-Agent #### 数据存储建议 - 本地存储:PDF文件+元数据CSV - 数据库存储:MongoDB(适合非结构化数据) - 云存储:阿里云OSS/AWS S3(大文件存储场景)
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值