爬取有道翻译

踩点

进入网站:http://fanyi.youdao.com/

在这里插入图片描述

老样子,一看就是ajax加载,按F12检查元素,点击network选项,筛选xhr文件

在这里插入图片描述

输入一个翻译文字,得到一个包,点击看一看,是一个post请求,向下滑,看看参数

在这里插入图片描述

往下看看请求数据,发现确实是我们要翻译的文字,那么将这个url保存下来,
http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule

在这里插入图片描述

从请求头中取一些参数,先把代码轮廓写出来

import requests
import re


url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36',
    'Referer': 'http://fanyi.youdao.com/?keyfrom=dict2.index',
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-537504606@10.108.160.208; OUTFOX_SEARCH_USER_ID_NCOO=1391183017.2268062; JSESSIONID=aaanZ4Lwikjv9dka7w7wx; ___rl__test__cookies=1605167354382',
}

data={
    ############
}

response = requests.post(url,headers=headers,data=data)

分析data参数

在这里插入图片描述

先把刚才的data复制到一个文本中。
然后再重新输入一个待翻译文字,将它的data也复制到一个文本中:

在这里插入图片描述

进行一下对比,发现 i 参数就是我们的待翻译文本,有部分参数为定值,并且发现了三个变参,应该是js加密的参数。

我们先初步将代码写成下面的样子:

import requests
import re


url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36',
    'Referer': 'http://fanyi.youdao.com/?keyfrom=dict2.index',
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-537504606@10.108.160.208; OUTFOX_SEARCH_USER_ID_NCOO=1391183017.2268062; JSESSIONID=aaanZ4Lwikjv9dka7w7wx; ___rl__test__cookies=1605167354382',
}

query = input("请输入待查询的文本:")

data = {
    'i': query,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '', #待定
    'sign': '', #待定
    'lts': '', #待定
    'bv': 'a85763c72b3babd7639e5d3df56ae30c',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME',
}

response = requests.post(url,headers=headers,data=data)

破解js加密

在上面的分析中,我们发现了三个可变参数,下面我们去破解这些参数。

在这里插入图片描述

我们进入 search

在这里插入图片描述

输入sign,查询一下sign在哪些地方出现过,发现就有一个结果,那加密函数肯定就在这个js文件里面了,我们只需要找到它就好。

在这里插入图片描述

进入后点击花括号,让代码格式化

在这里插入图片描述

按ctrl+h 输入 sign 查找其位置,我们发现这个地方非常可疑,四个参数全是data里面的参数,而且还在return语句里,十分可疑,我们将这行打上断点。

在这里插入图片描述
在这里插入图片描述

打上断点后,我们输入一个翻译文字,它直接开始了调试,我们将鼠标放在这四个参数上面,看一看它们的值。

在这里插入图片描述

我们发现这三个参数与前面的几乎一样,但是我们前面分析的 bv 参数是个定值,但是看一下上面的代码,发现 bv 可能不是定值,也就是说我们前面的分析有误,但是不影响,顺手把他破了就行。我们直接把这个函数代码拿下来。

在这里插入图片描述

然后回到调试页面,看一看 md5 在哪

在这里插入图片描述

把鼠标放在 md5上面,点击上面的链接跳转过去

在这里插入图片描述

已经定位到了这个函数的位置

在这里插入图片描述

点击跳入下一个函数,因为我们的断点打的位置就是调用这个函数的位置,所以点击跳入下一个函数后,会直接跳到这个函数里面

在这里插入图片描述

我们看到了它的参数,但是不必去理会,直接将这个函数全部拿下来

在这里插入图片描述

这里我们要将函数头处理一下,然后再将第一个函数处理一下:

在这里插入图片描述

我们继续让调试向下走:

算了,直接先运行刚刚的那俩函数,看一看缺什么东西,然后去找就行了

调用一下函数
在这里插入图片描述

编译运行

在这里插入图片描述

发现报了错,e为定义,我们回去仔细研究研究这个函数的结构
在这里插入图片描述
我们可以看到 这个函数里面还有一个函数,而且里面的函数与外面的没有什么关系,因为它的参数就是我们要查询的文字,既然如此,我们直接再对这个函数进行修改。

在这里插入图片描述

改成这样后,仔细读读代码发现还是不行,ts:r 这里会进行函数的无限递归,所以继续修改,把函数名改了。

