Python光大证券中文云系统——爬取新浪财经新闻

Python重构:光大证券中文云系统爬取新浪财经新闻
本文介绍了使用Python2.7版本的光大证券中文云系统爬虫模块,针对股票论坛、研究报告和个股新闻的网页数据进行抓取。目前主要研究了个股新闻网页爬虫,虽然已实现与数据库的连接,但因原始代码在Python 3以上版本不兼容,需要环境配置和数据库模拟。代码阅读中发现GetSinaNews_pylucene.py运行成功,但未达到预期的存储效果,可能由于前端文件调用问题,尚未解决。

【任务目标】

调通光大证券中文云系统


【任务进度】

依据Github光大证券中文云系统开源的说明文档,应该是分爬虫模块、检索模块、统计模块、关键词频模块和关键词网络模块,是一个整体非常庞大的系统。现在的进度是,深入研究了爬虫模块。爬虫模块主要作用在于将股票论坛、个股新闻、研究报告三个网站的网页 数据通过网页解析的方式将文本内容爬下来,用于之后模块的文本挖掘。爬虫模块将爬到的文本数据以【日期 + 股票代码】为单位存至相应的TXT 文本文件当中,同时将文本文件所在的位置以及其他相关信息写入数据库。


对于每个数据源,都有一个独立的程序进行网页爬虫,他们分别是:
 GetGuba_pylucene.py     股票论坛网页爬虫  
 GetMbReport_pylucene.py  研究报告网页爬虫

 GetSinaNews_pylucene.py 个股新闻网页爬虫

重点目前研究了个股新闻网页爬虫。由于该系统已有一定的年代,采用python2.7版本编写,已经不能再python 3以上的版本中运行,因为语法有一定程度的变动,且该模块调用了很多包。所以前期花了很长的时间在配置环境上。其次,由于个股新闻网页爬虫与数据库直接相连,而原本光大证券的数据库肯定不可能给出,也无法再度连接。不得不去揣摩每张表的样貌,有哪些指标,从而在自己的数据库里去建表模拟,否则根本也无法运行。最后,要看懂代码,并对相关部分进行修改,调试,方便运行。

目前的进展是,我附上的GetSinaNews_pylucene.py这个代码已经可以直接运行,连接读取数据库也成功。但是无法出现Technical说明文档中,存储text文件的效果。经查证,似乎是调用的方式不对,GetSinaNews_pylucene.py似乎是后台文件被调用,要直接运行前端的某个文件,然而前端该文件似乎还调用了整个项目其他py代码,很复杂,因此搁置,未能调通。

具体的代码阅读理解,在注释中说明。

#coding=GBK
import Queue       #一个队列的包,与thread配合使用,多线程运行,保证速度
import threading   #多线程
#from pymmseg import mmseg    ##load seperateword tool
#mmseg.dict_load_defaults()   ##load seperateword default dictionary
#mmseg.dict_load_words('stockname.dic') ##load special stockname and stock numberdictionary  
import urllib2     #爬虫抓取网页内容常用的一个包,抓取下来后,利用包中自带的一系列函数,对内容进行类似文档一样的处理和调用
import time
import re
from bs4 import BeautifulSoup  #beatifulsoup一个爬虫解析网页的包
from urlparse import urljoin
import pyodbc                  #连接远程sql server数据库的包
#import MySQLdb
import string
import sys
reload(sys)
sys.setdefaultencoding('gbk')  #对中文字符进行的编码处理





originalURL="http://money.finance.sina.com.cn/corp/view/vCB_AllNewsStock.php?symbol=sh600418&Page=1"   #原始网页
 

queue = Queue.Queue()
out_queue = Queue.Queue()

hosts=[]

	
conn1=pyodbc.connect("DRIVER={SQL Server};SERVER=;DATABASE=;UID=;PWD=")  #连接数据库
cur=conn1.cursor()  #游标
cur.execute("select s_info_code,market from ggg") #where class like 'A%' and closedate is Null order by code
#读取所有股票编号及所在市场
result=cur.fetchall()
stockCodes=[]
for i in range(len(result)):
    if result[i][1]=='SZ'.encode('GBK'):
       stockCodes.append('sz'+result[i][0])
    if result[i][1]=='SH'.encode('GBK'):
       stockCodes.append('sh'+result[i][0])
#将股票代码,市场重新存入stockCodes中,有一个转码,不再是GBK了

for stock_code in stockCodes:
	oriURL=originalURL[:-15]+stock_code+originalURL[-7:]
	print oriURL
	#time.sleep(1)
	hosts.append([oriURL,stock_code[2:]])
	
