爬虫实战:爬取翻译网站

2022年9月7日 388点热度 0人点赞 0条评论

项目一:爬取百度翻译

项目目的:理解post请求方式下的爬虫程序编写

第一步 观察网页

打开开发人员工具,在网站当中尝试输入需要翻译的内容,观察网页。每次新输入之后形成一个新的sug的请求,点击打开之后可以找到请求的URL和请求方式为POST,每进行一次翻译,就会传递一个表单,表单内容为需要翻译的内容。

图片

图片第二步 编写程序

# 导入可用的包
import requests
url = "https://fanyi.baidu.com/sug" #定义url
dat ={
    "kw":'dog'
}# 尝试翻译dog这个单词
resp = requests.post(url, data=dat)#提交请求
print(resp.json())#输出结果
resp.close()# 关掉response
#输出结果为{'errno': 0, 'data': [{'k''dog''v''n. 狗; 蹩脚货; 丑女人; 卑鄙小人 v. 困扰; 跟踪'}, {'k''DOG''v''abbr. Data Output Gate 数据输出门'}, {'k''doge''v''n. 共和国总督'}, {'k''dogm''v''abbr. dogmatic 教条的; 独断的; dogmatism 教条主义; dogmatist'}, {'k''Dogo''v''[地名] [马里、尼日尔、乍得] 多戈; [地名] [韩国] 道高'}]}

第三步 优化整合程序

刚刚我们是需要手动更改提交表单当中的需要翻译的内容,接下来我们把这个过程转换为输入输出的步骤。整合完整的程序如下:

# 导入可用的包
import requests
url = "https://fanyi.baidu.com/sug"
s = input("请输入你要翻译的单词")
dat ={
    "kw":s
}
resp = requests.post(url, data=dat)
print(resp.json())
resp.close()# 关掉response

当输入为dog时,输出以下结果:

请输入你要翻译的单词dog
{'errno': 0, 'data': [{'k''dog''v''n. 狗; 蹩脚货; 丑女人; 卑鄙小人 v. 困扰; 跟踪'}, {'k''DOG''v''abbr. Data Output Gate 数据输出门'}, {'k''doge''v''n. 共和国总督'}, {'k''dogm''v''abbr. dogmatic 教条的; 独断的; dogmatism 教条主义; dogmatist'}, {'k''Dogo''v''[地名] [马里、尼日尔、乍得] 多戈; [地名] [韩国] 道高'}]}

爬虫运行正常。

项目二:爬取有道翻译

项目目的:初步认识网站反爬机制

第一步 观察网页

打开开发人员工具,在网站当中尝试输入需要翻译的内容,观察网页。每次新输入之后形成一个新的translate_o?smartresult=dict&smartresult=rule的请求,点击打开之后可以找到请求的URL和请求方式为POST,每进行一次翻译,就会传递一个表单,表单内容为需要翻译的内容。我们发现每次传递的表单内容除了i也就是要翻译的内容不一样之外还有几个数据不一样"salt", "sign","lts"

图片

图片图片

第二步 探究表单生成规律

控制台直接搜索translate_o,在源代码当中,我们找到一个名为fanyi.min.js的文件,格式化展示方便我们进一步理解这个加密机制。

图片图片在格式化后的文件当中搜索salt,可以发现本地加密的算法部分。

图片格式化转换之后的文档可以看到,salt这个参数是由时间戳和随机数构成的,sign这个参数是由"fanyideskweb"+翻译的内容+salt+一串字符('Ygy_4c=r#e#4EX^NUGUc5')转化成md5格式,Its这个参数比salt缺了最后一位数字。因此构建这些密钥,需要使用到一些其他的第三方库:

  • time 生成时间
  • random 生成随机数
  • hashlib 将字符串转化为md5格式

第三步 编写代码

import time
import random
import hashlib
import requests
# 定义请求网址和表单查询内容
url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
s = input("请输入你要翻译的单词")
# 模拟生成表单
u = 'fanyideskweb'
salt = str(int(time.time()*1000) + random.randint(1,10))
c = 'Ygy_4c=r#e#4EX^NUGUc5'
sign = hashlib.md5((u + s + salt + c).encode('utf-8')).hexdigest()
its = salt[:-1]

dat ={
    "i":s,
    "from""AUTO",
    "to""AUTO",
    "smartresult""dict",
    "client""fanyideskweb",
    "salt": salt,
    "sign": sign,
    "lts": its,
    "bv""6f1d3ad76bcde34b6b6745e8ab9dc20a",
    "doctype""json",
    "version""2.1",
    "keyfrom""fanyi.web",
    "action""FY_BY_CLICKBUTTON"
}
#模拟浏览器发出请求
headers = {
    # 'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=387409182.3548826; OUTFOX_SEARCH_USER_ID="[email protected]"; _ga=GA1.2.527249081.1606700101; _ntes_nnid=7d04aa5336af433ea9b89954bd6b05fe,1634886459403; P_INFO=jiangcong5055; _dd_s=logs=1&id=8d3b4893-9b9c-4d42-bfbd-58b7d8dc8d15&created=1654560604551&expire=1654561519417; ___rl__test__cookies=1654560619440',
    'Cookie''OUTFOX_SEARCH_USER_ID="[email protected]"',
    'Referer''https://fanyi.youdao.com/',
    'Content-Type''application/x-www-form-urlencoded; charset=UTF-8',
    'User-Agent''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36'
}
resp = requests.post(url,headers=headers, data=dat)
#打印输出结果
print(resp.json())
resp.close()# 关掉response
请输入你要翻译的单词dog
{'errorCode': 0, 'translateResult': [[{'tgt''狗''src''dog'}]], 'type''en2zh-CHS''smartResult': {'entries': ['''n. 狗,犬;公狗,公狐,公狼;质量极差的东西;无吸引力的女子;卑鄙小人,无赖;<美,非正式>朋友\r\n''v. 困扰,纠缠;跟踪,尾随\r\n'], 'type': 1}}

82390爬虫实战:爬取翻译网站

这个人很懒,什么都没留下

文章评论