0
![](https://i-blog.csdnimg.cn/blog_migrate/878ab890716a8cdeadb89a9defb0f726.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6acbd2c7009a90591e83549d4d16d1f2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/14be5ee0d8b063f2104b599d3c28c58b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5439752a9b1d47dd52ba20ae5cd762d7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/39ec58b924616a085baf95ef79d18a03.png)
这里需要稍微讲一点东西,也许你会发现,www.cctv.com前面没有出现协议,这是因为协议是http的时候是省略的。上一讲其实我们也演示过,简单扩展一下http和https的区别,
![](https://i-blog.csdnimg.cn/blog_migrate/f4bcd89801d0719f30c5eb5cedd8a1d6.png)
https://www.zhihu.com/question/19577317
![](https://i-blog.csdnimg.cn/blog_migrate/17316ec325f040d5a8449ae829c3c425.png)
![](https://i-blog.csdnimg.cn/blog_migrate/530298e5dbf9df77ce21eb6937c78e86.png)
我们现在最常用的哈希算法(前面是不是讲过这个hash呢?没错,前面字典和集合都是哈希存储方式,主要是保证唯一性,也就是字典里的key值不可以重复,集合的元素不可以重复),现在最常用的是SHA-256函数,这些都是了解。就是为了理解下面做铺垫。我们需要知道的就是你输入https是无法访问协议是http的网站的,但是反过来是可以的,输入http是可以访问https的网站的。b站的协议是https,我们上面还是可以通过http访问到。也好理解是吧,根据上面说的https就是http里加了SSL层嘛。
![](https://i-blog.csdnimg.cn/blog_migrate/b4cc5c157ad6dd2251f335c25495dda3.png)
还有一种更加高级一点的实现方式,用到了一个chardet(编码检测)的模块,这个模块是属于第三方的模块,它不需要你自己编代码去查看编码的方式,直接调用内部函数就可以了。虽然上面的代码也不是很复杂。
![](https://i-blog.csdnimg.cn/blog_migrate/8d8d9384a5301360161bb5a348a95e49.png)
下面说如何下载和安装,为了用pip简单的就可以安装
![](https://i-blog.csdnimg.cn/blog_migrate/e426fc70a7c36989650f94d990b85fc4.png)
我们先来说下环境变量配置,右键我的电脑,选择属性进入,选择高级选项卡
![](https://i-blog.csdnimg.cn/blog_migrate/33b5ab3b70c35d13252ece7a13c29e18.png)
点环境变量,选择PATH。点编辑
![](https://i-blog.csdnimg.cn/blog_migrate/b9c4d0eab7d205614f4b7a87777f4c5b.png)
变量值这里面输入pip.exe的路径。
![](https://i-blog.csdnimg.cn/blog_migrate/827895e0dc85663586a13041710d3fc0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/25fd5c36d75f423bb5bed684d35965b9.png)
点确定。然后我们就可以在命令行里直接用pip了,并且我们可以直接使用安装chardet了。
![](https://i-blog.csdnimg.cn/blog_migrate/599387efec57b10c7b6b93aeaed72c47.png)
上面是pip在命令行里的一些命令, 我们可以直接pip install chardet就可以安装chardet了。
![](https://i-blog.csdnimg.cn/blog_migrate/83c6469151c3f6e5e08738de89af1192.png)
可以看到在python/Lib/site-packages里就有了chardet了
![](https://i-blog.csdnimg.cn/blog_migrate/b2e9eef4e734b5683f7ed0eaa7666ca8.png)
这里附带说一下,也可以配置python,让python在命令行里可以直接用,前面几步都一样,但是这次我们需要编辑的是系统变量,不然的话,会把前面在用户变量的PATH覆盖掉,你就没办法在命令行里直接用pip,这里我不演示了。你看到上面的路径已经改到了前面改过的
![](https://i-blog.csdnimg.cn/blog_migrate/19bb4418d748618f5173b6bfea400987.png)
可以点系统变量里直接在键盘上按P,就可以直接到PATH了。点编辑,把变量值改为D:/python点确定,确定。
![](https://i-blog.csdnimg.cn/blog_migrate/7198e49219d1dae5133ebe29c7d82765.png)
然后在命令行里可以直接写python代码了。
![](https://i-blog.csdnimg.cn/blog_migrate/0c99068b5acecdaa7674b6af7a836055.png)
已经安装好了chardet了,那么如何使用呢?其实很简单,用chardet模块里的detect函数就可以了。
![](https://i-blog.csdnimg.cn/blog_migrate/bc9616fcd547e11ec5dd4b3f97fcd4e0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2c213528326c0aec3ba3f163195179f7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/dede531b57c494c5901f5e3e5b794e3e.png)
chardet.detect()的参数一定要是bytes类型。返回的三个参数是编码方式,语言和置信度,confidence是0.99就是有百分之九十九的几率是utf-8。下面就是代码
![](https://i-blog.csdnimg.cn/blog_migrate/8cf9f42c9c5d16750c71b4bfdd200327.png)
上面写一个判断是不是GBK2312是因为有些老的网站用的还是GBK2312,GBK的低版本。
1
上一讲的题目改为指定文件里的链接,然后将内容保存在对应的txt文件里。
![](https://i-blog.csdnimg.cn/blog_migrate/46eb4e236ba3d2772ab749392da66857.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1a93be7a5d0d69c7691fbe1246c2d819.png)
![](https://i-blog.csdnimg.cn/blog_migrate/eedf34db6d0d6b87a5458d2124a94fda.png)
解决了练习答案以后。
下载猫片
如何下载一个猫片呢?首先你要有一个下载猫片的网站。http://www.placekitten.com。我在我的电脑上打开是这样的。
![](https://i-blog.csdnimg.cn/blog_migrate/274bc0d4132e2043675be5ec5c29efbf.png)
很多图片加载失败,不过这对于我们下面的操作没有任何影响。我们只需要在后面加上/宽/高就可以得到一张指定宽高(其实是像素)的图片了,比如
![](https://i-blog.csdnimg.cn/blog_migrate/37f57622e10da2f782787bf56c6d26b6.png)
你可以下载这个图片,是jpg格式的。
![](https://i-blog.csdnimg.cn/blog_migrate/6d63b2ca0f50cd697d25d73fbc90d2e5.png)
下面我们就来用python实现爬取一个图片。
![](https://i-blog.csdnimg.cn/blog_migrate/f8d037da6ab7595cc93eec0a7e495f89.png)
![](https://i-blog.csdnimg.cn/blog_migrate/154d89663a7723efff4c9077db13cc45.png)
这里说一个小知识点,urlopen()里的参数还可以是一个Response对象,可以通过在IDLE里按F1调出帮助文档输入urlopen
![](https://i-blog.csdnimg.cn/blog_migrate/d5417223a70d0335800fe0e4b5948f23.png)
什么是Request呢?
![](https://i-blog.csdnimg.cn/blog_migrate/28d1838536cb2bdad87eb45858d130de.png)
所以说其实urlopen是两步,先输入一个字符串转化为Request对象,再用urlopen打开,如下
![](https://i-blog.csdnimg.cn/blog_migrate/58853da5e328fcc58fd3e7be6fd9ba18.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8b2ce907fc353e77bda7149278ff1d95.png)
对于一个http.client.HTTPResponse对象,还有其他方法,下面介绍三个
![](https://i-blog.csdnimg.cn/blog_migrate/47b55e1fe30629b3a82d14a26a1b28c8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/13e7720173d19bd0f08eb080cc4c4dc3.png)
getcode得到的其实HTTP状态码,参考了http://bbs.fishc.com/thread-103840-1-1.html
![](https://i-blog.csdnimg.cn/blog_migrate/de7f37939b2a0fa4775b2b67adab4106.png)
200就是ok的意思。geturll得到的是URL字符串。info得到的是网站的一系列信息,server是服务器。下面来进行一些小尝试,相信有的人已经看到上面写入文件的格式是wb,如果不是呢?
![](https://i-blog.csdnimg.cn/blog_migrate/28dc4ac3804eb24821005f9730a14000.png)
其实也很好理解嘛,因为在传输数据的时候用的都是二进制(因为计算机里存储的都是0,1其实是电容的高低电平)。图片格式也不止jpg一种咯,其他的如何?至少png和bmp完全没有问题。
![](https://i-blog.csdnimg.cn/blog_migrate/b334f9dd95d9fca42e0b63ad491c9a22.png)
当然其实你可以直接去改扩展名的。
![](https://i-blog.csdnimg.cn/blog_migrate/838af5bf9eec90e93e6c09b1824fad71.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d3b87d3b8fb67378704a5e5372fcdb04.png)
打造自己的翻译神器
我们就利用谷歌翻译来打造一款自己的翻译器吧,谷歌翻译是没有被墙的。
![](https://i-blog.csdnimg.cn/blog_migrate/02da846665d4c60e23c1f30696b63975.png)
Misaka是谁你们应该知道的。但是谷歌翻译在语言自动检测上还是有一些小问题,
![](https://i-blog.csdnimg.cn/blog_migrate/66e006c49e1322daf720ce2cc9a2096c.png)
所以还是用了有道翻译。下面我们来用审查元素来看一下翻译的过程。如果你想把这个审查元素换个位置,可以按照下面进行操作。
![](https://i-blog.csdnimg.cn/blog_migrate/14f97c31b047bc2561ce4ff9587e702f.png)
翻译的过程呢,我们需要点NetWorks,这里有和服务器通信的具体信息。
![](https://i-blog.csdnimg.cn/blog_migrate/0ab60545c535988a96791d55d87456bb.png)
可以直接点XHR会过滤掉其他的对象,只留下一个我们需要的translate。如果不过滤的是下面这样子的。
![](https://i-blog.csdnimg.cn/blog_migrate/650fcc36389ebbb770500698bda23f49.png)
这个XHR是什么呢?简单看一下,这是HTML的一些知识,我们目前不需要了解太多。
![](https://i-blog.csdnimg.cn/blog_migrate/a79160dcb4fc447cd09ddc1f4fe68670.png)
如果你想了解更多,可以看看https://www.cnblogs.com/syfwhu/p/6116323.html。也许你们的NetWorks里面没有这个Method,没关系,你可以右键Status,然后勾选Method就可以了。
![](https://i-blog.csdnimg.cn/blog_migrate/0f2c154523f9ea4d02974d1adf511e61.png)
这个Method是什么意思呢?就是客户端和服务端之间进行请求响应的方法,有两种。一种是POST,另一种是GET。这也是比较有争议的一个内容,我自身水平也有限,就还请各位看看https://www.zhihu.com/question/28586791。里面大家从几个角度来说了这个事情。我们先来仔细看看NetWork里面的内容
![](https://i-blog.csdnimg.cn/blog_migrate/8f90be95b04b85642e3746f958b2e13e.png)
点一下这个translate....。
![](https://i-blog.csdnimg.cn/blog_migrate/28614aea729c7fc9b0f8c8244b5cfba8.png)
Headers里面会有很多信息。第一个Request URL就是实际实现翻译的那个文件,而不是http://fanyi.youdao.com/,这只是个文件夹而已。Request Method就是上面说的客户端和服务端进行通信的方法。Status Code就是状态码,Remote Address 就是服务端的ip地址,:后面是端口号。下面先来说下什么是Headers
![](https://i-blog.csdnimg.cn/blog_migrate/f411d9c65120e6b9cee3e66bd191b951.png)
更多详细的可以看http://www.jb51.net/web/24368.html。下面继续分析Headers里面的内容。
![](https://i-blog.csdnimg.cn/blog_migrate/d23a11259d9ca242ed828a7404859c2d.png)
Request Headers是什么呢?
![](https://i-blog.csdnimg.cn/blog_migrate/066ce74bd5091a647d14dfe3c3927171.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b6ef8a2dd9628f748511136bdb253486.png)
参考了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是很重要的,它可以显示访问者的信息,通过这个是可以分辨是通过代码访问还是通过浏览器访问的。
![](https://i-blog.csdnimg.cn/blog_migrate/bf1f58af913f70fc5871b369529269ba.png)
Mozila.5,0和火狐有点关系,具体可以参看https://zhidao.baidu.com/question/1767408752449075980.html和https://www.cnblogs.com/sunjingxin/p/5871466.html。Windows NT10.0是什么意思呢?
NT就是New Technology的意思,参考了百度百科
![](https://i-blog.csdnimg.cn/blog_migrate/5ee3da225395400c473479c166e50c73.png)
具体对应关系如下。
![](https://i-blog.csdnimg.cn/blog_migrate/798bfc1b1d5b345031125b0cf23db66f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a511e442c896de724ba75e5ba292662a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5d917bf3af89c080aa501ef8d9a58c43.png)
WOW又是什么意思呢?
![](https://i-blog.csdnimg.cn/blog_migrate/dfa2b450728126f534a4fcd2c69df628.png)
AppleWebkit是一种浏览器内核。
![](https://i-blog.csdnimg.cn/blog_migrate/e3125534373a285384debc21d21dfefa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8fbf3c375041f5377780a499e2adf837.png)
![](https://i-blog.csdnimg.cn/blog_migrate/79489d4e211b15451b2af1a0dc8135d4.png)
现在win10自带的Edge浏览器其实也是这个内核。你可以用Edge,好处就是会有中文的翻译,不过只是因为我个人习惯用谷歌而已。
![](https://i-blog.csdnimg.cn/blog_migrate/f3889e10a877736a13349d719b765216.png)
![](https://i-blog.csdnimg.cn/blog_migrate/33d80269f71058a2d780c11cad33d716.png)
看到下面的From Data里面的i就是我们要翻译的内容,from:和to:后面的AUTO是自动检测语言模式,这种模式下一般我们输入不是中文的会翻译为中文,如果输入中文,自动翻译的是英文,你还可以自己设置要把什么语言翻译为什么语言,都是可以的。
![](https://i-blog.csdnimg.cn/blog_migrate/6d7a7c68ca012314e2b682231388edbf.png)
samrtresults是一些智能的结果,指的是这些
![](https://i-blog.csdnimg.cn/blog_migrate/22001368faf7249dcfd42d9c22e576ee.png)
dict的意思就是它们是以字典类型存储的。再看doctype是以json的类型存储的,我们知道这么多就够了,下面还会说一说这个json类型。我们可以通过preview先来看看什么是json类型。
![](https://i-blog.csdnimg.cn/blog_migrate/0f3c8a8e8aecaea7fb952a2c8d6fb76e.png)
第一个是个字典,里面的key值translateresult对应的值就是翻译的结果,可以看到翻译的结果是列表套列表套字典,这种就是json类型(外面的两层列表看起来没什么用处
![](https://i-blog.csdnimg.cn/blog_migrate/2300e2ac2c6c8b0ced5ee061d4398c84.png)
),tgt就是target的缩写,就是翻译的结果,src就是source的缩写,就是需要翻译的原文本。type对应的'zh-CHS2en‘是什么意思呢?zh-CHS应该指的就是中文,2其实是to,如果你用过MATALAB,这很好理解,这里用了谐音,书写方便,有点像网络语言,cu代表see you这种感觉,en就是english,合起来就是汉译英。下面这样就是英译汉。上面to:还出现了ja,就是japanese日语。
![](https://i-blog.csdnimg.cn/blog_migrate/c98cc0e6ba0d96a5ada87f2c9855df71.png)
看到喜爱按的smartresult是一个列表类型。你还可以直接点Response直接看服务端的响应。
![](https://i-blog.csdnimg.cn/blog_migrate/7bf9b9dbe81b767947ceabefb30a5d76.png)
Cookies和Timing不在这讲里说它们。知道了上面这些基本可以开始写python代码了。但是不够,你想你怎么给服务器发送要翻译的文本呢?这时候就要用urlopen的一个参数data,前面也说过urlopen可以说相当于先Request一下,这里的data的要求是一样的。
![](https://i-blog.csdnimg.cn/blog_migrate/a995b891c437b7afb3c22bee3d640804.png)
看到最后一段说如果是POST方法的话,数据需要满足一个application/x-form-urlencoded的格式,可以用urllib.parse.urlencoded()函数来转换。还有一个小知识
![](https://i-blog.csdnimg.cn/blog_migrate/e3ff0e8dd8b2e4e6b3b0359de76919dc.png)
timeout是什么意思呢?
![](https://i-blog.csdnimg.cn/blog_migrate/c1e24b053c59f7c357f9d53526198219.png)
参考https://blog.csdn.net/waterforest_pang/article/details/16885259
![](https://i-blog.csdnimg.cn/blog_migrate/464bf82b5dece8325eae358e1619a7b4.png)
下面就正式开始写
![](https://i-blog.csdnimg.cn/blog_migrate/e281acd0eda63cda423518cd21ce0432.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cc15fdf13753929073872c748363e947.png)
为什么会出现errorCode:50呢?我感觉这是一种人工反爬虫的机制。把那个Request URL里的一个_o去掉就可以了,
![](https://i-blog.csdnimg.cn/blog_migrate/f8cadd3c1a4807e1f97f07be0a8b56c9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2a7a6567aaa770b82dab380e36a5bbb0.png)
其实加上_o的在浏览器里也是会显示errorCode的
![](https://i-blog.csdnimg.cn/blog_migrate/bbf8d36741c1db3cc27f7a46cf42f61f.png)
去掉_o就可以转到正常的界面了。这可能就是人为的反爬虫,只凭前面的user agent还不足以区分爬虫,我们是可以通过代码改欺骗服务端的,这个以后会讲。另外其实有些东西可以去掉的,比如salt和sign
![](https://i-blog.csdnimg.cn/blog_migrate/15850f263539fe8c5667b891570832ab.png)
我在上面还修改了from和to里面的语言,但是并没有用,不知道是为什么。所以说目前也就只能汉译英或者英译汉。如果删除的东西过多返回的是有道翻译这个网站的elements的内容而不是翻译
![](https://i-blog.csdnimg.cn/blog_migrate/083dbf5d35c8720e4ecd9fb8ad6a6748.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9156a3707ad2317aac6d2d9069296362.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2ba575374bf0f1369840f7a4c75afe4c.png)
经过几次实验我最终得出了必须有的有以下几个,其实从上面修改语种失败可以得出from和to是可以不要的。
![](https://i-blog.csdnimg.cn/blog_migrate/7770129f9c24d7b87ee5c6778e621127.png)
但是这个结果我们还不是很满意。因为这样的结果不是给一般的用户看的。需要进行一下修改。直接给出最后的结果。直接下面这样是不行的,因为html其实是一个字符串。
![](https://i-blog.csdnimg.cn/blog_migrate/14e99bec50ff6ad806b99f0188cdfda7.png)
必须要先转换为字典,这时候就需要用json。
![](https://i-blog.csdnimg.cn/blog_migrate/c9092cd77c87be1c0d648919a4088a74.png)
下面稍微来看一下json.loads,后面或者s的意思是string的意思。
![](https://i-blog.csdnimg.cn/blog_migrate/6ce0b84bc561bfbb0da6875bc244987c.png)
大概说的意思就是可以去掉''号。
![](https://i-blog.csdnimg.cn/blog_migrate/f7694165e28fc1de1d34dfb72b79e7ce.png)
其实你们回想一下以前学过的一个eval,也是可以实现的。
![](https://i-blog.csdnimg.cn/blog_migrate/dc101454d6d30cf0f11073353f9db59e.png)
所以我们代码还可以这样写。
![](https://i-blog.csdnimg.cn/blog_migrate/1afa740d6e0cfca072283a00646e6202.png)
这讲就到这里了。
练习
0
![](https://i-blog.csdnimg.cn/blog_migrate/cc606c403b75600e85670b1c332e2c35.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e44dfab15a22861036d23a25617f3d00.png)
1
![](https://i-blog.csdnimg.cn/blog_migrate/05cb0f7b3a5fe8ed84434c4ece1a96e1.png)
答案还是会在下一讲公布。请继续关注。