在这里插入图片描述

改成这样,我们再次运行一下这个js文件

在这里插入图片描述

发现还有一个未定义值,同样我们再次回到调试台看一下这个值是什么

在这里插入图片描述

诶,这不是请求头吗,那我们直接将这个请求头复制下来,定义一个变量 agent ,让这个变量先装着请求头。

在这里插入图片描述

怪不得前面我们分析的 bv 参数是个定值,但是后面又觉得不是定值,原来这个参数是根据请求头定的,我们没换浏览器,那么它自然不会变。

我们再次去运行js文件

在这里插入图片描述

这个显然是md5 函数里面的了,同样我们回到调试台看看 h 在哪,然后直接把它拿下来。

在这里插入图片描述

在这里插入图片描述

我们已经来到了 h 函数这里,而且我们发现 md5 里面还有很多其他函数,而且我们发现 h 函数旁边也是这样的函数,所以为了方便,我们直接把这些函数全部拿下来。

在这里插入图片描述

我们将上面的所以函数全部拿下来,复制到js文件的最上面。

再次运行js文件

在这里插入图片描述

这应该是破解成功了!

代码实现

我们导入execjs 包,将上面的js代码编译一下

import requests
import re
import execjs

query = input('输入待翻译文本:')

def readJS(path):
    f = open(path,'r')
    code = f.read()
    f.close()
    return code

ctx = execjs.compile(readJS('./param.js'))
res = ctx.call('param',query)
print(res)


url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36',
    'Referer': 'http://fanyi.youdao.com/?keyfrom=dict2.index',
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-537504606@10.108.160.208; OUTFOX_SEARCH_USER_ID_NCOO=1391183017.2268062; JSESSIONID=aaanZ4Lwikjv9dka7w7wx; ___rl__test__cookies=1605167354382',
}

data = {
    'i': query,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '',
    'sign': '',
    'lts': '',
    'bv': 'a85763c72b3babd7639e5d3df56ae30c',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME',
}

# response = requests.post(url,headers=headers,data=data)

运行一下试试

在这里插入图片描述

报错了,,gbk编码,我们对编码进行一下转换

import requests
import re
import execjs

query = input('输入待翻译文本:')

def readJS(path):
    f = open(path,'rb')
    code = f.read()
    f.close()
    return code

ctx = execjs.compile(readJS('./param.js').decode('utf8'))

res = ctx.call('param',query)

print(res)

再次运行一下

在这里插入图片描述

我们发现已经获取到结果

我们可以将data参数进行更新了

import requests
import re
import execjs

query = input('输入待翻译文本:')

def readJS(path):
    f = open(path,'rb')
    code = f.read()
    f.close()
    return code

ctx = execjs.compile(readJS('./param.js').decode('utf8'))

res = ctx.call('param',query)

url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36',
    'Referer': 'http://fanyi.youdao.com/?keyfrom=dict2.index',
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-537504606@10.108.160.208; OUTFOX_SEARCH_USER_ID_NCOO=1391183017.2268062; JSESSIONID=aaanZ4Lwikjv9dka7w7wx; ___rl__test__cookies=1605167354382',
}

data = {
    'i': query,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': res['salt'],
    'sign': res['sign'],
    'lts': res['ts'],
    'bv': res['bv'],
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME',
}

response = requests.post(url,headers=headers,data=data)

print(response.text)

运行一下:

在这里插入图片描述

发现结果在这里面,我们用正则提取出来

import requests
import re
import execjs

query = input('输入待翻译文本:')

def readJS(path):
    f = open(path,'rb')
    code = f.read()
    f.close()
    return code

ctx = execjs.compile(readJS('./param.js').decode('utf8'))

res = ctx.call('param',query)

url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36',
    'Referer': 'http://fanyi.youdao.com/?keyfrom=dict2.index',
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-537504606@10.108.160.208; OUTFOX_SEARCH_USER_ID_NCOO=1391183017.2268062; JSESSIONID=aaanZ4Lwikjv9dka7w7wx; ___rl__test__cookies=1605167354382',
}

data = {
    'i': query,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': res['salt'],
    'sign': res['sign'],
    'lts': res['ts'],
    'bv': res['bv'],
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME',
}

response = requests.post(url,headers=headers,data=data)

result = re.search('"tgt":"(.*?)"',response.text).group(1)
print(result)

在这里插入图片描述

