(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)