鱼C论坛

 找回密码
 立即注册
查看: 1727|回复: 3

关于Python爬虫的新手问题:找不到post

[复制链接]
发表于 2019-9-30 10:14:03 | 显示全部楼层
fiddler抓包分析
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-30 19:58:41 | 显示全部楼层
已经解决:
在审查元素栏勾选preserve log就能看到
亲测 有道词典可用
2019.9.30
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-30 20:14:50 | 显示全部楼层
另外,现在有道添加了反爬虫机制。引自CSDN - 偶尔清醒 的博客:https://blog.csdn.net/shihongji/article/details/81261348
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shihongji/article/details/81261348
————————————————
版权声明:本文为CSDN博主「偶尔清醒」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shihongji/article/details/81261348

今天在做有道翻译爬虫练习,发现服务器一直返回 {"errorCode":50} 这个错误,后来发现原来有道添加了反爬机制的验证 salt 和 sign。

经过查看页面源码中发现一个 fanyi.min.js 文件,如图:



 

打开这个 js 文件, 复制JS中内容用http://tool.oschina.net/codeformat/js 格式化后 ,在内容中搜索 salt 会搜出 3 处结果:

 

结果一:



结果二:



 

结果三:



 

这个三个结果到底是看哪一个呢? 通过使用 fiddler 抓取的包发现,version: 2.1,所以直接看搜索结果三中的代码:



 

然后分析搜索结果中的代码:



 

 

 



 

OK,找到这些后,我们照着代码样子,用python的方式,生成一个时间戳 和 sign 即可。

全部代码如下:

# -*- coding:utf-8 -*-
'''
使用 POST 方式抓取 有道翻译
    urllib2.Request(requestURL, data=data, headers=headerData)
    Request 方法中的 data 参数不为空,则默认是 POST 请求方式
    如果 data 为空则是 Get 请求方式
    {"errorCode":50}错误:
         有道翻译做了一个反爬虫机制,就是在参数中添加了 salt 和 sign 验证,具体操作说明参考:
         http://www.tendcode.com/article/youdao-spider/
'''

import urllib, urllib2
import time
import random
import hashlib
import sys

# 字符串转 utf-8 需要重新设置系统的编码格式
reload(sys)
sys.setdefaultencoding('utf8')

# 目标语言
targetLanguage = 'Auto'
# 源语言
sourceLanguage = 'Auto'

headerData = {
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-2022895048@10.168.8.76;',
    'Referer': 'fanyi.youdao.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}

# 语言类型缩写
languageTypeSacronym = {
    '1': 'zh-CHS 》 en',
    '2': 'zh-CHS 》 ru',
    '3': 'en 》 zh-CHS',
    '4': 'ru 》 zh-CHS',
}

# 翻译类型
translateTypes = [
    '中文 》 英语',
    '中文 》 俄语',
    '英语 》 中文',
    '俄语 》 中文'
]

def startRequest(tanslateWd):

    requestURL = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    client = 'fanyideskweb'
    timeStamp = getTime()
    key = 'ebSeFb%=XZ%T[KZ)c(sy!'

    sign =  getSign(client, tanslateWd, timeStamp, key)

    data = {
        'i': tanslateWd,
        'from':sourceLanguage,
        'to':targetLanguage,
        'client':client,
        'doctype':'json',
        'version':'2.1',
        'salt':timeStamp,
        'sign':sign,
        'keyfrom':'fanyi.web',
        'action':'FY_BY_REALTIME',
        'typoResult':'true',
        'smartresult':'dict'
    }

    data = urllib.urlencode(data)

    request = urllib2.Request(requestURL, data=data, headers=headerData)

    resonse = urllib2.urlopen(request)

    print(resonse.read())


# 生成时间戳
def getTime():
    return str(int(time.time() * 1000) + random.randint(0, 10))


# 生成 Sign
def getSign(client, tanslateWd, time, key):
    s = client + tanslateWd + time + key
    m = hashlib.md5()
    m.update(s.encode('utf-8'))
    return m.hexdigest()


def getTranslateType(translateType):

    global sourceLanguage, targetLanguage
    try:
        if translateType:
            l = languageTypeSacronym[translateType].split(' 》 ')
            sourceLanguage = l[0]
            targetLanguage = l[1]
    except:
        print('翻译类型选择有误,程序将使用 Auto 模式为您翻译')



if __name__ == '__main__':
    print('翻译类型:')
    for i, data in enumerate(translateTypes):
       print('%d: %s' %(i + 1, data))

    translateType = raw_input('请选择翻译类型:')
    getTranslateType(translateType)
    tanslateWd = raw_input('请输入要翻译的消息:')
    startRequest(tanslateWd)
————————————————
版权声明:本文为CSDN博主「偶尔清醒」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shihongji/article/details/81261348
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 18:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表