在爬取12306网站时 print(response.text)发现会出现乱码情况
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title> ä¸å½é路客æ·æå¡ä¸å¿ </title> <head> <script lang="JAVASCRIPT"> var url = location.host; //var url = "www.12306.cn"; var url_ky=location.href; //var url_ky="http://kyfw.12306.cn/cc" var reg1 = new RegExp("^http://kyfw.12306.cn/(.+)") //å½è®¿é®http://kyfw.12306.cn/*æ¶ï¼éå®åè³https://kyfw.12306.cn/* var reg2 = new RegExp("^http(s)?://kyfw.12306.cn(/)?$") //å½è®¿é®http://kyfw.12306.cnæhttps://kyfw.12306.cnæ¶ï¼éå®å为https://kyfw.12306.cn/otn var newUrl=""; //console.log("reg1:"+reg1.test(url_ky)) //console.log("reg2:"+reg2.test(url_ky)) if(reg1.test(url_ky)) { newUrl=url_ky.replace(reg1,"https://kyfw.12306.cn/$1"); window.location=newUrl; }else if(reg2.test(url_ky)){ newUrl=url_ky.replace(reg2,"https://kyfw.12306.cn/otn"); window.location=newUrl; }else if(url=="www.12306.cn"||url=="www.95306.cn"){ window.location="/mormhweb/"; }else if(url=="kyfw.95306.cn"){ window.location="/otn/"; } /* if(url=="www.12306.cn") { window.location="/mormhweb/"; } else { if(url=="wap.12306.cn") { window.location="/mormhwap/"; } else { alert("éæ³çå°åï¼æµè§å¨å°å³éï¼"); window.close(); } } */ </script> </html> Requests会自动解码来自服务器的内容
经过查询资料requests会根据请求头中的charset来猜测网页解码方式,但是12306的响应体中没有指定charset,那么requests会默认使用ISO-8859-1编码格式(因为requests库是欧洲人写的),但是12306网页是通过utf-8格式来编码的。requests库中提供了一个方法能够查询到网页的编码格式
requests.utils.get_encodings_from_content(response.text)[0])
我们来看一下爬取12306网页 requests的猜测解码和12306网页的编码
print(response.encoding) # requests猜测的编码格式 print(requests.utils.get_encodings_from_content(response.text)[0])
所以requests的猜测解码方式和网页真正的编码方式不一致导致会出现乱码
这里只需要指定一下requests的猜测方法即可解决问题
response.encoding = "utf-8" print(response.text)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title> 中国铁路客户服务中心 </title> <head> <script lang="JAVASCRIPT"> var url = location.host; //var url = "www.12306.cn"; var url_ky=location.href; //var url_ky="http://kyfw.12306.cn/cc" var reg1 = new RegExp("^http://kyfw.12306.cn/(.+)") //当访问http://kyfw.12306.cn/*时,重定向至https://kyfw.12306.cn/* var reg2 = new RegExp("^http(s)?://kyfw.12306.cn(/)?$") //当访问http://kyfw.12306.cn或https://kyfw.12306.cn时,重定向为https://kyfw.12306.cn/otn var newUrl=""; //console.log("reg1:"+reg1.test(url_ky)) //console.log("reg2:"+reg2.test(url_ky)) if(reg1.test(url_ky)) { newUrl=url_ky.replace(reg1,"https://kyfw.12306.cn/$1"); window.location=newUrl; }else if(reg2.test(url_ky)){ newUrl=url_ky.replace(reg2,"https://kyfw.12306.cn/otn"); window.location=newUrl; }else if(url=="www.12306.cn"||url=="www.95306.cn"){ window.location="/mormhweb/"; }else if(url=="kyfw.95306.cn"){ window.location="/otn/"; } /* if(url=="www.12306.cn") { window.location="/mormhweb/"; } else { if(url=="wap.12306.cn") { window.location="/mormhwap/"; } else { alert("非法的地址,浏览器将关闭!"); window.close(); } } */ </script> </html>