咳咳,人生真的是一波三折,落落起起,大概是9.14那天晚上好像,我前面的同学准备出国,临时放弃保研,然后名额顺延到我了,这几天就在疯狂复习数据结构,也没怎么看爬虫,昨天刚保研面试完,不知道结果怎么样,但愿一切都好吧!今天来学学爬虫,昨晚买了两本书, 一本是python编程的入门实战,一本是关于数据挖掘的~ 然后在知乎上找到了scrapy的教程,这几天先打算学一学~ 人生的下一个阶段,要比以前更努力才是啊!
——————————————————————————————————————————————————
因为咱们的爬虫访问网站留下的useragent是pythonxxx,人一看就知道是爬虫了~万一网站采取反爬措施呢?咱们该怎么办呢?今天就介绍一下 userAgent的修改→修改headers
用上个博客的爬取有道翻译的例子:
下面我们用定义一个爬虫函数的过程来讲解一下:
1.1 填写你要爬取的url
def Translation(input):
input = str(input) #用户的输入参数
url="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
1.2 填写你要传入的data (每个网站可能格式不同,具体怎么填写请参照上一篇博文)
data={} #data是一个字典
data['from'] = 'AUTO'
data['to'] = 'AUTO'
data['i'] = input #要翻译的东西是用户的输入参数
data['smartresult'] = 'dict'
data['client'] = 'fanyideskweb'
data['salt'] = '1536132624880'
data['sign'] = '84d7547f78c9455a6ad3067cc86baa0d'
data['doctype'] = 'json'
data['version']= '2.1'
data['keyfrom'] = 'fanyi.web'
data['action']= 'FY_BY_CLICKBUTTION'
data['typoResult']= 'false'
data = urllib.parse.urlencode(data).encode('utf-8')
#data必须是x-www-form-urlencoded格式。所以需要用这个函数来编码成url
1.3 修改headers
head={}
head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
这里的参数是怎么来的呢?我们先用浏览器手工打开有道翻译的界面:
这里就是我们的浏览器提交的时候的User-Agent啦,我们可以通过修改这个,模拟成浏览器访问~
1.4 将url data head依次赋值给req
req = urllib.request.Request(url, data, head)
response = urllib.request.urlopen(req)
response = response.read().decode('utf-8')
response= json.loads(response) #s表示字符串,载入字符串变成字典
result = str(response['translateResult'][0][0]['tgt'])
print(input, '的翻译是:', result)
1.5 调用
UserIn = str(input('请输入您要翻译的内容:\n'))
Translation(UserIn)
# 方法2. request生成之后,add_header()动态追加
req = urllib.request.Request(url, data)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')
——————————————————————————————————————————————————
2.1 引入time 模块
import time
只需要在调用的时候更改一下间隔:
while True:
UserIn = str(input('\n请输入您要翻译的内容:(输入ESC退出程序)\n'))
if(UserIn != 'ESC'):
Translation(UserIn)
time.sleep(5) #休眠5秒钟
else:
break