在爬取某站时并做简单分析时,遇到如下问题和大家分享,避免犯错:

一丶网站的path为 /info/1013/13930.htm ,其中13930为不同新闻的 ID 值,但是这个数虽然为升序,但是没有任何规律的升序。

  解决办法:

   使用 range 顺序爬取,错误的网站在页面会报如图错误:

   这时我们首先去判断返回页面是否包含 str 'Sorry, Page Not Found',如果包含则跳过,不包含则爬取页面关键信息

  

二、在爬取过程中发现有其它页面,该内容已经被撤销,这时我正常去判断页面,并跳过,发现无法跳过

  

  

  解决办法:

    查看页面编码为:UTF-8

  

    在用 if 判断页面是否存在 str 时,首先将页面内容进行UTF-8编码即可解决:

    response.encoding = 'utf-8'

三、在爬取网站时,遇到了没有 text 的主页面,新闻全部为图片

  解决办法:这时查看图片页面和新闻页面的不同

  图片页面关键标签:

  

  新闻页面关键标签:

  

  发现div标签下的 ID 不同,这时我们就跳过 id = 'vsb_content' 即可,在跳过时,判断页面内容应当先判断 id = 'vsb_content_4' ,因为 vsb_content_4 包含了 vsb_content

  

四、在爬取新闻后,将新闻写入csv文件时出现BUG,文件内容有重复

  解决办法:

   在写入文件的列表写入后将列表清空,因为在循环执行跳过不存在页面时会有空隙,这时的data_list里面是有内容的

  

五、在写入csv文件后,新闻文本乱码

  解决办法:使用utf-8-sig编码

   为什么不用utf-8?

  原因如下:
   1、”utf-8“ 是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,

    因此它不需要BOM,所以当用"utf-8"编码方式读取带有BOM的文件时,它会把BOM当做是文件内容来处理, 也就会发生类似上边的错误.

  2、“uft-8-sig"中sig全拼为 signature 也就是"带有签名的utf-8”,

    因此"utf-8-sig"读取带有BOM的"utf-8文件时"会把BOM单独处理,与文本内容隔离开,也是我们期望的结果.

最终代码:

 #!/user/bin/env python
# -*- coding:utf-8 -*-
# Author: Mr.riy import re
import requests
import csv
import time
import jieba
import jieba.analyse
from requests.exceptions import RequestException
from bs4 import BeautifulSoup class Downloader:
def __init__(self):
self.data_list = [] def download(self, url, num_retries=3):
'判断页面'
print('Downloading:', url)
global response
response = requests.get(url)
response.encoding='utf-8'
try:
if 'Sorry, Page Not Found' in response.text:
print(url, '页面不存在')
elif '该内容已经被撤销' in response.text:
print(url, '页面不存在')
elif response.status_code == 200:
print('下载成功,开始执行......')
# print(response.text)
# print(response.encoding)
page = response.content
self.find_all(page)
time.sleep(1)
else:
if num_retries > 0 and 500 <= response.status_code <= 600:
html = self.download(url, num_retries-1)
except RequestException as e:
print(e) def find_all(self, page):
'爬取内容'
soup_title = BeautifulSoup(page, 'lxml')
sp_title_items = soup_title.find('h2', attrs={'align': 'center'})
title = sp_title_items.text
print(title) sp_time_items = soup_title.find('div', attrs={'style': 'line-height:400%;color:#444444;font-size:14px'})
times = sp_time_items.text
# print(times)
time = re.findall(r'\d{4}年\d{2}月\d{2}日 \d{2}:\d{2}', times)
# print(time)
author = re.findall(r'作者:(.*)', times)
# print(author)
global response
if 'vsb_content_4' in response.text:
sp_words_items = soup_title.find('div', attrs={'id': 'vsb_content_4'})
elif 'vsb_content_501' in response.text:
sp_words_items = soup_title.find('div', attrs={'id': 'vsb_content_501'})
else:
sp_words_items = soup_title.find('div', attrs={'id': 'vsb_content'}) words = sp_words_items.text
# print(words)
row = []
row.append(time)
row.append(author)
row.append(words)
self.data_list.append(row) def write_csv(self, filename, all_list):
'写入csv文件'
with open(filename, 'w', encoding="utf-8-sig", newline='') as f:
writer = csv.writer(f)
fields = ('时间', '作者', '内容')
writer.writerow(fields)
for row in all_list:
writer.writerow(row) def fetch_data(self):
'设置爬取页面'
all_list = []
for page in range(13795, 14000, 1): #设置爬取的页面范围
url = f'http://www.xxxxxx.cn/info/1013/{page}.htm'
self.download(url)
all_list += self.data_list
self.data_list = [] self.write_csv('data.csv', all_list) class analyze:
def get_all_text(self, filename):
'取出所有评价的句子'
comment_list = []
with open(filename, encoding="utf-8-sig") as f:
rows = csv.reader(f)
for row in rows:
one_comment = row[-1]
comment_list.append(one_comment) return ''.join(comment_list[1:]) def cut_text(self, all_text):
'找到评价中重要关键词'
jieba.analyse.set_stop_words('stop_words.txt')
text_tags = jieba.analyse.extract_tags(all_text, topK=30)
return text_tags def main():
temp = Downloader()
temp.fetch_data()
b = analyze()
all_text = b.get_all_text('data.csv')
text_tags = b.cut_text(all_text)
print(text_tags) if __name__ == "__main__":
main()

