zoukankan      html  css  js  c++  java
  • 【python54--爬虫2】

    1、有道翻译

    '''
    |-- 代码思路解析:
    |-- 1、拿到网址首先查看network内Headers的:Request URL;User-Agent;From Data,这几个就是代码所需要的url地址和接口所需要传入的参数
    |-- 2、编写代码:url,参数data放到一个字典内:data={},把From Data内的数据都拷贝到代码中并变成参数数组格式:data['smartresult']= 'dict'
    |-- 3、由于有道有反爬虫的机制,所以需要做进一步的处理:
    |--     1)、未反爬虫处理前,报:{"errorcode":50}
    |--     2)、打开network,发送两次请求,查看From Data,发现只有三个地方数据有变化:i,salt,sign(i:需要进行翻译的字符串如:尘封最帅;salt:加密
    |--         用到的盐,这个是破解反爬虫的关键点;sign:签名字符串,也是破解反爬虫的关键点)
    |--     3)、查看网页源代码,查找所有js文件,我们找到fanyi.js,然后点击这个文件,跳转到源文件中,全部复制此代码到http://tool.chinaz.com/Tools/jsformat.aspx中,点击格式化
    |--         然后把格式化的代码复制出来,黏贴到subline内,然后搜索salt,找到相关代码:function(e, t) {
        var n = e("./jquery-1.7");
        e("./utils");
        e("./md5");
        var r = function(e) {
            var t = n.md5(navigator.appVersion),
            r = "" + (new Date).getTime(),
            i = r + parseInt(10 * Math.random(), 10);
            return {
                ts: r,
                bv: t,
                salt: i,
                sign: n.md5("fanyideskweb" + e + i + "p09@Bn{h02_BIEe]$P^nG")
            }
        };
    |--     4)、分析这段代码发现:sign由四个字符串拼接而成:fanyideskweb e i p09@Bn{h02_BIEe]$P^nG;
                e :代表需要翻译的字符串
                r :代表获取系统的时间戳
                i :代表r的时间戳加上0-10的随机字符串
    |--     5)、通过以上4步,就知道了salt和sign的生成原理,这样就可以写python打代码来对接他的接口了
    |-- 4、对数据进行编码处理
    |-- 5、创建一个request对象,把url和data传进去,并且使用POST请求
    |-- 6、打开这个请求
    |-- 7、读取返回来的数据
    |-- 8、把返回的json字符串解析成字典
    |-- 9、不采用['translateResult'][0][0]['tgt']这种格式来翻译结果:{'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 0, 'translateResult': [[{'src': '尘封最帅', 'tgt': 'Dusty the most handsome'}]]}
            [0] :代表去掉[[{'src': '尘封最帅', 'tgt': 'Dusty the most handsome'}]]}中第一个[]和第二个[0]
            ['tgt'] :代表直接打印输出:tgt的结果
    |-- 10、采用['translateResult'][0][0]['tgt']这种格式翻译的结果:翻译的结果:Dusty the most handsome
    
    '''
    
    
    
    import urllib.request
    import urllib.parse
    import json
    import random
    import time
    import hashlib
    
    #用户输入翻译的内容
    content = input('请输入需要翻译的内容:')
    #连接url地址
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
    #发送给服务器请求的数据
    data = {}
    
    #破解反爬虫的参数
    u = 'fanyideskweb'
    c = 'p09@Bn{h02_BIEe]$P^nG'
    e =content
    i =str(int(time.time()*1000)+random.randint(1,10))
    sign = hashlib.md5((u+e+i+c).encode('utf-8')).hexdigest()
    
    #此部分数据来源于:FromData
    data['i']= content
    data['from']= 'AUTO'
    data['to']= 'AUTO'
    data['smartresult']= 'dict'
    data['client']= 'fanyideskweb'
    data['salt']= '15439012305959'
    data['sign']= 'ba81b8cb1c6dc64c253bf6d250cbc09b'
    data['ts']= '1543901230595'
    data['bv']= '6d37ec4625573a83fa9ca0cb1e144ce5'
    data['doctype']= 'json'
    data['version']= '2.1'
    data['keyfrom']= 'fanyi.web'
    data['action']= 'FY_BY_CLICKBUTTION'
    data['typoResult']= 'false'
    
    #对数据进行编码处理
    data = urllib.parse.urlencode(data).encode('utf-8')
    #创建一个request对象,把url和data传进去,并且使用POS请求
    request = urllib.request.Request(url = url,data=data,method='POST')
    #打开请求
    reponsend =urllib.request.urlopen(request)
    #读取返回来的数据
    html = reponsend.read().decode('utf-8')
    #把返回来的json字符串解析成字典
    line = json.loads(html)
    #print(line)
    #获取翻译结果
    print('翻译的结果:%s'%(line['translateResult'][0][0]['tgt']))
    
    
    参考文档:https://blog.csdn.net/ISxiancai/article/details/79349184
          https://blog.csdn.net/nunchakushuang/article/details/75294947

    2、urlopen()方法的timeout参数用于设置什么?

    timeout参数用于设置连接的超时时间,单位是秒

    3、如何从urlopen()返回的对象中获取http的状态码

    reponse = urllib.request.urlopen(url)
    code = reponse.getcode()

    4、客户端合服务端之间的请求-响应,最常用的两种方式

    get和post

    5、User-Agent属性通常是记录什么信息、

    普通浏览器通过该内容像访问网站提供你所使用的浏览器类型,操作系统,浏览器内核信息等

    6、使用字符串的什么方法将其他编码转换成Unicode编码?

    decode。   decode的作用是将其他编码的字符串转换成unicode编码, 相反,encode的作用是将unicode编码转换成其他编码的字符串

    7、json是什么

    用字符串把python的数据结构封装起来,便于存储和使用

    #把返回来的json字符串解析成字典
    line = json.loads(html)

    8、配合EasyGui,给下载一只猫的代码增加互动

    *  让用户输入尺寸

    *  如果用户不输入尺寸,那么默认按宽400,高600下载猫

    *  让用户指定位置保存

    import easygui as g
    import urllib.request
    
    def main():
        #用户自己选择下载的猫的尺寸
        title = '下载一只猫'
        msg = '填写下载猫的尺寸'
        fieldsnames = ['','']
        fieldsvalues = []
        size = width,height = 400,600
        fieldsvalues = g.multenterbox(msg,title,fieldsnames,size)
    
        #判断输入宽和高为空,非整数时的容错
        while 1:
            if fieldsvalues == None:
                break
            errmsg = ""
    
            try:
                width = int(fieldsvalues[0].strip())
            except:
                errmsg += '宽度必须为整数'
    
            try:
                height = int(fieldsvalues[1].strip())
            except:
                errmsg += '高度必须为整数'
    
            if errmsg == "":
                break
    
            fieldsvalues = g.multenterbox(errmsg,title,fieldsnames,fieldsvalues)
    
        #爬取猫的网站
        url = "http://placekitten.com/g/%d/%d" %(width,height)
        reponse = urllib.request.urlopen(url)
        cat_img = reponse.read()
    
        filepath = g.diropenbox("请选择存放猫的文件夹")
    
        #命名下载的图片文件名称
        if filepath:
            filename = '%s/cat_%d*%d.jpg'%(filepath,width,height)
        else:
            filename = 'cat_%d*%d.jpg'%(width,height)
    
        #写入文件
        with open(filename,'wb') as f:
            f.write(cat_img)
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    SASS教程sass超详细教程
    浅谈angular2+ionic2
    深入理解JSON对象
    浅谈闭包
    响应式开发入门
    CSS之float属性归纳探讨
    新学期加油
    Good moring!
    async await的前世今生
    ASP.NET配置KindEditor文本编辑器-图文实例
  • 原文地址:https://www.cnblogs.com/frankruby/p/10065926.html
Copyright © 2011-2022 走看看