<jupyter_start><jupyter_text>东方财富网国内新闻数据抓取器 拂晓工作室 此程序将爬取某个板块所有最近的新闻并存进CSV！  参考资料* [1] [BeautifulSoup的例子](https://qiita.com/rusarusa/items/d7f014ba80d6fe7a3e07)* [2] [BeautifulSoup的文档](https://www.cnblogs.com/zhaof/p/6930955.html)* [3] [暴力安装BS4](https://github.com/ipython/ipython/issues/10684)* [4] [CSV文档](https://docs.python.org/2/library/csv.html)* [5] [CSV使用实例](https://blog.csdn.net/waple_0820/article/details/70049953)* [6] [如何解决list重复元素的问题](https://stackoverflow.com/questions/7961363/removing-duplicates-in-lists)* [7] [解决CSV文件中文乱码的问题](https://blog.csdn.net/fwj_ntu/article/details/78563962)* [8] [在macOS下解决中文乱码问题](http://blog.sina.com.cn/s/blog_69e225900102w2mc.html)<jupyter_code># 导入库
import urllib
import re
import pandas as pd
import pymysql
import os
import turicreate as tc
import csv
from bs4 import BeautifulSoup
# 新闻板块(同时也会加入热门新闻的数据)
china = 'cgnjj'  # 国内
international = 'cgjjj'  # 国际

# 定义基本常量
url = 'http://finance.eastmoney.com/news/' + china + '.html' # 主目录地址 更换不同主目录以爬取不同板块内容 (BAD)
csv_filepath = '../Datasets/Eastmoney/news/'  # 存储数据文件地址
# 创建一个二十五页的list
page_list = []
counter = 1

while counter <= 25:
    pageurl = 'http://finance.eastmoney.com/news/' + china
    if counter != 1:
        pageurl = pageurl + '_' + str(counter) + '.html'
        page_list.append(pageurl)
    else:
        pageurl = pageurl + '.html'
        page_list.append(pageurl)
    counter += 1
    
print('成功创建包含 ' + str(len(page_list)) + ' 个页面链接的目录！')
# 创建一个包含20个class的list
counter = 0
class_list = []

while counter < 20:
    class_list.append('newsTr' + str(counter))
    counter += 1
    
print('成功创建包含 ' + str(len(class_list)) + ' 个class的目录！')
# print(class_list)  # Debug
# 初始化urllist
urllist = []
year = '2018'  # Separate parameter
counter = 1

# 创造urllist
print('-----------------获取所有文章超链接程序-----------------')
print('分析任务开始！')
for url in page_list:
    req = urllib.request.Request(url)
    response = urllib.request.urlopen(req)
    html = response.read()
    soup = BeautifulSoup(html, "lxml")
    for each_url in soup.find_all('a', href=True):
        if 'http://finance.eastmoney.com/news/' in each_url['href']:
            if year in each_url['href']:
                urllist.append(each_url['href'])   
    print('第' + str(counter) + '页分析完成！现在一共有' + str(len(urllist)) + '篇文章的数据！')
    counter += 1

urllist = list(set(urllist))
print('全部分析完成！正在查重...')
print('任务完成！共获得了' + str(len(urllist)) + '篇文章的数据！')
print('---------------------------------------------')
# 抓取新闻URL函数
def collectNews(url, counter):
    # 准备工作
    req = urllib.request.Request(url)
    print('请求链接连接成功!')
    response = urllib.request.urlopen(req)
    print('收到反馈信号！')
    html = response.read()
    print('HTML生成完毕！')
    soup = BeautifulSoup(html, "lxml")
    print('SOUP创建完成！')
    
    # 获得文章的发表时间 
    time = soup.find(class_="time").get_text()
    print('时间获取完毕！')
    
    # 获得文章的内容
    content = soup.find(id="ContentBody").get_text() 
    content = content[0:re.search('责任编辑', content).span()[0]-1].strip()
    print('文章内容获取完成！')
    
    # 获得相关的股票单
    related_stocks = []
    for each in soup.find_all(class_='keytip'): 
        related_stocks.append(each.get_text())
    print('相关内容单获取完成！')   
        
    # 写入csv
    with open("../DataSets/Eastmoney/news/RecentStockNews.csv", "a") as csvfile: 
        writer = csv.writer(csvfile)
        writer.writerow([counter, 
                         time[0:4], time[5:8], time[8:10], 
                         soup.find('h1').get_text(), 
                         content, 
                         related_stocks])
    print('csv写入完成！')
    
    # 释放内存
    del(req, response, html, soup, time, content, related_stocks)
    
    # 刷新计数 
    counter += 1
    print('计数刷新完成！')
    print('页面数据获取完毕！')
    return counter
# 创建csv文件
with open("../DataSets/Eastmoney/news/RecentStockNews.csv", "w") as csvfile: 
    writer = csv.writer(csvfile)

    # 先写入columns_name
    writer.writerow(["index", "year", "month", "day", "title", "contents", "related"])
# 初始化计数器
counter = 1

# 获取总任务数
total = len(urllist)

# 下载数据
for each_article in urllist:
    print('=============================================')
    print('正在获取第' + str(counter) + '篇文章.')
    print('--------------------------------------------------------')
    counter = collectNews(each_article, counter) 
    
print('获取完毕！共获取了' + str(total) + '篇文章!')<jupyter_output>=============================================
正在获取第1篇文章.
--------------------------------------------------------
请求链接连接成功!
收到反馈信号！
HTML生成完毕！
SOUP创建完成！
时间获取完毕！
文章内容获取完成！
相关内容单获取完成！
csv写入完成！
计数刷新完成！
页面数据获取完毕！
=============================================
正在获取第2篇文章.
--------------------------------------------------------
请求链接连接成功!
收到反馈信号！
HTML生成完毕！
SOUP创建完成！
时间获取完毕！
文章内容获取完成！
相关内容单获取完成！
csv写入完成！
计数刷新完成！
页面数据获取完毕！
=============================================
正在获取第3篇文章.
--------------------------------------------------------
请求链接连接成功!
收到反馈信号！
HTML生成完毕！
SOUP创建完成！
时间获取完毕！
文章内容获取完成！
相关内容单获取完成！
csv写入完成！
计数刷新完成！
页面数据获取完毕！
=============================================
正在获取第4篇文章.
--------------------------------------------------------
请求链接连接成功!
收到反馈信号！
HTML生成完毕！
SOUP创建完成！
时间获取完毕！
文章内容获取完成！
相关内容单获取完成！
csv写入完成！
计数刷新完成！
页面数据获取完毕！
=============================================
正在获取第5篇文章.
--------------------------------------------------------
请求链接连接成功!
收到反馈信号！
HTML生成完毕！
SOUP创建完成！
时间获取完毕！
文章内容获取完成[...]
{'fraction_non_alphanumeric': 0.2645798397615055, 'fraction_numerical': 0.020122973728339856, 'mean_word_length': 2.6944253269098417, 'pattern_counts': {'":': 0, '<': 6, '<?xml version=': 0, '>': 4, 'https://': 7, 'lorem ipsum': 0, 'www.': 1, 'xml': 2}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '415228', 'license': 'Apache-2.0', 'n_tokens_mistral': 2402, 'n_tokens_neox': 2541, 'n_words': 314, 'path': 'NewsDataCollecter/NewsCollector.ipynb', 'repo_name': 'Errrneist/Alchemist', 'size': '5367'}