手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

时间:2024-03-28 13:27:30

0

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


这里需要稍微讲一点东西,也许你会发现,www.cctv.com前面没有出现协议,这是因为协议是http的时候是省略的。上一讲其实我们也演示过,简单扩展一下http和https的区别,

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

https://www.zhihu.com/question/19577317

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

我们现在最常用的哈希算法(前面是不是讲过这个hash呢?没错,前面字典和集合都是哈希存储方式,主要是保证唯一性,也就是字典里的key值不可以重复,集合的元素不可以重复),现在最常用的是SHA-256函数,这些都是了解。就是为了理解下面做铺垫。我们需要知道的就是你输入https是无法访问协议是http的网站的,但是反过来是可以的,输入http是可以访问https的网站的。b站的协议是https,我们上面还是可以通过http访问到。也好理解是吧,根据上面说的https就是http里加了SSL层嘛。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

还有一种更加高级一点的实现方式,用到了一个chardet(编码检测)的模块,这个模块是属于第三方的模块,它不需要你自己编代码去查看编码的方式,直接调用内部函数就可以了。虽然上面的代码也不是很复杂。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

下面说如何下载和安装,为了用pip简单的就可以安装

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

我们先来说下环境变量配置,右键我的电脑,选择属性进入,选择高级选项卡

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

点环境变量,选择PATH。点编辑

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

变量值这里面输入pip.exe的路径。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

点确定。然后我们就可以在命令行里直接用pip了,并且我们可以直接使用安装chardet了。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

上面是pip在命令行里的一些命令, 我们可以直接pip install chardet就可以安装chardet了。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

可以看到在python/Lib/site-packages里就有了chardet了

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

这里附带说一下,也可以配置python,让python在命令行里可以直接用,前面几步都一样,但是这次我们需要编辑的是系统变量,不然的话,会把前面在用户变量的PATH覆盖掉,你就没办法在命令行里直接用pip,这里我不演示了。你看到上面的路径已经改到了前面改过的

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


可以点系统变量里直接在键盘上按P,就可以直接到PATH了。点编辑,把变量值改为D:/python点确定,确定。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

然后在命令行里可以直接写python代码了。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

已经安装好了chardet了,那么如何使用呢?其实很简单,用chardet模块里的detect函数就可以了。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

chardet.detect()的参数一定要是bytes类型。返回的三个参数是编码方式,语言和置信度,confidence是0.99就是有百分之九十九的几率是utf-8。下面就是代码

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

上面写一个判断是不是GBK2312是因为有些老的网站用的还是GBK2312,GBK的低版本。

1

上一讲的题目改为指定文件里的链接,然后将内容保存在对应的txt文件里。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

解决了练习答案以后。

下载猫片

如何下载一个猫片呢?首先你要有一个下载猫片的网站。http://www.placekitten.com。我在我的电脑上打开是这样的。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

很多图片加载失败,不过这对于我们下面的操作没有任何影响。我们只需要在后面加上/宽/高就可以得到一张指定宽高(其实是像素)的图片了,比如

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

你可以下载这个图片,是jpg格式的。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

下面我们就来用python实现爬取一个图片。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

这里说一个小知识点,urlopen()里的参数还可以是一个Response对象,可以通过在IDLE里按F1调出帮助文档输入urlopen

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

什么是Request呢?

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

所以说其实urlopen是两步,先输入一个字符串转化为Request对象,再用urlopen打开,如下

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

对于一个http.client.HTTPResponse对象,还有其他方法,下面介绍三个

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

getcode得到的其实HTTP状态码,参考了http://bbs.fishc.com/thread-103840-1-1.html

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

200就是ok的意思。geturll得到的是URL字符串。info得到的是网站的一系列信息,server是服务器。下面来进行一些小尝试,相信有的人已经看到上面写入文件的格式是wb,如果不是呢?

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

其实也很好理解嘛,因为在传输数据的时候用的都是二进制(因为计算机里存储的都是0,1其实是电容的高低电平)。图片格式也不止jpg一种咯,其他的如何?至少png和bmp完全没有问题。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

当然其实你可以直接去改扩展名的。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

打造自己的翻译神器

我们就利用谷歌翻译来打造一款自己的翻译器吧,谷歌翻译是没有被墙的。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

Misaka是谁你们应该知道的。但是谷歌翻译在语言自动检测上还是有一些小问题,

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

所以还是用了有道翻译。下面我们来用审查元素来看一下翻译的过程。如果你想把这个审查元素换个位置,可以按照下面进行操作。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

翻译的过程呢,我们需要点NetWorks,这里有和服务器通信的具体信息。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

可以直接点XHR会过滤掉其他的对象,只留下一个我们需要的translate。如果不过滤的是下面这样子的。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

这个XHR是什么呢?简单看一下,这是HTML的一些知识,我们目前不需要了解太多。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

如果你想了解更多,可以看看https://www.cnblogs.com/syfwhu/p/6116323.html。也许你们的NetWorks里面没有这个Method,没关系,你可以右键Status,然后勾选Method就可以了。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