我们发现已经完成!
最后添加一个循环。

import requests
import re
import execjs


def readJS(path):
    f = open(path,'rb')
    code = f.read()
    f.close()
    return code

    
ctx = execjs.compile(readJS('./param.js').decode('utf8'))

url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36',
    'Referer': 'http://fanyi.youdao.com/?keyfrom=dict2.index',
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-537504606@10.108.160.208; OUTFOX_SEARCH_USER_ID_NCOO=1391183017.2268062; JSESSIONID=aaanZ4Lwikjv9dka7w7wx; ___rl__test__cookies=1605167354382',
}

while 1:
    query = input('输入待翻译文本:')
    if query == '-1' :
        break
    res = ctx.call('param',query)
    data = {
        'i': query,
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': res['salt'],
        'sign': res['sign'],
        'lts': res['ts'],
        'bv': res['bv'],
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTlME',
    }
    response = requests.post(url,headers=headers,data=data)

    result = re.search('"tgt":"(.*?)"',response.text).group(1)
    print(result)

运行一下

在这里插入图片描述

总代码

  • youdao.py
import requests
import re
import execjs


def readJS(path):
    f = open(path,'rb')
    code = f.read()
    f.close()
    return code

    
ctx = execjs.compile(readJS('./param.js').decode('utf8'))

url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36',
    'Referer': 'http://fanyi.youdao.com/?keyfrom=dict2.index',
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-537504606@10.108.160.208; OUTFOX_SEARCH_USER_ID_NCOO=1391183017.2268062; JSESSIONID=aaanZ4Lwikjv9dka7w7wx; ___rl__test__cookies=1605167354382',
}

while 1:
    query = input('输入待翻译文本:')
    if query == '-1' :
        break
    res = ctx.call('param',query)
    data = {
        'i': query,
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': res['salt'],
        'sign': res['sign'],
        'lts': res['ts'],
        'bv': res['bv'],
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTlME',
    }
    response = requests.post(url,headers=headers,data=data)

    result = re.search('"tgt":"(.*?)"',response.text).group(1)
    print(result)

  • param.js
var n = function(e, t) {
    return e << t | e >>> 32 - t
}
  , r = function(e, t) {
    var n, r, i, a, o;
    return i = 2147483648 & e,
    a = 2147483648 & t,
    n = 1073741824 & e,
    r = 1073741824 & t,
    o = (1073741823 & e) + (1073741823 & t),
    n & r ? 2147483648 ^ o ^ i ^ a : n | r ? 1073741824 & o ? 3221225472 ^ o ^ i ^ a : 1073741824 ^ o ^ i ^ a : o ^ i ^ a
}
  , i = function(e, t, n) {
    return e & t | ~e & n
}
  , a = function(e, t, n) {
    return e & n | t & ~n
}
  , o = function(e, t, n) {
    return e ^ t ^ n
}
  , s = function(e, t, n) {
    return t ^ (e | ~n)
}
  , l = function(e, t, a, o, s, l, c) {
    return e = r(e, r(r(i(t, a, o), s), c)),
    r(n(e, l), t)
}
  , c = function(e, t, i, o, s, l, c) {
    return e = r(e, r(r(a(t, i, o), s), c)),
    r(n(e, l), t)
}
  , u = function(e, t, i, a, s, l, c) {
    return e = r(e, r(r(o(t, i, a), s), c)),
    r(n(e, l), t)
}
  , d = function(e, t, i, a, o, l, c) {
    return e = r(e, r(r(s(t, i, a), o), c)),
    r(n(e, l), t)
}
  , f = function(e) {
    for (var t, n = e.length, r = n + 8, i = 16 * ((r - r % 64) / 64 + 1), a = Array(i - 1), o = 0, s = 0; s < n; )
        o = s % 4 * 8,
        a[t = (s - s % 4) / 4] = a[t] | e.charCodeAt(s) << o,
        s++;
    return t = (s - s % 4) / 4,
    o = s % 4 * 8,
    a[t] = a[t] | 128 << o,
    a[i - 2] = n << 3,
    a[i - 1] = n >>> 29,
    a
}
  , p = function(e) {
    var t, n = "", r = "";
    for (t = 0; t <= 3; t++)
        n += (r = "0" + (e >>> 8 * t & 255).toString(16)).substr(r.length - 2, 2);
    return n
}
  , h = function(e) {
    e = e.replace(/\x0d\x0a/g, "\n");
    for (var t = "", n = 0; n < e.length; n++) {
        var r = e.charCodeAt(n);
        if (r < 128)
            t += String.fromCharCode(r);
        else if (r > 127 && r < 2048)
            t += String.fromCharCode(r >> 6 | 192),
            t += String.fromCharCode(63 & r | 128);
        else if (r >= 55296 && r <= 56319) {
            if (n + 1 < e.length) {
                var i = e.charCodeAt(n + 1);
                if (i >= 56320 && i <= 57343) {
                    var a = 1024 * (r - 55296) + (i - 56320) + 65536;
                    t += String.fromCharCode(240 | a >> 18 & 7),
                    t += String.fromCharCode(128 | a >> 12 & 63),
                    t += String.fromCharCode(128 | a >> 6 & 63),
                    t += String.fromCharCode(128 | 63 & a),
                    n++
                }
            }
        } else
            t += String.fromCharCode(r >> 12 | 224),
            t += String.fromCharCode(r >> 6 & 63 | 128),
            t += String.fromCharCode(63 & r | 128)
    }
    return t
};

