实战讲解,文章较长,对爬虫比较熟悉的浏览翻看章节 2.3 获取新闻文本内容。

写爬虫时经常对网址发起请求,结果返回的html数据除了标签能看懂,其他的全部是乱码。大家如果对爬虫感兴趣,请耐心阅读本文,我们就以百度风雨榜爬虫为例学习下乱码处理问题。

http://top.baidu.com/buzz?b=1

百度风云榜一共有50个关键词,我们先任选其中一个打开看看。

一、实验目的

我们的目的是chardect库学会处理网络响应数据的乱码问题,结合具体爬虫实战讲解。

二、代码实战

2.1 定位关键词及其链接

F12键盘打开开发者工具,我们定位关键词及其对应的html标签。在这里我们使用pyquery库定位 class属性为'keyword'的td。

#百度风云榜页面网址(含有50个热门新闻的关键词)

fengyunbang_url = 'http://top.baidu.com/buzz?b=1'

resp = requests.get(fengyunbang_url)

#从html文件中解析出 事件字段和 网址字段

doc = PyQuery(resp.text)

for item in doc.items('.keyword'):

keyword = item('a').text().split(' ')[0]

keyword_link=item('a').attr.href

print(keyword,keyword_link)

运行,结果keyword全部为乱码,没有一点中文的痕迹。

这就是我们今天要克服的问题-html编码问题。

遇到这种问题问题,我们可能会先在html标签中查找charset字符集。一般charset值有utf-8、gbk、gb2312、ascii等。

再次运行,汉字正常显示。

2.2 定位搜索页面新闻链接

上面我们获取到了关键词及其链接,浏览器点击“46年吃3万个汉堡”对应的链接,跳转到 百度搜索页,如下图。

我们想获取新闻内容,而要获取新闻内容,我们就要知道新闻对应的链接。首先我们要定位,如下图。这里我们使用另外一种方式定位链接-正则表达式。

def get_keywords_news_links(keyword_link):

"""

访问关键词百度网址,得到相关新闻的link

:param keyword_link:

:return:

"""

headers = {'User-Agent': '你的user-agent'}

resp = requests.get(keyword_link, headers=headers)

bsObj = BeautifulSoup(resp.text, 'html.parser')

news_items = bsObj.find_all('div', {'class': 'result c-container '})

news_links = []

for item in news_items:

links = re.findall('href="(.*?)"', str(item))

news_links.extend(links)

#防止链接重复

news_links = set(news_links)

return news_links

但是后来发现有的链接是无法访问的,比如运行中居然抽取出含有http://cache.baiducontent***这种的网页,经过测试,只要剔除掉这种链接,剩下的都为有效链接。

2.3 获取新闻文本内容

有了上文获取到的链接,我们写个简单的代码获取文本内容。由于获取到的网址来源成百上千的网站,如果要精确获取新闻内容,需要对每一个网站一对一的进行定位。这样太麻烦,为了快速方便,我们使用正则匹配出所有的中文内容。

def get_news_content(link):

"""

根据新闻网址,获取新闻数据

:return: 新闻内容

"""

resp = requests.get(link)

#最终只有汉字保留。

news_text = ''.join(re.findall('[\u4e00-\u9fa5]+', resp.text))

return news_text

但是运行过程中,经常返回空。说明正则匹配中文时候匹配不到。很可能的原因是页面中没有中文,但是我们检测了这些页面都是有中文的,那么很有可能是因为页面乱码,导致正则[\u4e00-\u9fa5]+无法匹配到中文。经过检测,真的是乱码。解决办法resp.encoding='编码'。但是编码是什么值呢?这里我用新的方法,chardect库检测二进制数据中采用的编码方式。

def get_news_content(link):

"""

根据新闻网址,获取新闻数据

:return: 新闻内容

"""

resp = requests.get(link)

news_text = ''.join(re.findall('[\u4e00-\u9fa5]+', resp.text))

#网页乱码,导致news_text为空

if not news_text:

#根据二进制数据检测html的编码。

#resp.content获取html二进制数据

chaset = chardet.detect(resp.content)['encoding']

#解决编码问题

resp.encoding = chaset

news_text = ''.join(re.findall('[\u4e00-\u9fa5]+', resp.text))

return news_text

return news_text

2.4 编写爬虫主函数

编写爬虫主函数,将数据保存到csv中。

#主函数,访问并保存所有的新闻数据

def FetchAndSave():

#百度风云榜页面网址(含有50个热门新闻的关键词)

fengyunbang_url = 'http://top.baidu.com/buzz?b=1'

resp=requests.get(fengyunbang_url)

resp.encoding='gb2312'

#新建excel文件保存数据。

csvf = open('data.csv', 'a+', encoding='gbk', newline='')

writer = csv.writer(csvf)

writer.writerow(('news_content', 'keyword'))

#从heml文件中解析出 事件字段和 网址字段

doc = PyQuery(resp.text)

for itm in doc.items('.keyword'):

keyword = itm('a').text().split(' ')[0]

keyword_link = itm('a').attr.href

news_links = get_keywords_news_links(keyword_link)

for news_link in news_links:

try:

content = get_news_content(news_link)

#防止新闻内容为空的写入csv中

if content:

writer.writerow((content, keyword))

except:

print(news_link)

#运行爬虫

FetchAndSave()

运行爬虫,采集了50个关键词共388篇新闻内容。

数据采集

文本处理分析

数据结构

杂文

打赏还可提问哦!

如果你有什么问题,也可以扫码提问。大邓知无不言,言无不尽。

