python爬虫数据分析,第一个数据是乱码,但后面的数据又是正确的,大佬们解答一下呀,谢谢。(附图)

(2) (2) (3) (2) (6) (2) (3) (4) (22) (21) (4) (1) (4) (1) (1) (1) (1) (15) (8) (203) (57) (49) (2) (13) (1) (13) (14) (1) (208) (5) (1) (2) (9) (16) (9) (5) (8) (3) (3)
(23813) (11026) (6722) (4713) (4536) (4336) (4331) (3982) (3980) (3807)
(3) (3) (2) (1) (1) (2) (4) (3) (5) (4) (6) (4) (3) (9) (3) (1) (6) (3) (12) (4) (9) (8) (11) (2) (5) (47) (26) (22) (62) (68) (23) (2) (6) (13) (7) (9) (6) (14) (14) (1) (2) (3) (5) (9)
&&&&最近在写一个爬虫,目标网站是:,可能是为了防止被爬取数据,它给自身数据加了密。用谷歌自带的抓包工具也不能捕获到数据。于是下了Fiddler。&&&&Fiddler的爬取结果如下:&&&&可见,除了头信息之外,下面的数据信息显示成了乱码。这样就不能用程序模拟浏览器发送数据了。&&&&解决办法之一就是获取此字符串的十六进制编码。将Fiddler切换至Hexview,如下图所示:&&&&其中蓝色部分是header头信息,黑色字体就是传送的数据。你还可以右键-》取消勾选show header,这样显示的便都是数据信息。&&&&我们程序中可以将这个十六进制字符长串转化成字符串,然后发送到web服务器中。&&&&转化的程序如下所示:public&static&byte[]&GetByteArray(string&frame)
&&&&byte[]&buffer&=&new&byte[frame.Length&/&2];&&&&//注意每两个十六进制字符代表一个二进制编码
&&&&for&(int&i&=&0;&i&&&frame.Length&/&2;&i++)
&&&&&&&&int&t&=&GetData(frame[2&*&i])&*&16&+&GetData(frame[2&*&i&+&1]);
&&&&&&&&buffer[i]&=&(byte)t;
&&&&&return&
static&int&GetData(char&p)&&&&//获得ASCII编码
&&&&if&(p&&=&'9'&&&&p&&=&'0')
&&&&&&&&return&p&-&'0';
&&&&&&&&return&p&-&'a'&+&10;
}&&&&但是遇到一个问题就是,如何将Fiddler的十六进制字符串拷贝出来,若手动抄写,很不现实,一来太长,二来怕错。可以借助Notepad++或者UltraEdit转化过来。本人用Notepad++实验成功:&&&&1、先选中你要导出的十六进制字符长串-》右键-》save selected bytes-》到一文件中。&&&&2、用Notepad++打开此文件,发现仍然是乱码&&&&3、下载十六进制显示插件下载:&&&&4、解压后将HexEditor.dll文件放在Notepad++安装目录的plugins目录下,重启notepad++&&&&5、再次用Notepad++打开文件,plugins-&HEX-Editor-&View in HEX,显示如下:&&&&6、选中你要复制的十六进制字符串,复制,然后新建文本,粘贴,就是一个带有空格的字符串了。去除空格和换行即可。&&&&7、有一种快速去除空格的方法,选中一个空格,ctrl+f,切换到替换标签,然后点击替换所有按钮,这样将所有的空格都替换成了空字符串,也就删除了所有空格。
转载请注明: >>&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
python 网络爬虫入门(一)&&&第一个python爬虫实例
摘要:http://blog.csdn.net/bo_wen_/article/details/最近两天学习了一下Python,并自己写了一个网络爬虫的例子。&python版本:3.5&IDE:pycharm5.0.4&要用到的包可以用pycharm下载:&File-&DefaultSettings-&DefaultProject-&ProjectInterpreter&选择python版本并点右边
http://blog.csdn.net/bo_wen_/article/details/
最近两天学习了一下Python,并自己写了一个网络爬虫的例子。&python版本: 3.5&IDE : pycharm 5.0.4&要用到的包可以用pycharm下载:&File-&Default Settings-&Default Project-&Project Interpreter&选择python版本并点右边的加号安装想要的包&
我选择的网站是中国天气网中的苏州天气,准备抓取最近7天的天气以及最高/最低气温&http://www.weather.com.cn/weather/.shtml&
程序开头我们添加:
#coding : UTF-8
这样就能告诉解释器该py程序是utf-8编码的,源程序中可以有中文。
要引用的包:
import requests
import csv
import random
import time
import socket
import http.client
#import urllib.request
from bs4import BeautifulSoup
&p style=&margin-top:0 margin-bottom:1.1 padding-top:0 padding-bottom:0 color:rgb(85,85,85); font-family:&microsoft yahei&; font-size:14 line-height:35px&&requests:用来抓取网页的html源代码&&br style=&& /&csv:将数据写入到csv文件中&&br style=&& /&random:取随机数&&br style=&& /&time:时间相关操作&&br style=&& /&socket和http.client 在这里只用于异常处理&&br style=&& /&BeautifulSoup:用来代替正则式取源码中相应标签中的内容&&br style=&& /&urllib.request:另一种抓取网页的html源代码的方法,但是没requests方便(我一开始用的是这一种)&p style=&margin-top:0 margin-bottom:1.1 padding-top:0 padding-bottom:0 color:rgb(85,85,85); font-family:&microsoft yahei&; font-size:14 line-height:35px&&&span style=&&&获取网页中的html代码:&p style=&margin-top:0 margin-bottom:1.1 padding-top:0 padding-bottom:0 color:rgb(85,85,85); font-family:&microsoft yahei&; font-size:14 line-height:35px&&&span style=&&&&p align=&left&&&span style=&color:#000088;&&def&span style=&color:#333333;&& get_content&span style=&color:#660066;&&(url , data = None)&span style=&color:#333333;&&:&p align=&left&&&span style=&color:#333333;&&&&& header={&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#008800;&&'Accept'&span style=&color:#333333;&&: &span style=&color:#008800;&&'text/html,application/xhtml+xml,application/q=0.9,image/webp,*/*;q=0.8'&span style=&color:#333333;&&,&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#008800;&&'Accept-Encoding'&span style=&color:#333333;&&: &span style=&color:#008800;&&'gzip, deflate, sdch'&span style=&color:#333333;&&,&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#008800;&&'Accept-Language'&span style=&color:#333333;&&: &span style=&color:#008800;&&'zh-CN,q=0.8'&span style=&color:#333333;&&,&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#008800;&&'Connection'&span style=&color:#333333;&&: &span style=&color:#008800;&&'keep-alive'&span style=&color:#333333;&&,&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#008800;&&'User-Agent'&span style=&color:#333333;&&: &span style=&color:#008800;&&'Mozilla/5.0 (Windows NT 6.3; WOW64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'&p align=&left&&&span style=&color:#333333;&&&&& }&p align=&left&&&span style=&color:#333333;&&&&& timeout =random.choice(range(&span style=&color:#006666;&&80&span style=&color:#333333;&&, &span style=&color:#006666;&&180&span style=&color:#333333;&&))&p align=&left&&&span style=&color:#333333;&&&&& &span style=&color:#000088;&&while&span style=&color:#000088;&&True&span style=&color:#333333;&&:&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#000088;&&try&span style=&color:#333333;&&:&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&& rep =requests.get(url,headers = header,timeout = timeout)&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&&rep.encoding = &span style=&color:#008800;&&'utf-8'&p align=&left&&&span style=&color:#333333;&&&& &&&&&&&&&&span style=&color:#880000;&&# req = urllib.request.Request(url, data,header)&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&& &span style=&color:#880000;&&# response = urllib.request.urlopen(req,timeout=timeout)&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&& &span style=&color:#880000;&&# html1 =response.read().decode('UTF-8', errors='ignore')&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&& &span style=&color:#880000;&&# response.close()&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&& &span style=&color:#000088;&&break&p align=&left&&&span style=&color:#333333;&&&&&&&& &&span style=&color:#880000;&&# except urllib.request.HTTPError as e:&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#880000;&&#&&&&&&&&print( '1:', e)&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#880000;&&#&&&&&&&&time.sleep(random.choice(range(5, 10)))&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#880000;&&#&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#880000;&&# except urllib.request.URLError as e:&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#880000;&&#&&&&print( '2:', e)&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#880000;&&#&&&&time.sleep(random.choice(range(5, 10)))&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#000088;&&except&span style=&color:#333333;&& socket.timeout &span style=&color:#000088;&&as&span style=&color:#333333;&& e:&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&& print( &span style=&color:#008800;&&'3:'&span style=&color:#333333;&&, e)&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&&time.sleep(random.choice(range(&span style=&color:#006666;&&8&span style=&color:#333333;&&,&span style=&color:#006666;&&15&span style=&color:#333333;&&)))&p align=&left&&&span style=&color:#333333;&&&&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#000088;&&except&span style=&color:#333333;&& socket.error &span style=&color:#000088;&&as&span style=&color:#333333;&& e:&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&& print( &span style=&color:#008800;&&'4:'&span style=&color:#333333;&&, e)&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&&time.sleep(random.choice(range(&span style=&color:#006666;&&20&span style=&color:#333333;&&, &span style=&color:#006666;&&60&span style=&color:#333333;&&)))&p align=&left&&&span style=&color:#333333;&&&&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#000088;&&except&span style=&color:#333333;&&http.client.BadStatusLine &span style=&color:#000088;&&as&span style=&color:#333333;&& e:&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&& print( &span style=&color:#008800;&&'5:'&span style=&color:#333333;&&, e)&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&&time.sleep(random.choice(range(&span style=&color:#006666;&&30&span style=&color:#333333;&&, &span style=&color:#006666;&&80&span style=&color:#333333;&&)))&p align=&left&&&span style=&color:#333333;&&&&p align=&left&&&span style=&color:#333333;&&&&&&&&& &span style=&color:#000088;&&except&span style=&color:#333333;&&http.client.IncompleteRead &span style=&color:#000088;&&as&span style=&color:#333333;&& e:&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&& print( &span style=&color:#008800;&&'6:'&span style=&color:#333333;&&, e)&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&& time.sleep(random.choice(range(&span style=&color:#006666;&&5&span style=&color:#333333;&&, &span style=&color:#006666;&&15&span style=&color:#333333;&&)))&p align=&left&&&span style=&color:#333333;&&&&p align=&left&&&span style=&color:#333333;&&&&& &span style=&color:#000088;&&return&span style=&color:#333333;&& rep.text&p align=&left&&&span style=&color:#333333;&&&&& &span style=&color:#880000;&&# return html_text&pre code_snippet_id=&1976425& snippet_file_name=&blog__6464227& class=&prettyprint& name=&code& style=&white-space: word-wrap: break- box-sizing: border- position: overflow-y: overflow-x: margin-top: 0 margin-bottom: 1.1 font-family: &Source Code Pro&, padding: 5px 5px 5px 60 font-size: 14 line-height: 1.45; word-break: break- color: rgb(51, 51, 51); border: 1px solid rgba(128, 128, 128, 0.0745098); border-radius: 0 background-color: rgba(128, 128, 128, 0.0470588);&&
header是requests.get的一个参数,目的是模拟浏览器访问&header 可以使用chrome的开发者工具获得,具体方法如下:&打开chrome,按F12,选择network&&重新访问该网站,找到第一个网络请求,查看它的header&
timeout是设定的一个超时时间,取随机数是因为防止被网站认定为网络爬虫。&然后通过requests.get方法获取网页的源代码、&rep.encoding = ‘utf-8’是将源代码的编码格式改为utf-8(不该源代码中中文部分会为乱码)&下面是一些异常处理&返回 rep.text
获取html中我们所需要的字段:&这里我们主要要用到BeautifulSoup&BeautifulSoup 文档http://www.crummy.com/software/BeautifulSoup/bs4/doc/
首先还是用开发者工具查看网页源码,并找到所需字段的相应位置&找到我们需要字段都在 id = “7d”的“div”的ul中。日期在每个li中h1 中,天气状况在每个li的第一个p标签内,最高温度和最低温度在每个li的span和i标签中。&感谢Joey_Ko指出的错误:到了傍晚,当天气温会没有最高温度,所以要多加一个判断。&代码如下:
def get_data(html_text):
&&& final = []
&&& bs =BeautifulSoup(html_text, &html.parser&)&#创建BeautifulSoup对象
&&& body = bs.body #获取body部分
&&& data =body.find('div', {'id':'7d'})& # 找到id为7d的div
&&& ul = data.find('ul')&# 获取ul部分
&&& li =ul.find_all('li')&# 获取所有的li
&&& for dayin li: # 对每个li标签中的内容进行遍历
&&&&&&& temp = []
&&&&&&& date =day.find('h1').string&# 找到日期
&&&&&&&temp.append(date)& #添加到temp中
&&&&&&& inf =day.find_all('p')&# 找到li中的所有p标签
&&&&&&&temp.append(inf[0].string,)&# 第一个p标签中的内容(天气状况)加到temp中
&&&&&&& if inf[1].find('span')isNone:
&&&&&&&&&&&temperature_highest = None# 天气预报可能没有当天的最高气温(到了傍晚,就是这样),需要加个判断语句,来输出最低气温
&&&&&&& else:
&&&&&&&&&&&temperature_highest = inf[1].find('span').string&# 找到最高温
&&&&&&&&&&&temperature_highest = temperature_highest.replace('℃','')& # 到了晚上网站会变,最高温度后面也有个℃
&&&&&&&temperature_lowest = inf[1].find('i').string&# 找到最低温
&&&&&&&temperature_lowest = temperature_lowest.replace('℃','')& # 最低温度后面有个℃,去掉这个符号
&&&&&&&temp.append(temperature_highest)&&#将最高温添加到temp中
&&&&&&& temp.append(temperature_lowest)&&#将最低温添加到temp中
&&&&&&&final.append(temp)&& #将temp加到final中
&&& return final
&p style=&margin-top:0 margin-bottom:1.1 padding-top:0 padding-bottom:0 color:rgb(85,85,85); font-family:&microsoft yahei&; font-size:14 line-height:35px&&&span style=&&&写入文件csv:&&br style=&& /&将数据抓取出来后我们要将他们写入文件,具体代码如下:&p style=&margin-top:0 margin-bottom:1.1 padding-top:0 padding-bottom:0 color:rgb(85,85,85); font-family:&microsoft yahei&; font-size:14 line-height:35px&&&p align=&left&&&span style=&color:#000088;&&def&span style=&color:#333333;&& write_data&span style=&color:#660066;&&(data, name)&span style=&color:#333333;&&:&p align=&left&&&span style=&color:#333333;&&&&& file_name =name&p align=&left&&&span style=&color:#333333;&&&&& &span style=&color:#000088;&&with&span style=&color:#333333;&& open(file_name,&span style=&color:#008800;&&'a'&span style=&color:#333333;&&, errors=&span style=&color:#008800;&&'ignore'&span style=&color:#333333;&&, newline=&span style=&color:#008800;&&''&span style=&color:#333333;&&) &span style=&color:#000088;&&as&span style=&color:#333333;&& f:&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&& f_csv =csv.writer(f)&p align=&left&&&span style=&color:#333333;&&&&&&&&&&&&&f_csv.writerows(data)&pre code_snippet_id=&1976425& snippet_file_name=&blog__9942810& class=&prettyprint& name=&code& style=&white-space: word-wrap: break- box-sizing: border- position: overflow-y: overflow-x: margin-top: 0 margin-bottom: 1.1 font-family: &Source Code Pro&, padding: 5px 5px 5px 60 font-size: 14 line-height: 1.45; word-break: break- color: rgb(51, 51, 51); border: 1px solid rgba(128, 128, 128, 0.0745098); border-radius: 0 background-color: rgba(128, 128, 128, 0.0470588);&&
if __name__ =='__main__':
&&& url ='http://www.weather.com.cn/weather/.shtml'
&&& html =get_content(url)
&&& result =get_data(html)
&&&write_data(result, 'weather.csv')
然后运行一下:&生成的weather.csv文件如下:&
总结一下,从网页上抓取内容大致分3步:&1、模拟浏览器访问,获取html源代码&2、通过正则匹配,获取指定标签中的内容&3、将获取到的内容写到文件中
刚学python爬虫,可能有些理解有错误的地方,请大家批评指正,谢谢!
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
python 网络爬虫入门(一)&&&第一个python爬虫实例相关信息,包括
的信息,所有python 网络爬虫入门(一)&&&第一个python爬虫实例相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International胖爷,4年后见! --- 日
Python 网络爬虫 006 (编程)
解决下载(或叫:爬取)到的网页乱码问题
解决下载(或叫:爬取)到的网页乱码问题
使用的系统:Windows 10 64位
Python 语言版本:Python 2.7.10 V
使用的编程 Python 的集成开发环境:PyCharm 2016 04
我使用的 urllib 的版本:urllib2
注意: 我没这里使用的是 Python2 ,而不是Python3
,我介绍了如何下载网页。这样节我们来讲:如果我们下载一个带有中文的网站,或者日文的网站,终止就是不全是英文的网站,解决乱码问题。
一 . 解释乱码原因
Q: 为什么会出现乱码问题?
A: 编码方式不匹配导致的。
Q: 请具体说明一下?
A: 好的。
我先将 编写的download() 函数的代码贴出来:
import urllib2
def download(url, user_agent='wswp', num_retries=2):
print 'Downloading: ', url
headers = {'User-agent' : user_agent}
request = urllib2.Request(url, headers=headers)
html = urllib2.urlopen(request).read()
except urllib2.URLError as e:
print 'Download error', e.reason
html = None
if num_retries & 0:
if num_retries & 0:
if hasattr(e, 'code') and 500 &= e.code & 600:
return download(url, user_agent, num_retries-1)
return html
download()函数 里面,我们使用 html = urllib2.urlopen(request).read() 这句代码得到网页的源代码(str数据)。那么得到的源代码是使用什么编码方式编码的str字符串呢?是使用网页源代码中 charset属性设定的编码方式编码的str字符串。
比如:我们就来爬取本博客的源代码。我们可以在浏览器上查看到 本网页的编码方式是 utf-8 。所以,当你执行:html = download('xxx') 命令后,html 里面存储的就是一个以utf-8编码方式编码的字符串。
接着,我们就使用 print html 命令将其打印到终端上。PyCharm软件上有两个终端,一个是PyCharm软件自带的终端窗口:Run窗口;另一个就是Terminal窗口,Terminal窗口不是PyCharm软件自带的,它就是 Windows系统的DOS窗口。(如果是Linux系统,这个Terminal窗口就是 Console窗口)。
在 Run 窗口 :
打开 Setting 。
选择 Editor -& Code Style -& File Encodings ,将 Project Encoding 项设置为:UTF-8。
这样,我Run 窗口里面打印的内容都会按照UTF-8 编码的方式进行编码,然后显示在Run窗口里。
我们的代码中的 print html 这句话可以正常的将 html字符串里面的内容正常的打印到 Run 窗口里,不会有乱码的问题。
在 Terminal 窗口 :
假设,我们现在在 Terminal窗口里使用命令 运行这个 Python脚本。那么 print html 这段代码,会在Terminal窗口里面打印html 这个被utf-8编码方式编码的str字符串里面的内容。如果Terminal窗口显示字符串的编码方式也是 utf-8 的话,那么就不会有乱码的情况发生。
但是,你要知道:我们安装 Windows 系统的时候,设置的是 简体中文(默认),所以DOS窗口(命令提示符窗口)里显示的内容是被使用 gb2312 编码方式进行编码的。所以如果我们要显示 UTF-8 字符就会乱码。
在DOS窗口(或者 PyCharm软件中的Terminal窗口)中执行下面的命令来查看现在Windows系统使用的编码方式:
输出:(936 就是 gb2312编码的编号。)
活动代码页: 936
你可以到里进行查表。
Windows系统使用的是 ANSI编码方式,ANSI 不是一个编码,它是一个总称。如果你在安装Windows系统的时候,选择 简体中文(默认),那么 ANSI 在你的电脑里指的就是gb2321编码。Windows系统中所有的文件都是会被 gb2321 编码方式进行编码,所以,你在Windows上新建的txt文件都是gb2321编码文件。
那么这个时候如果我有一个 其他编码的文件,比如UTF-8文件,你要是在 DOS窗口中使用 type filename.txt 命令打开它,你所看到的就是一堆乱码。
那么这个时候我们怎么办?怎样在 Terminal窗口 中显示正确的 html 字符串里面正确的内容呢?我们只需要改写 print html 这句代码就可以,将其修改为:print html.decode('utf-8').encode('GB18030')。
我来解释一下这句代码:代码中的 .decode('utf-8') 的意思是:将 html 字符串(str)通过 utf-8 编码方式解码为Unicode字节(Bytes);接着 .encode('GB18030')
的意思是:将 解码得到的 Unicode字节(Bytes) 使用 GB18030编码方式 再编码成 Str字符串 (str)。
通过这样的转换,在 Terminal窗口中,就可以正常的被 gb2312编码方式正确的解析,并显示出来。(但是现在的代码,在 Run窗口上运行,就会是乱码了。你应该知道为什么。我不讲了。)
Q: 为什么要使用 GB18030 编码方式,不是要使用 gb2312 吗?
A: gb2312、GBK、GB18030 这三个编码方式其实可以看做是等价的关系。但是它们里面的编码的汉字数量不用,从少到多排序为:gb2312 & GBK & GB18030。有的网页虽然它的源代码中的 charset 属性写的是 gb2312 或者,GBK ,我们还是使用 GB18030编码最保险,使用其他的两个可能不会成功。
我们使用的是 Windows 系统上的 PyCharm 软件 做为我们开发的继承开发环境。
所谓:工欲善其事,必先利其器。PyCharm 软件上可以运行程序的有两个窗口:Run窗口 和 Terminal窗口。
我们应该统一 Run窗口 和 Terminal窗口 的编码方式,既然设置不了 Terminal 窗口的编码方式,那我们以后让 Run窗口 和 Terminal窗口 的编码方式都统一为 GBK 编码。这样,我们的程序就可以在这两个窗口里运用出同样的结果。(以后都使用 print html.decode('网页源代码的charset属性').encode('GB18030') 这样的代码打印信息。)
将 Pycharm软件的 Project Encoding 项设置为:GBK 即可统一Run窗口 和 Terminal窗口的编码方式。
二 . 扩展:如何使用程序获取网页的编码方式
获取网页的编码方式,即网页源代码中 charset 属性的值:
使用 Python 第三方库:chardet。
下载:(在DOS窗口中执行下面的命令)
C:\Python27\Scritp\pip.exe install chardet
html = download('http://blog.csdn.net/github_/article/details/')
import chardet
charset = chardet.detect(html)['encoding']
print charset
运行输出:
注意: 之前有的地方给写错了。现在已经修改正确。
贤贤加油这为朋友的提醒:
chardet 是我们使用的第三方库。
charset 是网页源代码里面存放编码方式的变量。
题目:爬取目标网站:
分析:目标网站的源代码中,charset 属性值为:gb2312
所以,爬虫代码是:
html = download('http://www.dytt8.net/')
print html
其中 print html 这段代码也可以写成:print html.decode('GBK').encode('GB18030')
运行:现在,不管是 Run窗口,还是Terminal窗口,还是Windows 的 DOS窗口,显示都是正常的,没有乱码。
现在,我已经知道了为什么会出现乱码,也知道了如何解决乱码问题,现在我们就可以修改 download() 函数,将其变成一个永远都不会出现乱码问题的函数。
四 . 最终的 download() 函数的程序:
import urllib2
import chardet
def download(url, user_agent='wswp', num_retries=2):
print 'Downloading: ', url
headers = {'User-agent' : user_agent}
request = urllib2.Request(url, headers=headers)
html = urllib2.urlopen(request).read()
charset = chardet.detect(html)['encoding']
if charset == 'GB2312' or charset == 'gb2312':
html = html.decode('GBK').encode('GB18030')
html = html.decode(charset).encode('GB18030')
except urllib2.URLError as e:
print 'Download error', e.reason
html = None
if num_retries & 0:
if num_retries & 0:
if hasattr(e, 'code') and 500 &= e.code & 600:
return download(url, user_agent, num_retries-1)
return html
这样,对于任何目标网页,我需要执行下面的代码,就可以在输出窗口中打印出没有乱码的目标网页源代码。
html = download('网页的网站')
print html
对了,我在说说这个 #-*- coding:utf-8 -*- 这段注释的用处:
如果你的.py 文件中有中文注释,会在非英文的注释,你就必须在Python脚本 的最前面加上这句注释。否则程序运行时会报错:
SyntaxError: Non-ASCII character '\xe9' in file filename.py on line 6, but
see http://python.org/dev/peps/pep-0263/ for details
这样,我们在的download() 函数就完美了。
这个 download() 现在是一个灵活的下载程序,该函数能够捕获异常,并且可以自动尝试重新下载,并且我们设置了自定义的用户代理(user_agent),并且还解决了中文或其他非英文语言的乱码问题。
下一节,我介绍 下载一个站点里所有网页的方法1 — 使用网站地图 来下载一个站点里所有包含的网页源代码。
没有更多推荐了,

我要回帖

更多关于 python3爬虫页面乱码 的文章

 

随机推荐