function md5(e) {
    var t, n, i, a, o, s, m, g, v, y = Array();
    for (e = h(e),
    y = f(e),
    s = 1732584193,
    m = 4023233417,
    g = 2562383102,
    v = 271733878,
    t = 0; t < y.length; t += 16)
        n = s,
        i = m,
        a = g,
        o = v,
        s = l(s, m, g, v, y[t + 0], 7, 3614090360),
        v = l(v, s, m, g, y[t + 1], 12, 3905402710),
        g = l(g, v, s, m, y[t + 2], 17, 606105819),
        m = l(m, g, v, s, y[t + 3], 22, 3250441966),
        s = l(s, m, g, v, y[t + 4], 7, 4118548399),
        v = l(v, s, m, g, y[t + 5], 12, 1200080426),
        g = l(g, v, s, m, y[t + 6], 17, 2821735955),
        m = l(m, g, v, s, y[t + 7], 22, 4249261313),
        s = l(s, m, g, v, y[t + 8], 7, 1770035416),
        v = l(v, s, m, g, y[t + 9], 12, 2336552879),
        g = l(g, v, s, m, y[t + 10], 17, 4294925233),
        m = l(m, g, v, s, y[t + 11], 22, 2304563134),
        s = l(s, m, g, v, y[t + 12], 7, 1804603682),
        v = l(v, s, m, g, y[t + 13], 12, 4254626195),
        g = l(g, v, s, m, y[t + 14], 17, 2792965006),
        m = l(m, g, v, s, y[t + 15], 22, 1236535329),
        s = c(s, m, g, v, y[t + 1], 5, 4129170786),
        v = c(v, s, m, g, y[t + 6], 9, 3225465664),
        g = c(g, v, s, m, y[t + 11], 14, 643717713),
        m = c(m, g, v, s, y[t + 0], 20, 3921069994),
        s = c(s, m, g, v, y[t + 5], 5, 3593408605),
        v = c(v, s, m, g, y[t + 10], 9, 38016083),
        g = c(g, v, s, m, y[t + 15], 14, 3634488961),
        m = c(m, g, v, s, y[t + 4], 20, 3889429448),
        s = c(s, m, g, v, y[t + 9], 5, 568446438),
        v = c(v, s, m, g, y[t + 14], 9, 3275163606),
        g = c(g, v, s, m, y[t + 3], 14, 4107603335),
        m = c(m, g, v, s, y[t + 8], 20, 1163531501),
        s = c(s, m, g, v, y[t + 13], 5, 2850285829),
        v = c(v, s, m, g, y[t + 2], 9, 4243563512),
        g = c(g, v, s, m, y[t + 7], 14, 1735328473),
        m = c(m, g, v, s, y[t + 12], 20, 2368359562),
        s = u(s, m, g, v, y[t + 5], 4, 4294588738),
        v = u(v, s, m, g, y[t + 8], 11, 2272392833),
        g = u(g, v, s, m, y[t + 11], 16, 1839030562),
        m = u(m, g, v, s, y[t + 14], 23, 4259657740),
        s = u(s, m, g, v, y[t + 1], 4, 2763975236),
        v = u(v, s, m, g, y[t + 4], 11, 1272893353),
        g = u(g, v, s, m, y[t + 7], 16, 4139469664),
        m = u(m, g, v, s, y[t + 10], 23, 3200236656),
        s = u(s, m, g, v, y[t + 13], 4, 681279174),
        v = u(v, s, m, g, y[t + 0], 11, 3936430074),
        g = u(g, v, s, m, y[t + 3], 16, 3572445317),
        m = u(m, g, v, s, y[t + 6], 23, 76029189),
        s = u(s, m, g, v, y[t + 9], 4, 3654602809),
        v = u(v, s, m, g, y[t + 12], 11, 3873151461),
        g = u(g, v, s, m, y[t + 15], 16, 530742520),
        m = u(m, g, v, s, y[t + 2], 23, 3299628645),
        s = d(s, m, g, v, y[t + 0], 6, 4096336452),
        v = d(v, s, m, g, y[t + 7], 10, 1126891415),
        g = d(g, v, s, m, y[t + 14], 15, 2878612391),
        m = d(m, g, v, s, y[t + 5], 21, 4237533241),
        s = d(s, m, g, v, y[t + 12], 6, 1700485571),
        v = d(v, s, m, g, y[t + 3], 10, 2399980690),
        g = d(g, v, s, m, y[t + 10], 15, 4293915773),
        m = d(m, g, v, s, y[t + 1], 21, 2240044497),
        s = d(s, m, g, v, y[t + 8], 6, 1873313359),
        v = d(v, s, m, g, y[t + 15], 10, 4264355552),
        g = d(g, v, s, m, y[t + 6], 15, 2734768916),
        m = d(m, g, v, s, y[t + 13], 21, 1309151649),
        s = d(s, m, g, v, y[t + 4], 6, 4149444226),
        v = d(v, s, m, g, y[t + 11], 10, 3174756917),
        g = d(g, v, s, m, y[t + 2], 15, 718787259),
        m = d(m, g, v, s, y[t + 9], 21, 3951481745),
        s = r(s, n),
        m = r(m, i),
        g = r(g, a),
        v = r(v, o);
    return (p(s) + p(m) + p(g) + p(v)).toLowerCase()
}

