爬虫综合大作业

爬虫综合大作业

作业要求来自于:

一.把爬取的内容保存取MySQL数据库

import pandas as pd

import pymysql

from sqlalchemy import create_engine

conInfo = "mysql+pymysql://user:passwd@host:port/gzccnews?charset=utf8"

engine = create_engine(conInfo,encoding='utf-8')

df = pd.DataFrame(allnews)

df.to_sql(name = 'news', con = engine, if_exists = 'append', index = False)

二.爬虫综合大作业

选择一个热点或者你感兴趣的主题。

选择爬取的对象与范围。

了解爬取对象的限制与约束。

爬取相应内容。

做数据分析与文本分析。

形成一篇文章,有说明、技术要点、有数据、有数据分析图形化展示与说明、文本分析图形化展示与说明。

文章公开发布。

三.爬虫注意事项

1.设置合理的爬取间隔,不会给对方运维人员造成压力,也可以防止程序被迫中止。

import time

import random

time.sleep(random.random()*3)

2.设置合理的user-agent,模拟成真实的浏览器去提取内容。

首先打开你的浏览器输入:about:version。

用户代理:

收集一些比较常用的浏览器的user-agent放到列表里面。

然后import random,使用随机获取一个user-agent

定义请求头字典headers={'User-Agen':}

发送request.get时,带上自定义了User-Agen的headers

3.需要登录

发送request.get时,带上自定义了Cookie的headers

headers={'User-Agen':

'Cookie': }

4.使用代理IP

通过更换IP来达到不断高 效爬取数据的目的。

headers = {

"User-Agent": "",

}

proxies = {

"http": " ",

"https": " ",

}

response = requests.get(url, headers=headers, proxies=proxies)

正文:

一、爬取的网站:中国传媒大学南广学院

爬取范围:中国传媒大学南广学院的新闻

爬取要求:对新闻信息进行词云分析,新闻时间与事件点击量排序,词频统计。

 

二、详细爬取过程:

1.首先需要对每个新闻页面信息的爬取:alist

代码如下:

 

def alist(url):
    '''
    获取页面的各种新闻,然后逐条进入
    :param url: listUrl
    :return: newsList
    '''
    res=requests.get(listUrl)
    res.encoding='utf-8'
    soup = BeautifulSoup(res.text,'html.parser')
    newsList=[]
    for news in soup.select('li'):#获取li元素
        if len(news.select('.text-list'))>0:#如果存在新闻题目
            newsUrl = news.select('a')[0]['href']#获取新闻的链接
            newsDesc = news.select('span')[0].text#获取时间
            newsDict = anews(newsUrl)#通过进入链接获取详细信息
            newsDict['time'] = newsDesc
            newsList.append(newsDict)#把每个新闻的信息放进字典扩展到列表里
    return newsList

 

2.然后再获取新闻页面的url进入新闻详细页面,对新闻详细页面信息的爬取:anews

代码如下:

 

def anews(url):
    '''
    进入后爬取主要内容
    :param url: url
    :return: newsDetail
    '''
    newsDetail = {}
    res = requests.get(url)
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text,'html.parser')
    newsDetail['newsTitle'] = soup.select('.zw-title h2')[0].text#题目
    newsDetail['newsClick'] = soup.select('.liulan')[0].text  # 点击次数
    a = len(soup.select('.zw-text p'))#获取存放内容的p标签
    c = ""#后面用来进行每个p标签的内容相加
    for i in range(0,a):#获取每个p标签的文本内容
        if soup.select('.zw-text p')[i].text != "\n\n":#剔除空内容
            b = ( soup.select('.zw-text p')[i].text)
            c = c+b#文本内容衔接
    newsDetail['newstext'] = c#将文本内容放进字典
    return newsDetail

 

3.对新闻新信息进行简单数据处理:更新时间与点击量的排序

代码如下:

 

newsdf = pd.DataFrame(allnews)
print(newsdf)
print(newsdf.sort_values(by=['time'],ascending=False))#按更新时间降序排列
print(newsdf.sort_values(by=['newsClick'],ascending=False))#按点击量降序排列

 

4.对新闻文本信息进行数据清洗

代码如下:

 

# 加载停用词表
    stopwords = [line.strip() for line in open('stops_chinese1.txt', encoding='utf-8').readlines()]
    # 分词
    zhuanhua = str(allnews)#将字典转化为string格式
    wordsls = jieba.lcut(zhuanhua)
    wcdict = {}
    for word in wordsls:
        # 不在停用词表中
        if word not in stopwords:
            # 不统计字数为一的词
            if len(word) == 1:
                continue
            else:
                wcdict[word] = wcdict.get(word, 0) + 1

 

5.对文本信息进行词频排序:

代码如下:

 

wcls=list(wcdict.items())
wcls.sort(key=lambda x:x[1],reverse=True)
#输出词频最大TOP20
for i in range(20):
    print(wcls[i])

 

6. 生成词云

代码如下:

cut_text = " ".join(wcdict)#join返回通过指定字符连接序列中元素后生成的新字符串
mywc = WordCloud(font_path = 'msyh.ttc').generate(cut_text)
plt.imshow(mywc)
plt.axis("off")
plt.show()

 

7. 设置合理的爬取间隔

代码如下:

 

 for i in range(3):
     print(i)
     time.sleep(random.random()*3)#沉睡随机数的3倍秒数

 

8. 保存到csv与sql文件

代码如下:

newsdf.to_csv(r'F:\作业\大三下\大数据\homework8\cucn.csv',encoding='utf_8_sig')#保存成csv格式,为避免乱码,设置编码格式为utf_8_sig

with sqlite3.connect(r'F:\作业\大三下\大数据\homework8\cucnsql.sqlite') as db:#保存文件为sql
    newsdf.to_sql('gzccnewsdb',db)

 

三、运行截图:

 

词云生成如下图所示:

 

保存成csv文件截图:

 

posted @ 2019-04-28 21:50  TicTac1  阅读(544)  评论(0编辑  收藏  举报