python3.6爬虫—有道,百度翻译爬虫

(1)通过headers反爬虫:从用户请求的Headers反爬虫是最常见的反爬虫策略,很多网站都会对Headers的User-Agent进行检测,遇到这种情况,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到Headers中。一般有两种方法:

             第1种方法:在Request生成之前先设置好,然后传递给Request

  

有道翻译,翻译语言是自动的
#import urllib.request延迟提交时间
import urllib.parse
import json
import time
while True:
    content=input('请输入翻译内容(输入"q!"退出程序):') #可以根据输入内容实现自动翻译
    if content=='q!':
        break
    url='http://fanyi.youdao.com/translate'
    head={}#在Request生成之前先设置好,然后传递给Request
    head['User-Agent']='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    data={}
    data['i']=content#翻译的内容必须有
    data['doctype']='json'#指定翻译结果为json格式
    data=urllib.parse.urlencode(data).encode('utf-8')#转换为服务器可以理解的编码方式
    req=urllib.request.Request(url,data,head)#urllib.request.Request是进一步的包装请求,目的是加上头信息,伪装成浏览器访问
    response=urllib.request.urlopen(req)#返回response对象,返回信息保存在此对象里
    html=response.read().decode('utf-8')#服务器返回结果读取
    #print(html)输出字符串,字符串包含字典结构
    translate_results=json.loads(html)##字符串载入得到字典结构
    #print(translate_results)输出结果:{'type': 'EN2ZH_CN', 'errorCode': 0, 'elapsedTime': 0, 'translateResult': [[{'src': 'I love you', 'tgt': '我爱你'}]]}
    translate_results=translate_results['translateResult'][0][0]['tgt']#translateResult字典中包含两层列表,[0][0]表示去除两层列表,['tgt']表示访问translateResult字典中的'tgt'值
    print(translate_results)
    #time.sleep(5)睡眠时间5s后才可以进行下一次翻译
百度翻译,翻译语言可根据要求设定
import urllib.request
import urllib.parse
import json
content=input('请输入内容:')
url='https://fanyi.baidu.com/transapi'#百度翻译
head={}
head['User-Agent']='Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36'
data={"query":content,"from":'en',"to":'zh'}#en代表英语,zh代表中文;可以设置翻译语言
data=urllib.parse.urlencode(data).encode('utf-8')
req=urllib.request.Request(url,data,head)
response=urllib.request.urlopen(req)
html=response.read().decode('utf-8')
#print(html)输出字符串,字符串包含字典结构
trans_result=json.loads(html)#字符串载入得到字典
#print(trans_result)输出结果:{'from': 'en', 'to': 'zh', 'domain': 'all', 'type': 2, 'status': 0, 'data': [{'dst': '爱情', 'prefixWrap': 0, 'src': 'Love', 'relation': [], 'result': [[0, '爱情', ['0|4'], [], ['0|4'], ['0|6']]]}]}
trans_result=trans_result['data'][0]['dst']#data数据中包含一层列表,去除后在访问得到需要的值
print(trans_result)

           

             第2种方法:在Request生成之后设置

有道翻译,翻译语言是自动的
#import urllib.request#延迟提交时间
import urllib.parse
import json
import time
while True:
    content=input('请输入翻译内容(输入"q!"退出程序):') #可以根据输入内容实现自动翻译
    if content=='q!':
        break
    url='http://fanyi.youdao.com/translate'#有道翻译,翻译语言是自动的
    data={}
    data['i']=content#翻译的内容必须有
    data['doctype']='json'#指定翻译结果为json格式
    data=urllib.parse.urlencode(data).encode('utf-8')#转换为服务器可以理解的编码方式
    req=urllib.request.Request(url,data)#urllib.request.Request是进一步的包装请求
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36')#在Request生成之后
    response=urllib.request.urlopen(req)#返回response对象,返回信息保存在此对象里
    html=response.read().decode('utf-8')#服务器返回结果读取
    #print(html)输出字符串,字符串包含字典结构
    translate_results=json.loads(html)##字符串载入得到字典结构
    #print(translate_results)输出结果:{'type': 'EN2ZH_CN', 'errorCode': 0, 'elapsedTime': 0, 'translateResult': [[{'src': 'I love you', 'tgt': '我爱你'}]]}
    translate_results=translate_results['translateResult'][0][0]['tgt']#translateResult字典中包含两层列表,[0][0]表示去除两层列表,['tgt']表示访问translateResult字典中的'tgt'值
    print(translate_results)
    #time.sleep(5)#睡眠时间5s后才可以进行下一次翻译
百度翻译,翻译语言可根据要求设定
import urllib.request
import urllib.parse
import json
content=input('请输入内容:')
url='https://fanyi.baidu.com/transapi'#百度翻译
data={"query":content,"from":'en',"to":'zh'}#en代表英语,zh代表中文;可以设置翻译语言
data=urllib.parse.urlencode(data).encode('utf-8')
req=urllib.request.Request(url,data)
req.add_header('User-Agent','Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36')
response=urllib.request.urlopen(req)
html=response.read().decode('utf-8')
#print(html)输出字符串,字符串包含字典结构
trans_result=json.loads(html)#字符串载入得到字典
#print(trans_result)输出结果:{'from': 'en', 'to': 'zh', 'domain': 'all', 'type': 2, 'status': 0, 'data': [{'dst': '爱情', 'prefixWrap': 0, 'src': 'Love', 'relation': [], 'result': [[0, '爱情', ['0|4'], [], ['0|4'], ['0|6']]]}]}
trans_result=trans_result['data'][0]['dst']#data数据中包含一层列表,去除后在访问得到需要的值
print(trans_result)

(2)基于用户行为的反爬虫:大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。可以专门写一个爬虫,爬取网上公开的代理ip,检测后全部保存起来。这样的代理ip爬虫经常会用到,最好自己准备一个。有了大量代理ip后可以每请求几次更换一个ip,这在requests或者urllib2中很容易做到,这样就能很容易的绕过第一种反爬虫。使用代理IP步骤如下图:

                 使用IP(随便找的)代理如下:

iplist=['119.101.116.77:9999',
        '49.86.183.39:9999',
        '121.40.78.138:3128']
proxy_support=urllib.request.ProxyHandler({'http':random.choice(iplist)})
opener=urllib.request.build_opener(proxy_support)
opener.addheaders=[{'User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 
                  (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}]#添加Headers
urllib.request.install_opener(opener)

猜你喜欢

转载自blog.csdn.net/qq_43130414/article/details/85395946
今日推荐