//这里的请求头根据自己的而定
//也可以直接使用这个
var agent = "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36";

function param(e) {
    var t = md5(agent)
        , r = "" + (new Date).getTime()
        , i = r + parseInt(10 * Math.random(), 10);
    return {
        ts: r,
        bv: t,
        salt: i,
        sign: md5("fanyideskweb" + e + i + "]BjuETDhU)zqSxf-=B#7m")
    }
};

//console.log(param("你好"));
  • 更多功能可自行添加。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy是一个强大的Python开源网络爬虫框架,可以用来快速、高效地爬取网页信息。下面我将以使用Scrapy框架爬取有道翻译为例,简要介绍如何进行爬取。 首先,我们需要创建一个Scrapy项目。打开命令行工具,输入以下命令: scrapy startproject youdao_translate 这将在当前目录下创建一个名为"youdao_translate"的Scrapy项目。接下来,进入项目目录并创建一个名为"translator"的爬虫,命令如下: cd youdao_translate scrapy genspider translator www.youdao.com 这将在项目目录下的spiders文件夹中生成一个名为"translator.py"的文件,我们可以在文件中编写爬虫代码。 打开"translator.py"文件,我们需要设置爬虫的起始URL和解析方法。首先,在文件的开头添加以下代码: start_urls = ['http://www.youdao.com/'] 然后,找到"def parse(self, response):"这一行,在该方法中编写解析页面的代码,如下所示: def parse(self, response): result = response.xpath('//div[@id="inputTranslation"]/ul/li/text()').extract_first() yield { 'translation': result, } 在这个示例中,我们使用XPath语法来提取翻译结果所在的标签,并将结果存储在一个字典中。通过使用yield关键字,我们将字典作为爬取结果返回。 接下来,保存文件并返回命令行工具。在命令行中输入以下命令即可启动爬虫: scrapy crawl translator Scrapy将会开始爬取并显示爬取过程的日志信息。当爬取完成后,结果将保存在默认的JSON文件中,您可以在项目目录下找到该文件。 以上就是使用Scrapy框架爬取有道翻译的简要流程。当然,具体的爬取过程可能因网站的结构和数据布局而有所不同,您可以根据实际情况进行调整和改进。希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值