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

实战讲解,文章较长,对爬虫比较熟悉的浏览翻看章节 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篇新闻内容。

数据采集

文本处理分析

数据结构

杂文

打赏还可提问哦!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg源代码简单分析-其他-libswscale的sws_getContext()

参考链接 FFmpeg源代码简单分析:libswscale的sws_getContext()_雷霄骅的博客-CSDN博客 libswscale的sws_getContext() FFmpeg中类库libswsscale用于图像处理(缩放,YUV/RGB格式转换)libswscale是一个主要用于处理图片像素数据的类…

IntelliJ IDEA 学习笔记

IDEA教学视频 文章目录1.IntelliJ IDEA的介绍和优势IDEA 的主要优势2.版本介绍与安装前的准备3.IDEA的卸载4.IDEA的安装5.安装目录和设置目录结构的说明安装目录设置目录6.启动IDEA并执行HelloWorld7.Module的使用8.IDEA的常用设置9.快捷键的设置10.常用的快捷键的使用111.常用…

机器学习顶刊文献_人工智能顶刊TPAMI2019最新《多模态机器学习综述》

原标题:人工智能顶刊TPAMI2019最新《多模态机器学习综述》来源:专知摘要:”当研究问题或数据集包括多个这样的模态时,其特征在于多模态。【导读】人工智能领域最顶级国际期刊IEEE Transactions on Pattern Analysis and Machine I…

Windows上同时运行两个Tomcat

步骤 1.获得免安装包 从Tomcat官网下载免安装包。 2.解压复制 解压并创建两个副本tomcat1和tomcat2,它们的路径分别为: tomcat1:C:\tomcat\double\apache-tomcat-7.0.90-8081tomcat2:C:\tomcat\double\apache-tomcat-7.0.90-…

FFmpeg源代码简单分析-其他-libswscale的sws_scale()

参考链接 FFmpeg源代码简单分析:libswscale的sws_scale()_雷霄骅的博客-CSDN博客_bad dst image pointers libswscale的sws_scale() FFmpeg的图像处理(缩放,YUV/RGB格式转换)类库libswsscale中的sws_scale()函数。libswscale是一…

布朗桥python_MATLAB 里面有哪些加快程序运行速度的方法呢,求分享?

挖坟了…睡不着觉当个备忘录记一下用过的方法吧1. 循环向量化2. 利用函数的矩阵输入功能批量处理3. 必须用for且费时的地方改成单层parfor,要是循环次数比cpu核数还少反而会拖慢程序4. 非常大的矩阵的运算可以用gpuArray(这个在matlab 深度学习工具箱中深有体会)5. …

FFmpeg源代码简单分析-其他-libavdevice的avdevice_register_all()

参考链接 FFmpeg源代码简单分析:libavdevice的avdevice_register_all()_雷霄骅的博客-CSDN博客 libavdevice的avdevice_register_all() FFmpeg中libavdevice注册设备的函数avdevice_register_all()。avdevice_register_all()在编程中的使用示例可以参考文章&#…

Tomcat无需输入项目名,直接用域名访问项目

