一、选题的背景
腾讯新闻是一款主打“事实派”的资讯类,月活超过2.4亿,且用户具备深度浏览习惯。腾讯新闻信息流广告正是以原生方式出现在资讯信息流中,根据用户属性、历史浏览行为和兴趣爱好进行精准定向投。如今普遍年轻人喜欢玩游戏,沉迷手机,我觉得应该多了解国家时事,多看社会新闻,所以我选择了爬取腾讯新闻这个项目
二、主题式网络爬虫设计方案
1.主题式网络爬虫名称
腾讯新闻数据爬取
2.主题式网络爬虫爬取的内容与数据特征分析
腾信新闻数据爬取
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
从网页源代码中找出数据对应标签对数据进行分析
三、主题页面的结构特征分析
1.主题页面的结构与特征分析
2.Htmls 页面解析
四、网络爬虫程序设计
## 经济、娱乐、军事
# * 新闻标题
# * 新闻内容
# * 新闻标签
import re
import requests
from bs4 import BeautifulSoup
import pandas as pd
import csv
import jieba
import time
import random
def getHTMLText(url):
'''
获取网页html
'''
user_agent = [
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko"
]
headers = {'User-Agent': random.choice(user_agent)}
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = 'utf-8'
return r.content
except:
return ""
def parase_index(url):
'''
解析首页内容
'''
html=getHTMLText(url)
soup = BeautifulSoup(html, "lxml")
uls=soup.find_all('ul')
news_type=""#新闻类别
if "finance" in url:
news_type="财经"
elif "ent" in url:
news_type="娱乐"
elif "milite" in url:
news_type="军事"
elif "tech" in url:
news_type="科技"
elif "world" in url:
news_type="国际"
print("==========================={}===========================".format(news_type))
for l in uls[1].find_all('li'):
detail_url=l.a.attrs['href']#详情页链接
try:
title,content=getContent(detail_url)#获取详情页的标题名称,正文
except:
continue
print(title)
tags=l.find_all(attrs={'class':'tags'})#新闻标签
#提取标签文字
tags=re.findall('target="_blank">(.*?)',str(tags[0]))
tags=",".join(tags)
writer.writerow((news_type,tags,title,content))
time.sleep(2)
def getContent(url):
'''
解析新闻正文html
'''
html = getHTMLText(url)
soup = BeautifulSoup(html, "lxml")
title=soup.h1.get_text()#获取标题
artical=soup.find_all(attrs={'class':'one-p'})
content=""
for para in artical:
content+=para.get_text()
return title,content
def update(old,new):
'''
更新数据集:将本次新爬取的数据加入到数据集中(去除掉了重复元素)
'''
data=new.append(old)
data=data.drop_duplicates()
return data
def word_count(data):
'''
词频统计
'''
txt=""
for i in data:
txt+=str(i)
#加载停用词表
stopwords = [line.strip() for line in open("stop_words.txt",encoding="utf-8").readlines()]
words = jieba.lcut(txt)
counts = {}
for word in words:
#不在停用词表中
if word not in stopwords:
#不统计字数为一的词
if len(word) == 1:
continue
else:
counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
return pd.DataFrame(items)
#需要爬取的链接:经济、娱乐、军事、科技、国际
url_list=['https://new.qq.com/ch/finance/',
'https://new.qq.com/ch/ent/',
'https://new.qq.com/ch/milite/',
'https://new.qq.com/ch/tech/',
'https://new.qq.com/ch/world/'
]
#定义数据集保存的文件名
file_name="NewsData.csv"
try:
data_old=pd.read_csv(file_name,encoding='gbk')
except:
pass
csvFile = open(file_name, 'a', newline='',encoding="gb2312")
writer = csv.writer(csvFile)
writer.writerow(("新闻分类","新闻标签","新闻标题","新闻内容"))
for url in url_list:
parase_index(url)
print("爬取完毕!")
csvFile.close()
print("=====================")
print("开始更新数据集")
data_new=pd.read_csv(file_name,encoding='gbk')
update(data_old,data_new).to_csv(file_name,index=None,encoding='gbk')
print("更新完毕!")
print("=================")
print("开始词频统计")
data=pd.read_csv(file_name,encoding="gbk")
res=word_count(data['新闻内容'])
res.to_csv("frequence.txt",header=None,index=None)
print("统计完毕!")
print(res)
五、总结
通过这次设计知道做一个项目首先得学会需求分析,数据分析等,明白自己要做出一个什么效果,这才是一个很好的开始,清楚的自己知道要干嘛。也知道了爬虫的重要性,可以爬取如此多的数据。在这个设计过程中巩固了许多知识也对一个小项目的开发有了自己的认识,并体会到了完成一个小项目的成就感。需要改进的地方仍有许多,我会争取加以改进的。