运行截图:最近新闻出现最多的关键字为:防疫,疫情,工作

python爬取某站新闻,并分析最近新闻关键词的更多相关文章

  1. python爬取B站视频弹幕分析并制作词云

    1.分析网页 视频地址: www.bilibili.com/video/BV19E… 本身博主同时也是一名up主,虽然已经断更好久了,但是不妨碍我爬取弹幕信息来分析呀. 这次我选取的是自己 唯一的爆款 ...

  2. 用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕!

    众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕.不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一个组织良好的评论序列.通过分析弹幕,我们可以快速洞察广大观众对于视频 ...

  3. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下:http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样 ...

  4. Python 爬取淘宝商品数据挖掘分析实战

    Python 爬取淘宝商品数据挖掘分析实战 项目内容 本案例选择>> 商品类目:沙发: 数量:共100页  4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 爬取淘宝商品 ...

  5. 用python爬取B站在线用户人数

    最近在自学Python爬虫,所以想练一下手,用python来爬取B站在线人数,应该可以拿来小小分析一下 设计思路 首先查看网页源代码,找到相应的html,然后利用各种工具(BeautifulSoup或 ...

  6. 毕设之Python爬取天气数据及可视化分析

    写在前面的一些P话:(https://jq.qq.com/?_wv=1027&k=RFkfeU8j) 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向. ...

  7. Python爬取B站视频信息

    该文内容已失效,现已实现scrapy+scrapy-splash来爬取该网站视频及用户信息,由于B站的反爬封IP,以及网上的免费代理IP绝大部分失效,无法实现一个可靠的IP代理池,免费代理网站又是各种 ...

  8. python爬取b站排行榜

    爬取b站排行榜并存到mysql中 目的 b站是我平时看得最多的一个网站,最近接到了一个爬虫的课设.首先要选择一个网站,并对其进行爬取,最后将该网站的数据存储并使其可视化. 网站的结构 目标网站:bil ...

  9. Python爬取b站任意up主所有视频弹幕

    爬取b站弹幕并不困难.要得到up主所有视频弹幕,我们首先进入up主视频页面,即https://space.bilibili.com/id号/video这个页面.按F12打开开发者菜单,刷新一下,在ne ...

随机推荐

  1. Google在百慕大避税几十亿美金,为什么巨头和富豪都会选百慕大避税?

    为什么"越有钱越有钱"?为什么富豪只要不自己"作",就能让自己的财富疯狂增加?除了经营意识之外,关键他们还可以利用自己的资源.实力等去做很多看似让人不齿,但其实 ...

  2. zookeeper 实战 - Pymjer 的博客

    下载 $ wget http://apache.forsale.plus/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz 配置conf/zoo.cfg ...

  3. Yii的自带缓存的使用

    Yii的自带缓存都继承CCache 类, 在使用上基本没有区别缓存基础类 CCache 提供了两个最常用的方法:set() 和 get().要在缓存中存储变量 $value,我们选择一个唯一 ID 并 ...

  4. 阿里为何要用独立APP挖微信微商墙角?

    ​ 微商,这个被很多人看来是逃离马云魔咒,和淘宝抗衡的电商模式,自诞生到狂飙就伴随着种种争议.由于传播效率极强,在很长时间里也一直是不少人口中津津乐道的神话故事和救市良方.以至于,淘宝推出各种手段封杀 ...

  5. Flutter调研(2)-Flutter从安装到运行成功的一些坑

    工作需要,因客户端有部分页面要使用flutter编写,需要QA了解一下flutter相关知识,因此,做了flutter调研,包含安装,基础知识与demo编写,第二部分是安装与环境配置. —— 在mac ...

  6. 达拉草201771010105《面向对象程序设计(java)》第十周学习总结

    达拉草201771010105<面向对象程序设计(java)>第十周学习总结 实验十  泛型程序设计技术 实验时间 2018-11-1 第一部分:理论知识        泛型:也称参数化类 ...

  7. 7-29 jmu-python-不同进制数 (10 分)

    输入一个十进制整数,输出其对应的八进制数和十六进制数.要求采用print函数的格式控制进行输出,八进制数要加前缀0o,十六进制数要加前缀0x. 输入格式: 输入一个十进制整数,例如:10 输出格式: ...

  8. node--非阻塞式I/O,单线程,异步,事件驱动

    1.单线程 不同于其他的后盾语言,node是单线程的,大大节约服务器开支 node不为每个客户创建一个新的线程,仅使用一个线程.通过非阻塞I/O以及 事件驱动机制,使其宏观上看是并发的,可以处理高并发 ...

  9. Chrome 63 - What"s New in DevTools(中文字幕)

    大家好,这是代码之声(codefm)第一期,今天给大家带来的是 What's New In DevTools (Chrome 63). Chrome 一般会每隔 6 周发布一次主版本.​目前 Chro ...

  10. 关于css 的垂直居中

    对于元素的水平居中,我根据我自己之前的一些学习来进行一些总结,如果有不对的地方,欢迎指正~ 一.让大小不固定的元素垂直居中 因为:表格的单元格的特别属性:垂直居中等: `div.parent { di ...