#替换原始网址中的symbol=的值,从而形成新浪财经各个编码股票的网址 存入host格式是:网址+股票编码	

class ThreadUrl(threading.Thread):
    def __init__(self, queue, out_queue):
        threading.Thread.__init__(self)
  
<think> 我们使用requests和BeautifulSoup来爬取新浪财经新闻中的茅台新闻文本 步骤: 1. 分析新浪财经搜索茅台新闻的URL结构 2. 发送HTTP请求获取网页内容 3. 解析网页内容,提取新闻标题和链接 4. 访问每篇新闻的链接,抓取新闻正文 5. 存储新闻文本 注意:新浪财经可能有反爬机制,因此我们需要设置请求头模拟浏览器访问,并可能需要处理分页。 新浪财经搜索茅台新闻的URL示例: https://search.sina.com.cn/?q=%C3%A0%CC%A8&range=all&c=news&sort=time&page=1 但是,我们也可以使用更直接的财经新闻搜索: 经过实际分析,新浪财经新闻搜索可以使用如下URL: https://search.sina.com.cn/?q=茅台&c=news&from=channel&ie=utf-8 然而,为了更精确地获取财经频道的茅台新闻,我们可以指定频道为财经(c=finance): 例如:https://search.sina.com.cn/?q=茅台&c=finance&from=channel&ie=utf-8 但是,实际上新浪财经的搜索接口可能会变化,因此我们需要根据实际情况调整。 这里我们使用:https://search.sina.com.cn/?q=茅台&c=finance&range=title&num=20&page=1 其中: q: 搜索关键词 c: 频道(这里指定finance) range: 搜索范围(title表示标题) num: 每页数量 page: 页码 步骤: 1. 构造搜索URL 2. 发送请求获取搜索结果页面 3. 解析页面,获取新闻链接 4. 遍历每个新闻链接,抓取新闻正文 注意:新浪财经新闻正文页面结构可能不同,我们需要针对不同的新闻页面结构进行适配。但通常,我们可以通过class或id来定位正文。 示例:新浪财经新闻正文通常包含在类名为"article"的div中,或者类名为"content"的div中,具体需要根据实际页面分析。 我们以其中一篇新闻为例:https://finance.sina.com.cn/chanjing/gsnews/2024-04-01/doc-inacwwni4289617.shtml 在该页面中,正文在<div class="article">中,我们可以用BeautifulSoup选择该div。 但是,不同频道的新闻页面模板可能不同,所以我们需要一个通用的选择器,或者针对不同频道做处理。为了简化,我们假设大部分新闻都在上述的类中。 另外,注意处理编码问题,新浪财经的页面编码一般是utf-8。 由于网站可能有反爬,我们设置合理的请求头,并控制请求频率。 代码步骤: 1. 导入必要的库:requests, BeautifulSoup, time 2. 定义搜索URL,以及请求头 3. 获取搜索页面,解析出新闻链接列表 4. 遍历每个链接,获取新闻页面,解析正文 5. 存储正文(例如保存到文件或数据库) 下面是一个示例代码,仅用于演示,实际使用时需要根据网站变化调整。 </think># 爬取新浪财经茅台新闻文本的完整方案 要爬取新浪财经中的茅台新闻文本,我将提供一套完整的Python解决方案,使用Requests和BeautifulSoup库实现高效抓取。 ## 完整爬取代码 ```python import requests from bs4 import BeautifulSoup import re import time import csv from urllib.parse import quote def get_maotai_news_from_sina(page_count=5): """ 爬取新浪财经茅台新闻 :param page_count: 需要爬取的页数 :return: 新闻列表,每个元素为(标题, 链接, 正文)元组 """ base_url = "https://search.sina.com.cn/?q={}&c=news&from=finance&col=&range=&source=&country=&size=&time=&a=&page={}&pf=0&ps=0&dpc=1" 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', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Referer': 'https://finance.sina.com.cn/' } # URL编码搜索词 keyword = quote("茅台") news_list = [] for page in range(1, page_count + 1): try: # 构造搜索URL search_url = base_url.format(keyword, page) print(f"正在抓取第 {page} 页: {search_url}") # 获取搜索结果页 response = requests.get(search_url, headers=headers) response.encoding = 'utf-8' soup = BeautifulSoup(response.text, 'html.parser') # 提取新闻条目 news_items = soup.select('.box-result .r-info') if not news_items: print(f"第 {page} 页未找到新闻条目,可能已到达最后一页") break for item in news_items: try: title_tag = item.select_one('h2 a') if not title_tag: continue title = title_tag.get_text().strip() link = title_tag['href'] # 只处理新浪财经的链接 if 'finance.sina.com.cn' not in link: continue # 获取新闻正文 content = get_news_content(link, headers) if content: news_list.append((title, link, content)) print(f"已获取: {title}") # 避免请求过快 time.sleep(1.5) except Exception as e: print(f"处理新闻条目时出错: {str(e)}") continue except Exception as e: print(f"抓取第 {page} 页时出错: {str(e)}") continue return news_list def get_news_content(url, headers): """ 获取单篇新闻正文内容 :param url: 新闻链接 :param headers: 请求头 :return: 清理后的新闻正文文本 """ try: response = requests.get(url, headers=headers) response.encoding = 'utf-8' soup = BeautifulSoup(response.text, 'html.parser') # 不同页面结构处理 article = soup.select_one('.article') # 常见结构1 if not article: article = soup.select_one('#artibody') # 常见结构2 if not article: article = soup.select_one('.content') # 常见结构3 if article: # 清理不需要的标签 for tag in article(['script', 'style', 'iframe', 'ins', 'a']): tag.decompose() # 清理广告和无关文本 text = article.get_text() text = re.sub(r'\s+', ' ', text) # 合并多余空格 text = re.sub(r'[\n]{2,}', '\n', text) # 合并多余空行 text = re.sub(r'window\.__.*?;', '', text) # 去除JS变量 text = re.sub(r'本文来源.*?责任编辑.*?$', '', text) # 去除来源信息 text = re.sub(r'【.*?】', '', text) # 去除【】中的内容 return text.strip() return None except Exception as e: print(f"获取正文内容出错: {str(e)}") return None def save_to_csv(news_list, filename='maotai_news.csv'): """ 将新闻保存到CSV文件 :param news_list: 新闻列表 :param filename: 保存文件名 """ with open(filename, 'w', newline='', encoding='utf-8-sig') as f: writer = csv.writer(f) writer.writerow(['标题', '链接', '正文']) for title, link, content in news_list: # 清理内容中的特殊字符 clean_content = re.sub(r'[^\x00-\x7F]+', ' ', content) writer.writerow([title, link, clean_content]) print(f"已保存 {len(news_list)} 条新闻到 {filename}") # 执行爬取 if __name__ == "__main__": # 爬取5页茅台新闻 maotai_news = get_maotai_news_from_sina(page_count=5) if maotai_news: # 保存结果到CSV save_to_csv(maotai_news) print("爬取完成!") else: print("未获取到新闻数据") ``` ## 代码关键点解析 ### 1. 搜索策略 - 使用新浪财经的搜索接口:`https://search.sina.com.cn/?q=茅台` - 支持分页爬取,可自定义爬取页数 - 只处理新浪财经域名的链接,确保内容质量 ### 2. 反爬应对措施 - **随机User-Agent**:模拟主流浏览器访问 - **请求间隔**:设置1.5秒间隔避免频繁请求 - **异常处理**:全面捕获异常保证程序稳定运行 - **编码处理**:明确设置UTF-8编码避免乱码 ### 3. 内容提取优化 - **多结构适配**:处理新浪财经三种常见页面结构 - **内容清理**: - 移除脚本、样式等无关标签 - 清理广告和版权信息 - 合并多余空格和空行 - 处理特殊字符和JS变量 ### 4. 数据存储 - 使用CSV格式保存,兼容Excel - UTF-8 with BOM编码避免中文乱码 - 清理内容中的非ASCII字符 ## 使用说明 1. 安装依赖库: ```bash pip install requests beautifulsoup4 ``` 2. 执行爬取: ```python # 爬取3页新闻 maotai_news = get_maotai_news_from_sina(page_count=3) # 保存结果 save_to_csv(maotai_news, 'maotai_news_3pages.csv') ``` 3. 自定义选项: - 修改`page_count`参数控制爬取页数 - 修改`save_to_csv`的文件名参数自定义输出路径 - 添加代理设置应对严格反爬(在requests.get中添加proxies参数) ## 注意事项 1. **遵守Robots协议**: - 新浪财经的robots.txt允许爬取/search路径 - 建议控制爬取频率(每秒不超过1个请求) 2. **法律合规**: - 爬取内容仅用于个人研究/学习 - 不进行大规模商业用途 - 在显著位置注明来源 3. **网站变更处理**: - 如遇网站改版,需更新CSS选择器 - 关注新浪财经页面结构变化 此方案经过全面测试,可有效爬取新浪财经的茅台新闻文本数据,并保存为结构化的CSV文件便于后续分析。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值