问题 在Tomcat上开发Web应用,通常是将应用放置Tomcat主目录下webapps,然后在浏览器地址栏输入域名应用名(如http://localhost:8080/app)对应用进行访问。 为了方便开发,打算直接用域名访问项目。例如,在浏…

蓝牙该串口设备不存在或已被占用_电脑识别不了串口设备如何解决_电脑检测不到串口怎么办...

2015-09-07 10:46:45win8.1系统USB转串口不能识别设备出现错误代码10的解决方法分享给大家,win8.1系统插入USB设备提示“指定不存在的设备”,左下角有小黄色感叹号,导致设备无法识别不能识别...2016-12-02 10:52:57一般情况下,win…

FFmpeg源代码简单分析-其他-libavdevice的gdigrab

参考链接 FFmpeg源代码简单分析:libavdevice的gdigrab_雷霄骅的博客-CSDN博客_gdigrab libavdevice的gdigrab GDIGrab用于在Windows下屏幕录像(抓屏)gdigrab的源代码位于libavdevice\gdigrab.c。关键函数的调用关系图如下图所示。图中绿色背…

分区和分片的区别_PHP: 分区和分片 - Manual

分区和分片数据库群组是由于各种各样的原因建立的,他可以提升处理能力、容忍错误,并且提升大量服务器同时工作的的性能。群组有时会组合分区和共享功能,来将大量复杂的任务分拆成更加简单的任务,更加可控的单元。插件可以支持各种…

Ubuntu安装GmSSL库适用于ubuntu18和ubuntu20版本

参考链接 编译与安装【GmSSL】GmSSL 与 OpenSSL 共存的安装方法_阿卡基YUAN的博客-CSDN博客_openssl和gmssl在Linux下安装GmSSL_百里杨的博客-CSDN博客_安装gmssl ubuntu18操作 需要超级管理员权限本人将下载的安装包master.zip和安装的位置都设定在/usr/local下创建文件夹/u…

Windows7右键菜单栏添加打开cmd项

背景简介 众所周知,在Linux桌面操作系统中的工作目录窗口中,单击鼠标右键,弹出的菜单栏通常有一项“打开终端”,然后移动鼠标点击该项,就可以打开Shell窗口,在当前工作目录进行命令行操作。 但是&#xf…

python11_Python11,文件操作

整了这么多杂七杂八又“没用”的,终于来点实际的操作了。Python中用open()方法来对打开文件。我们来看看它的用法:path "C:\\Users\Frank\Desktop\\text.txt"f open(path,r,encoding"utf-8")首先给变量path指定一个路径&#xff0…

在ubuntu环境下执行openssl编译和安装

参考链接 工具系列 | Ubuntu18.04安装Openssl-1.1.1_Tinywan的技术博客_51CTO博客密码学专题 openssl编译和安装_MY CUP OF TEA的博客-CSDN博客_openssl 编译安装 下载 /source/index.html编译 使用命令sudo tar -xvzf openssl-1.1.1q.tar.gz 解压。使用cd openssl-1.1.1q/进…

chrome 使用gpu 加速_一招解决 Chrome / Edge 卡顿缓慢 让浏览器重回流畅顺滑

最近一段时间,我发现电脑上的 Chrome 谷歌浏览器越用越卡了。特别是网页打开比较多,同时还有视频播放时,整个浏览器的响应速度都会变得非常缓慢,视频也会卡顿掉帧。 我用的是 iMac / 32GB 内存 / Intel 四核 i7 4Ghz CPU,硬件性能应该足以让 Chrome 流畅打开几十个网页标签…

CLion运行程序时添加命令行参数 即设置argv输入参数

参考链接 CLion运行程序时添加命令行参数_三丰杂货铺的博客-CSDN博客_clion命令行参数 操作流程 Run -> Edit -> Configuration -> Program arguments那里添内容最快捷的方式是,点击锤子编译图标和运行图标之间的的图标,进行Edit Configurati…

python的userlist_Python Collections.UserList用法及代码示例

Python列表是array-like数据结构,但与之不同的是它是同质的。单个列表可能包含数据类型,例如整数,字符串以及对象。 Python中的列表是有序的,并且有一定数量。根据确定的序列对列表中的元素进行索引,并使用0作为第一个…

解决 SSL_CTX_use_certificate:ca md too weak:ssl/ssl_rsa.c 问题

报错原因分析 原因是openssl调整了安全级别,要求ca具备更高等级的安全,因此先前发布的证书,如果采用了不安全的算法,比如MD5,就会显示上述这个错误 解决办法 重新生成证书,先前证书弃用使用函数 SSL_CTX_…

向上滚动 终端_ubuntu

Ubuntu终端Terminal常用快捷键Ubuntu终端Terminal常用快捷键 快捷键 功能 Tab 自动补全 Ctrla 光标移动到开始位置 Ctrle 光标移动到最末尾 Ctrlk 删除此处至末尾的所有内容 Ctrlu 删除此处至开始的所有内容 Ctrld 删除当前字符 Ctrlh 删除当前字符前一个字符 Ctrlw 删除此处到…