爬取腾讯新闻网新闻(https://new.qq.com/)的要闻、北京、财经、科技、娱乐、国际、军事、游戏、乐活模块新闻数据,每个模块爬取100条带图片的数据;爬取的字段包括:url、标题、发布时间、新闻来源、发布地点、新闻内容;数据清洗的要求:发布时间清洗为标准日期格式(yyyy-mm-dd HH:MM:SS),发布地点只保留地点信息(不要“发布于xxx”)。文本信息带表头保存为csv格式,并将采集结果存储于SQLite数据库;统计新闻标题的平均长度,统计新闻发布地点;实现采集结果的词云。
时间: 2023-07-10 11:34:01 浏览: 200
以下是一个Python爬虫和数据处理的示例代码,可以实现您所要求的功能。需要安装requests、BeautifulSoup、pandas、sqlite3、jieba、wordcloud等第三方库。
```
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
import sqlite3
import jieba
from wordcloud import WordCloud
# 定义目标URL和模块名称
url_template = 'https://new.qq.com/ch/{module}'
modules = ['top', 'bj', 'cj', 'tech', 'ent', 'world', 'mil', 'games', 'life']
# 定义爬取数量和保存文件名
num_articles = 100
file_name = 'news.csv'
db_name = 'news.db'
# 定义函数:获取HTML页面
def get_html(url):
response = requests.get(url)
if response.status_code == 200:
html = response.text
return html
else:
print('Failed to get HTML:', response.status_code)
return None
# 定义函数:解析HTML页面,提取数据
def parse_html(html):
soup = BeautifulSoup(html, 'html.parser')
articles = soup.find_all('div', {'class': 'item-inner'})
data = []
for article in articles:
# 获取文章链接
url = article.find('a')['href']
# 获取文章标题
title = article.find('a').text.strip()
# 获取文章发布时间
time = article.find('span', {'class': 'time'}).text.strip()
# 获取文章来源
source = article.find('span', {'class': 'source'}).text.strip()
# 获取文章发布地点
location = article.find('span', {'class': 'comment'}).text.strip()
location = re.sub(r'发布于.*$', '', location)
# 获取文章内容
content = ''
img = article.find('img')
if img:
content = img['alt']
# 添加到数据列表
data.append([url, title, time, source, location, content])
return data
# 定义函数:保存数据到CSV文件
def save_to_csv(data, file_name):
df = pd.DataFrame(data, columns=['url', 'title', 'time', 'source', 'location', 'content'])
df.to_csv(file_name, index=False, encoding='utf-8-sig')
# 定义函数:保存数据到SQLite数据库
def save_to_db(data, db_name):
conn = sqlite3.connect(db_name)
c = conn.cursor()
c.execute('CREATE TABLE IF NOT EXISTS news (url TEXT, title TEXT, time TEXT, source TEXT, location TEXT, content TEXT)')
c.executemany('INSERT INTO news VALUES (?, ?, ?, ?, ?, ?)', data)
conn.commit()
conn.close()
# 定义函数:统计新闻标题的平均长度和发布地点
def analyze_data(data):
titles = [d[1] for d in data]
avg_len = sum(len(title) for title in titles) / len(titles)
print('Average title length:', avg_len)
locations = [d[4] for d in data]
location_count = {}
for location in locations:
if location not in location_count:
location_count[location] = 1
else:
location_count[location] += 1
print('Location count:', location_count)
# 定义函数:生成采集结果的词云
def generate_wordcloud(data):
content = ' '.join([d[5] for d in data if d[5]])
words = jieba.cut(content)
wordcloud = WordCloud(font_path='simsun.ttf').generate(' '.join(words))
wordcloud.to_file('wordcloud.png')
# 主程序
if __name__ == '__main__':
# 爬取数据
all_data = []
for module in modules:
url = url_template.format(module=module)
for i in range(num_articles):
page_url = url + '/page/' + str(i+1)
html = get_html(page_url)
data = parse_html(html)
all_data.extend(data)
# 保存数据
save_to_csv(all_data, file_name)
save_to_db(all_data, db_name)
# 分析数据
analyze_data(all_data)
# 生成词云
generate_wordcloud(all_data)
```
这个代码可以爬取指定模块下的指定数量的新闻数据,并将数据保存为CSV文件和SQLite数据库。同时,它会统计新闻标题的平均长度和发布地点,并生成采集结果的词云。
需要注意的是,这个代码可能受到网站反爬虫机制的影响,需要适当设置请求头和休眠时间,避免被封IP。另外,为了避免爬取过多数据对网站造成负担,建议使用合理的爬取间隔和爬取数量。
阅读全文