1.获取财经新闻文本-Python3爬虫

本科毕业论文项目:《基于文本数据挖掘技术的内幕交易识别模型》的相关环节代码目录如下,已经全部更新,欢迎品尝:

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]

你可能感兴趣的:(Python)