关于request爬取的时候出现乱码问题

本文介绍了解决从12306网站爬取数据时出现的中文乱码问题,通过调整编码方式为utf-8,成功解决了中文字符的乱码显示,确保了爬虫获取信息的准确性。

学习爬虫的时候,经常会遇到这种问题,即显示的内容为乱码。
以下为12306作为一个例子,执行代码如下

import requests

response = requests.get('https://www.12306.cn')
print(response.encoding)
print(response.text)

在这里插入图片描述
可以看到返回response编码类型为 ISO-8859-1,文本输出中中文字符为乱码。

那么最简单的方法就是增加utf-8编码的转化,如下:

import requests

response = requests.get('https://www.12306.cn')
response.encoding = 'utf-8'
# 查看编码方式
print(response.encoding)
print(response.text)

这样问题就解决了。

解决 request 返回数据乱码问题有多种方法,以下为不同场景下的解决方式: ### Java Servlet 场景 在 Java Servlet 中,对于 POST 和 GET 请求,可通过设置请求的字符编码来解决中文乱码问题。以 POST 请求为例,因为 POST 是通过流 `getReader()` 方法传输数据,需要改变流的编码格式为 UTF - 8。示例代码如下: ```java package com.huanle.web; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/req4") public class RequestDemo4 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 先解决乱码问题Post,因为Post是通过流getReader()方法 传输数据,改变流的编码格式为utf-8 request.setCharacterEncoding("utf-8"); // 获取username System.out.println("==========获取username========="); String username = request.getParameter("username"); System.out.println("解决后" + username); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } } ``` 此代码将请求的字符编码设置为 UTF - 8,从而解决中文乱码问题[^4]。 ### Java 手动转换编码 还可以通过手动转换编码来解决乱码问题。先拿到乱码反向查找 ISO - 8859 - 1 码表,获取原始数据,再构造一个字符串让它去查找 UTF - 8 码表,以得到正常数据,示例代码如下: ```java String value = request.getParameter("username"); // 拿到乱码反向查找 iso-8859-1 码表,获取原始数据 // 在构造一个字符串让它去查找UTF-8 码表,已得到正常数据 ``` 这样可以将乱码数据转换为正确的中文数据[^2]。 ### SpringMVC 场景 在 SpringMVC 中,可以使用专门的过滤器来解决请求的中文乱码问题。在 `web.xml` 中进行如下配置: ```xml <!--设置字符编码--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 该配置会对所有请求应用字符编码过滤器,将编码设置为 UTF - 8,从而解决中文乱码问题[^5]。 ### NodeJs 爬虫场景 在 NodeJs 爬虫中遇到返回数据乱码的情况,可通过以下步骤解决: 1. 用 Fiddler 抓取想要爬取的请求,得到原生的请求 header 和参数。 2. 用 NodeJs 的 `request` 模块写模拟请求的代码,把 Fiddler 得到的 header 写入其中(用百度网址测试)。 3. 若运行后返回的 `body` 是乱码,可参考相关资料进一步处理,如对比 Python 代码爬取测试结果(相同代码 Python 不会乱码),分析乱码原因并解决[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值