这个Method是什么意思呢?就是客户端和服务端之间进行请求响应的方法,有两种。一种是POST,另一种是GET。这也是比较有争议的一个内容,我自身水平也有限,就还请各位看看https://www.zhihu.com/question/28586791。里面大家从几个角度来说了这个事情。我们先来仔细看看NetWork里面的内容

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

点一下这个translate....。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

Headers里面会有很多信息。第一个Request URL就是实际实现翻译的那个文件,而不是http://fanyi.youdao.com/,这只是个文件夹而已。Request Method就是上面说的客户端和服务端进行通信的方法。Status Code就是状态码,Remote Address 就是服务端的ip地址,:后面是端口号。下面先来说下什么是Headers

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

更多详细的可以看http://www.jb51.net/web/24368.html。下面继续分析Headers里面的内容。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

Request Headers是什么呢?

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

参考了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是很重要的,它可以显示访问者的信息,通过这个是可以分辨是通过代码访问还是通过浏览器访问的。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

Mozila.5,0和火狐有点关系,具体可以参看https://zhidao.baidu.com/question/1767408752449075980.html和https://www.cnblogs.com/sunjingxin/p/5871466.html。Windows NT10.0是什么意思呢?

NT就是New Technology的意思,参考了百度百科

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

具体对应关系如下。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

WOW又是什么意思呢?

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

AppleWebkit是一种浏览器内核。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

现在win10自带的Edge浏览器其实也是这个内核。你可以用Edge,好处就是会有中文的翻译,不过只是因为我个人习惯用谷歌而已。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

看到下面的From Data里面的i就是我们要翻译的内容,from:和to:后面的AUTO是自动检测语言模式,这种模式下一般我们输入不是中文的会翻译为中文,如果输入中文,自动翻译的是英文,你还可以自己设置要把什么语言翻译为什么语言,都是可以的。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

samrtresults是一些智能的结果,指的是这些

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

dict的意思就是它们是以字典类型存储的。再看doctype是以json的类型存储的,我们知道这么多就够了,下面还会说一说这个json类型。我们可以通过preview先来看看什么是json类型。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

第一个是个字典,里面的key值translateresult对应的值就是翻译的结果,可以看到翻译的结果是列表套列表套字典,这种就是json类型(外面的两层列表看起来没什么用处

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

),tgt就是target的缩写,就是翻译的结果,src就是source的缩写,就是需要翻译的原文本。type对应的'zh-CHS2en‘是什么意思呢?zh-CHS应该指的就是中文,2其实是to,如果你用过MATALAB,这很好理解,这里用了谐音,书写方便,有点像网络语言,cu代表see you这种感觉,en就是english,合起来就是汉译英。下面这样就是英译汉。上面to:还出现了ja,就是japanese日语。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

看到喜爱按的smartresult是一个列表类型。你还可以直接点Response直接看服务端的响应。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

Cookies和Timing不在这讲里说它们。知道了上面这些基本可以开始写python代码了。但是不够,你想你怎么给服务器发送要翻译的文本呢?这时候就要用urlopen的一个参数data,前面也说过urlopen可以说相当于先Request一下,这里的data的要求是一样的。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

看到最后一段说如果是POST方法的话,数据需要满足一个application/x-form-urlencoded的格式,可以用urllib.parse.urlencoded()函数来转换。还有一个小知识

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

timeout是什么意思呢?

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

参考https://blog.csdn.net/waterforest_pang/article/details/16885259

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

下面就正式开始写

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

为什么会出现errorCode:50呢?我感觉这是一种人工反爬虫的机制。把那个Request URL里的一个_o去掉就可以了,

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

其实加上_o的在浏览器里也是会显示errorCode的

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

去掉_o就可以转到正常的界面了。这可能就是人为的反爬虫,只凭前面的user agent还不足以区分爬虫,我们是可以通过代码改欺骗服务端的,这个以后会讲。另外其实有些东西可以去掉的,比如salt和sign

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

我在上面还修改了from和to里面的语言,但是并没有用,不知道是为什么。所以说目前也就只能汉译英或者英译汉。如果删除的东西过多返回的是有道翻译这个网站的elements的内容而不是翻译

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

经过几次实验我最终得出了必须有的有以下几个,其实从上面修改语种失败可以得出from和to是可以不要的。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

但是这个结果我们还不是很满意。因为这样的结果不是给一般的用户看的。需要进行一下修改。直接给出最后的结果。直接下面这样是不行的,因为html其实是一个字符串。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

必须要先转换为字典,这时候就需要用json。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

下面稍微来看一下json.loads,后面或者s的意思是string的意思。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

大概说的意思就是可以去掉''号。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

其实你们回想一下以前学过的一个eval,也是可以实现的。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

所以我们代码还可以这样写。

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

这讲就到这里了。

练习

0

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)


手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

1

手把手教你学python第十九讲(爬虫实战之下载猫片和打造自己的翻译神器)

答案还是会在下一讲公布。请继续关注。