15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 写爬虫时如何解决网页乱码问题

写爬虫时如何解决网页乱码问题

时间:2023-07-04 05:39:01 | 来源:网站运营

时间:2023-07-04 05:39:01 来源:网站运营

写爬虫时如何解决网页乱码问题:实战讲解,文章较长,对爬虫比较熟悉的浏览翻看章节 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篇新闻内容。










数据采集

【视频讲解】Scrapy递归抓取简书用户信息

美团商家信息采集神器

gevent:异步理论与实战

轻盈高效的异步访问库grequests库

selenium驱动器配置详解

爬虫神器PyQuery的使用方法

简易SQLite3数据库学习




文本处理分析

如何从文本中提取特征信息?

对于中文,nltk能做哪些事情

留在网上的每个字,都在泄露你的身份




数据结构

优雅简洁的列表推导式

Get小技巧等分列表

如何对数据进行各种排序?




杂文

Python通过字符串调用函数

Python圈中的符号计算库-Sympy

Python中处理日期时间库的使用方法

为什么你要为2019,而不是2018做计划?

2017年度15个最好的数据科学领域Python库




http://weixin.qq.com/r/pjo6IhLEJU9arVZB92_0 (二维码自动识别)




打赏还可提问哦!

项目代码链接: 链接: https://pan.baidu.com/s/1f6tjIodW_RD1SXrdskdXdw 密码: sqfb

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








关键词:解决,爬虫

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