本科毕业论文项目:《基于文本数据挖掘技术的内幕交易识别模型》的相关环节代码目录如下,已经全部更新,欢迎品尝:
1.获取财经新闻文本-Python3爬虫
2.新闻情绪的量化-文本信息处理
3.内幕交易识别模型的构建-机器学习
——————————-分割线——————————
这是我第一次使用python所涉及到的小项目,目的是爬取金融界上的所有财经新闻的文本信息,时间跨度为2010-2013年。思路主要如下:
一、找到网页URL的规律,并通过正则表达式进行表达,筛选出有新闻文本信息的URL
二、通过解析网页的布局,通过标签定位所需爬取的文本信息
三、遍历所有符合标准、未曾访问过的URL,并将文本信息提取、保存为txt文件
四、优化爬虫,主要考虑:递归次数、浏览器抬头伪装、间隔时长,以及其他必要措施如代理IP池构建与使用、反爬虫机制应对、多线程并行……等等
实际上,作为我本科阶段毕业论文获取数据的手段,兼之所爬取的金融界网站比较“友好”,故,实战中仅仅通过设置递归次数、伪装浏览器抬头、设置1s的间隔时长便能够达到不错的效果:按月份爬取2010-2013年的所有未曾404的新闻文本信息,尽管效率不高(平均1个小时出头爬完一个月的新闻文本数据)。
废话不多说,给出源码如下:
# python3.6
# 原作者:https://blog.csdn.net/MrWilliamVs/article/details/76422584
# 修改:刘佳舟
# 爬取目标:金融界(http://stock.jrj.com.cn)
# coding: utf-8
import codecs
from urllib import request, parse
from bs4 import BeautifulSoup
import re
import time
from urllib.error import HTTPError, URLError
import sys
sys.setrecursionlimit(1000000) #设置递归次数为100万
# 伪装浏览器抬头以防和谐
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/51.0.2704.63 Safari/537.36'}
# 新闻类定义
class News(object):
def __init__(self):
self.url = None # 该新闻对应的url
self.topic = None # 新闻标题
self.date = None # 新闻发布日期
self.content = None # 新闻的正文内容
self.author = None # 新闻作者
# 如果url符合解析要求,则对该页面进行信息提取
def getNews(url):
# 获取页面所有元素
html = request.urlopen(url).read().decode('gb2312','ignore')
# 解析
soup = BeautifulSoup(html, 'html.parser')
# 获取信息
if not (soup.find('div', {'id': 'leftnews'})): return
news = News() # 建立新闻对象
page = soup.find('div', {'id': 'leftnews'})
if not (page.find('div', {'class': 'newsConTit'})): return
topic = page.find('div', {'class': 'newsConTit'}).get_text() # 新闻标题
news.topic = topic
if not (page.find('div', {'id': 'IDNewsDtail'})): return
main_content = page.find('div', {'id': 'IDNewsDtail'}) # 新闻正文内容
content = ''
for p in main_content.select('p'):
content = content + p.get_text()
news.content = content
news.url = url # 新闻页面对应的url
f.write(news.topic + '\t' + news.content + '\n')
# dfs算法遍历全站
def dfs(url):
global count
print(url)
# 下面的部分需要修改月份以更换爬取月份
pattern1 = '^http://stock.jrj.com.cn/2012/06\/[a-z0-9_\/\.]*$' # 可以继续访问的url规则
pattern2 = '^http://stock.jrj.com.cn/2012/06\/[0-9]{14}\.shtml$' # 解析新闻信息的url规则
pattern3 = '^http://stock.jrj.com.cn/xwk/201001/201001[0-9][0-9]\_[0-9]\.shtml$' # 测试
# 该url访问过,则直接返回
if url in visited: return
print(url)
# 把该url添加进visited()
visited.add(url)
# print(visited)
# 设置停顿时间为1秒
# time.sleep(1)
try:
# 该url没有访问过的话,则继续解析操作
html = request.urlopen(url).read().decode('utf-8','ignore')
# print(html)
soup = BeautifulSoup(html, 'html.parser')
if re.match(pattern2, url):
getNews(url)
# count += 1
# 提取该页面其中所有的url
links = soup.findAll('a', href=re.compile(pattern1))
for link in links:
print(link['href'])
if link['href'] not in visited:
dfs(link['href'])
# count += 1
except URLError as e:
print(e)
return
except HTTPError as e:
print(e)
return
# print(count)
# if count > 3: return
visited = set() # 存储访问过的url
f = open('C:/news.txt', 'a+', encoding='utf-8')
# 利用list对整个月份中所有的分页的进行遍历,此操作能够使得爬虫在遍历当前页面所有url的基础上,再遍历每个月份的所有分页 内的所有新闻。
urls=['http://stock.jrj.com.cn/xwk/201206/201206{}{}_{}.shtml'.format(str(i),str(j),str(k)) for i in range (0,4) for j in range(1,10) for k in range(1,6)]
for url in urls:
if url == 'http://stock.jrj.com.cn/xwk/201206/20120631_5.shtml': # 需要修改以更换月份
dfs(url)
break
dfs(url)
else:
dfs(url)
dfs(url)
下一步,我将基于简单的NLP技术,对获取到的新闻文本信息数据进行处理,量化其中所包含的情绪,并简单地将其分为“积极”与“消极”两类。
–To Be Continued
欢迎观光个人网站:ljzhou.com
联系邮箱:[email protected]