python爬虫的数据如何解决乱码_写爬虫时如何解决网页乱码问题相关推荐

  1. linux scrapy 定时任务_写爬虫一定要会scrapy?-Python每日3题(爬虫专题)

    这里是Python7编程挑战-爬虫专题! 每天学习3个问题,包括初级,中级,高级问题各1个. 今天是第2天!一起来呀,就7天! 每日3题是麦叔的面试系列专题之一,每天包括初级,中级,高级难度题目各一道 ...

  2. python写入excel表格数据绘制图表_(原创)xlsxwriter,python excel 写入数据\图表等操作_图表操作(二)...

    前面分享了使用xlsxwriter创建excel和写入数据GUC:(原创)xlsxwriter,python excel 写入数据\图表等操作_创建.写入(一)​zhuanlan.zhihu.com ...

  3. python使用phantomJS循环for爬取多个页面时,解决内存持续变大而报错“ConnectionResetError: [WinError 10054]远程主机强迫关闭了一个现有的连接”的问题

    python使用phantomJS循环for爬取多个页面时,解决内存持续变大而报错"ConnectionResetError: [WinError 10054]远程主机强迫关闭了一个现有的连 ...

  4. 计算机桌面怎么设置在开始菜单,电脑桌面开始菜单不见了应该如何解决?_开始菜单不见了解决办法介绍...

    电脑桌面开始菜单不见了应该如何解决?_开始菜单不见了解决办法介绍 2018-06-22 16:26:29 近期朋友在电脑使用过程中,电脑桌面的开始菜单突然就消失不见了,以为重启之后就会成功显示出来,但 ...

  5. Python简单实现数据降噪滤波处理_滢泷版

    Python简单实现数据降噪.滤波处理_滢泷版 由于项目需要对数据进行降噪滤波处理,又要尽可能保证变化特征不失真. 我在网上搜索了一下Python的方库,没找到. 我安装了scipy 之后找不到spl ...

  6. tomcat java 参数乱码_【java】怎样解决tomcat中get提交中文参数为乱码的问题

    详解: http://www.360doc.com/content/10/0815/14/2736180_46209475.shtml 老是碰到中文问题,再解决一小点. 这次碰到的问题是,浏览器把ur ...

  7. 用python玩转数据第一周答案_用Python玩转数据_答案

    用Python玩转数据_答案 答案: 更多相关问题 求由参数方程所确定的函数y=y(x)的二阶导数 已知数列的通项公式,则取最小值时=,此时=. (本小题满分10分)已知是等差数列,其中](1)求的通 ...

  8. 用python玩转数据第四周答案_用Python玩转数据_答案公众号

    用Python玩转数据_答案公众号 更多相关问题 隧道式一次发酵设备投资很少().隔音符号一般加在哪些字母开头的拼音上?隧道洞口工程包括石方开挖.洞口防护与排水工程.洞门建筑的制作.安装.明洞工程.( ...

  9. 用python玩转数据第四周答案_大学mooc用Python玩转数据答案搜题公众号

    大学mooc用Python玩转数据答案搜题公众号 更多相关问题 不寐多梦,易于惊醒,胆怯心悸,气短倦怠,小便清长,舌淡,脉弦细.治疗主方为 "以痛为腧"这一名词首载于 先指出&qu ...

最新文章

  1. 快手团队长文解读:基于FPGA加速的自动语音识别在大规模直播和短视频场景的应用...
  2. 超融合服务器虚拟化优缺点,超融合是什么 意思?为什么必须是软硬件一体?...
  3. php中time()和mktime()方法的区别
  4. jquery li ul 伪分页_求教关于Jquery的ul li的分页,该怎么处理
  5. 跟面试官侃半小时MySQL事务隔离性,从基本概念深入到实现
  6. Android Bundle类别
  7. 面试题,你如何进行产品改版的?
  8. Matlab数据插值-内插、外插
  9. mysql 增加 date 列_mysql数据库修改添加Date格式列的方法
  10. 利用xslt对xml进行缩进格式化处理
  11. matlab里的speed,matlab虚数 分析一下getspeed()函数
  12. qlineedit 获取文本_Python如何获取QLineEdit文本?
  13. c语言小车程序,循迹小车的C语言程序(带注释)
  14. 守望先锋服务器修改,守望先锋开发者访谈:关于自定义的服务器
  15. 容联云通讯完成发送验证码
  16. 如何删除Mysql注册列表残余文件
  17. Windows版本下安装使用Grafana教程
  18. python scrapy爬虫电影_Python爬虫Scrapy框架(2) -- 爬取优酷电影进阶
  19. android手机怎么拍月亮,nubia相机怎么拍月亮 努比亚手机相机拍月亮教程
  20. Github使用教程(一)--搭建Github环境

热门文章

  1. Maven笔记——依赖管理
  2. @qualifier注解_常见的 Spring 注解概览
  3. 2引擎帮助文档_Simcenter Amesim 16液压部分帮助文档中英文对照(2)
  4. 高斯投影坐标系为什么是六七八位数
  5. 【转】聊聊分布式事务,再说说解决方案
  6. 【转】3.2SharePoint服务器端对象模型 之 访问文件和文件夹(Part 2)
  7. c语言3种链接属性: 外部(external), 内部(internal),无设置(none)
  8. fatal error lnk1120: 1 个无法解析的外部命令_3月1日七牛云存储割韭菜的应对方法...
  9. plus 什么是mybais_谈谈自己用mybatis-plus中的一些经验。
  10. mysql一对一级联_MySQL 表的一对一、一对多、多对多问题