python练习7:对爬取有道翻译的二次改进之模拟浏览器行为

先上代码:

import urllib.request
import urllib.parse
import json


while True:
    content = input('输入要翻译的内容: ')

    def trans():
        url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'

        '''
        添加方法一:
        head = {}
        head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36'
        '''
        
        data = {}
        data['i'] = content
        data['from'] = 'AUTO'
        data['to'] = 'AUTO'
        data['smartresult'] = 'dict'
        data['client'] = 'fanyideskweb'
        data['salt'] = '15938760135952'
        data['sign'] = 'af3f1c36a96655e1a13616ec4e523d9c'
        data['ts'] = '1593876013595'
        data['bv'] = 'ce1fe729a12a6b5169046dd3aac11e4c'
        data['doctype'] = 'json'
        data['version'] = '2.1'
        data['keyfrom'] = 'fanyi.web'
        data['action'] = 'FY_BY_CLICKBUTTION'
        data = urllib.parse.urlencode(data).encode('utf-8')

        
        '''
        添加head方法一中的req是这样的:
        req = urllib.request.Request(url, data, head)
        下面那句req.add_header是没有的
        '''
        # 下面是方法二:req里面是没有head的, 添加head改用add_header方法
        req = urllib.request.Request(url, data)
        req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36')
        response = urllib.request.urlopen(req)
        html = response.read().decode('utf-8')
        target = json.loads(html)['translateResult'][0][0]['tgt']
        print('翻译结果: ', target)


    while content == '':
        content = input('重新输入要翻译的内容: ')
            
    else:
        trans()

这次改进后增加的功能有:
1,添加了head,可以让爬虫程序可以模拟浏览器进行操作,或者让爬虫程序更像一个正常人在访问页面,从而躲过网站服务器的排查。

能躲过排查的原因大致是这样的:
python的高速访问,会给服务器带来额外的压力,并且让网站有泄露重要数据的风险,所以很多网站是不愿意被爬取数据的。当网站被访问时,会向服务器发送请求,这时服务器会检查访问的连接来源,如果是正常的人为链接,服务器会同意该访问,会给出回应数据;如果是爬虫程序访问了网站,服务器通过访问链接进行判断后,得知是程序代码在访问,则会拒绝爬虫程序的请求,不会给出回应数据。所以,我们需要添加head,让我们的程序在服务器面前 看起来像个正常人发送的请求一样。

猜你喜欢

转载自blog.csdn.net/tuzi007a/article/details/107133657