0
这里需要稍微讲一点东西,也许你会发现,www.cctv.com前面没有出现协议,这是因为协议是http的时候是省略的。上一讲其实我们也演示过,简单扩展一下http和https的区别,
https://www.zhihu.com/question/19577317
我们现在最常用的哈希算法(前面是不是讲过这个hash呢?没错,前面字典和集合都是哈希存储方式,主要是保证唯一性,也就是字典里的key值不可以重复,集合的元素不可以重复),现在最常用的是SHA-256函数,这些都是了解。就是为了理解下面做铺垫。我们需要知道的就是你输入https是无法访问协议是http的网站的,但是反过来是可以的,输入http是可以访问https的网站的。b站的协议是https,我们上面还是可以通过http访问到。也好理解是吧,根据上面说的https就是http里加了SSL层嘛。
还有一种更加高级一点的实现方式,用到了一个chardet(编码检测)的模块,这个模块是属于第三方的模块,它不需要你自己编代码去查看编码的方式,直接调用内部函数就可以了。虽然上面的代码也不是很复杂。
下面说如何下载和安装,为了用pip简单的就可以安装
我们先来说下环境变量配置,右键我的电脑,选择属性进入,选择高级选项卡
点环境变量,选择PATH。点编辑
变量值这里面输入pip.exe的路径。
点确定。然后我们就可以在命令行里直接用pip了,并且我们可以直接使用安装chardet了。
上面是pip在命令行里的一些命令, 我们可以直接pip install chardet就可以安装chardet了。
可以看到在python/Lib/site-packages里就有了chardet了
这里附带说一下,也可以配置python,让python在命令行里可以直接用,前面几步都一样,但是这次我们需要编辑的是系统变量,不然的话,会把前面在用户变量的PATH覆盖掉,你就没办法在命令行里直接用pip,这里我不演示了。你看到上面的路径已经改到了前面改过的
可以点系统变量里直接在键盘上按P,就可以直接到PATH了。点编辑,把变量值改为D:/python点确定,确定。
然后在命令行里可以直接写python代码了。
已经安装好了chardet了,那么如何使用呢?其实很简单,用chardet模块里的detect函数就可以了。
chardet.detect()的参数一定要是bytes类型。返回的三个参数是编码方式,语言和置信度,confidence是0.99就是有百分之九十九的几率是utf-8。下面就是代码
上面写一个判断是不是GBK2312是因为有些老的网站用的还是GBK2312,GBK的低版本。
1
上一讲的题目改为指定文件里的链接,然后将内容保存在对应的txt文件里。
解决了练习答案以后。
下载猫片
如何下载一个猫片呢?首先你要有一个下载猫片的网站。http://www.placekitten.com。我在我的电脑上打开是这样的。
很多图片加载失败,不过这对于我们下面的操作没有任何影响。我们只需要在后面加上/宽/高就可以得到一张指定宽高(其实是像素)的图片了,比如
你可以下载这个图片,是jpg格式的。
下面我们就来用python实现爬取一个图片。
这里说一个小知识点,urlopen()里的参数还可以是一个Response对象,可以通过在IDLE里按F1调出帮助文档输入urlopen
什么是Request呢?
所以说其实urlopen是两步,先输入一个字符串转化为Request对象,再用urlopen打开,如下
对于一个http.client.HTTPResponse对象,还有其他方法,下面介绍三个
getcode得到的其实HTTP状态码,参考了http://bbs.fishc.com/thread-103840-1-1.html
200就是ok的意思。geturll得到的是URL字符串。info得到的是网站的一系列信息,server是服务器。下面来进行一些小尝试,相信有的人已经看到上面写入文件的格式是wb,如果不是呢?
其实也很好理解嘛,因为在传输数据的时候用的都是二进制(因为计算机里存储的都是0,1其实是电容的高低电平)。图片格式也不止jpg一种咯,其他的如何?至少png和bmp完全没有问题。
当然其实你可以直接去改扩展名的。
打造自己的翻译神器
我们就利用谷歌翻译来打造一款自己的翻译器吧,谷歌翻译是没有被墙的。
Misaka是谁你们应该知道的。但是谷歌翻译在语言自动检测上还是有一些小问题,
所以还是用了有道翻译。下面我们来用审查元素来看一下翻译的过程。如果你想把这个审查元素换个位置,可以按照下面进行操作。
翻译的过程呢,我们需要点NetWorks,这里有和服务器通信的具体信息。
可以直接点XHR会过滤掉其他的对象,只留下一个我们需要的translate。如果不过滤的是下面这样子的。
这个XHR是什么呢?简单看一下,这是HTML的一些知识,我们目前不需要了解太多。
如果你想了解更多,可以看看https://www.cnblogs.com/syfwhu/p/6116323.html。也许你们的NetWorks里面没有这个Method,没关系,你可以右键Status,然后勾选Method就可以了。
这个Method是什么意思呢?就是客户端和服务端之间进行请求响应的方法,有两种。一种是POST,另一种是GET。这也是比较有争议的一个内容,我自身水平也有限,就还请各位看看https://www.zhihu.com/question/28586791。里面大家从几个角度来说了这个事情。我们先来仔细看看NetWork里面的内容
点一下这个translate....。
Headers里面会有很多信息。第一个Request URL就是实际实现翻译的那个文件,而不是http://fanyi.youdao.com/,这只是个文件夹而已。Request Method就是上面说的客户端和服务端进行通信的方法。Status Code就是状态码,Remote Address 就是服务端的ip地址,:后面是端口号。下面先来说下什么是Headers
更多详细的可以看http://www.jb51.net/web/24368.html。下面继续分析Headers里面的内容。
Request Headers是什么呢?
参考了https://www.cnblogs.com/good7758/articles/5635981.html还有https://www.cnblogs.com/wxinyu/p/8005621.html。看的时候注意下Request和Response上面两张图的顺序是反的,Request是客户端向服务端发送的请求,Response是服务端给客户端的响应。其中说明两点不久就会用到的,一个是Response Headers里面的content type里面有一个json,这是一种数据格式。还有一点user-agent是很重要的,它可以显示访问者的信息,通过这个是可以分辨是通过代码访问还是通过浏览器访问的。
Mozila.5,0和火狐有点关系,具体可以参看https://zhidao.baidu.com/question/1767408752449075980.html和https://www.cnblogs.com/sunjingxin/p/5871466.html。Windows NT10.0是什么意思呢?
NT就是New Technology的意思,参考了百度百科
具体对应关系如下。
WOW又是什么意思呢?
AppleWebkit是一种浏览器内核。
现在win10自带的Edge浏览器其实也是这个内核。你可以用Edge,好处就是会有中文的翻译,不过只是因为我个人习惯用谷歌而已。
看到下面的From Data里面的i就是我们要翻译的内容,from:和to:后面的AUTO是自动检测语言模式,这种模式下一般我们输入不是中文的会翻译为中文,如果输入中文,自动翻译的是英文,你还可以自己设置要把什么语言翻译为什么语言,都是可以的。
samrtresults是一些智能的结果,指的是这些
dict的意思就是它们是以字典类型存储的。再看doctype是以json的类型存储的,我们知道这么多就够了,下面还会说一说这个json类型。我们可以通过preview先来看看什么是json类型。
第一个是个字典,里面的key值translateresult对应的值就是翻译的结果,可以看到翻译的结果是列表套列表套字典,这种就是json类型(外面的两层列表看起来没什么用处
),tgt就是target的缩写,就是翻译的结果,src就是source的缩写,就是需要翻译的原文本。type对应的'zh-CHS2en‘是什么意思呢?zh-CHS应该指的就是中文,2其实是to,如果你用过MATALAB,这很好理解,这里用了谐音,书写方便,有点像网络语言,cu代表see you这种感觉,en就是english,合起来就是汉译英。下面这样就是英译汉。上面to:还出现了ja,就是japanese日语。
看到喜爱按的smartresult是一个列表类型。你还可以直接点Response直接看服务端的响应。
Cookies和Timing不在这讲里说它们。知道了上面这些基本可以开始写python代码了。但是不够,你想你怎么给服务器发送要翻译的文本呢?这时候就要用urlopen的一个参数data,前面也说过urlopen可以说相当于先Request一下,这里的data的要求是一样的。
看到最后一段说如果是POST方法的话,数据需要满足一个application/x-form-urlencoded的格式,可以用urllib.parse.urlencoded()函数来转换。还有一个小知识
timeout是什么意思呢?
参考https://blog.csdn.net/waterforest_pang/article/details/16885259
下面就正式开始写
为什么会出现errorCode:50呢?我感觉这是一种人工反爬虫的机制。把那个Request URL里的一个_o去掉就可以了,
其实加上_o的在浏览器里也是会显示errorCode的
去掉_o就可以转到正常的界面了。这可能就是人为的反爬虫,只凭前面的user agent还不足以区分爬虫,我们是可以通过代码改欺骗服务端的,这个以后会讲。另外其实有些东西可以去掉的,比如salt和sign
我在上面还修改了from和to里面的语言,但是并没有用,不知道是为什么。所以说目前也就只能汉译英或者英译汉。如果删除的东西过多返回的是有道翻译这个网站的elements的内容而不是翻译
经过几次实验我最终得出了必须有的有以下几个,其实从上面修改语种失败可以得出from和to是可以不要的。
但是这个结果我们还不是很满意。因为这样的结果不是给一般的用户看的。需要进行一下修改。直接给出最后的结果。直接下面这样是不行的,因为html其实是一个字符串。
必须要先转换为字典,这时候就需要用json。
下面稍微来看一下json.loads,后面或者s的意思是string的意思。
大概说的意思就是可以去掉''号。
其实你们回想一下以前学过的一个eval,也是可以实现的。
所以我们代码还可以这样写。
这讲就到这里了。
练习
0
1
答案还是会在下一讲公布。请继续关注。