欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

爬虫2--隐藏爬虫

程序员文章站 2022-05-04 12:28:00
...

当爬虫不断地去访问服务器时,服务器会很有压力。一般服务器查看远程的client是否是代码操作时,一般通过查看User-Agent。因此,我们可以通过修改爬虫的User-Agent,使得服务器认为我们是人为在访问网页。

两种方式设置User-Agent,

1. urllib.request.Request(urldataheaders)

2.先生成request:  request = urllib.request.Request(urldata)

  为request添加agent: request.add_header(key,val)

代码如下:

import urllib.request
import urllib.parse
import json

url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule&sessionFrom=https://www.baidu.com/link'
'''
head = {}
head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
'''
data = {}
data['i']='我喜欢读书'
data['from']='zh-CHS'
data['to'] = 'en'
data['smartresult']='dict'
data['client']='fanyideskweb'
data['salt']='1499949940718'
data['sign']='f00c85b959fe71422bcff90bf9b88afe'
data['doctype']='json'
data['version']='2.1'
data['keyfrom']='fanyi.web'
data['action']='FY_BY_CL1CKBUTTON'
data['typoResult']='true'
data = urllib.parse.urlencode(data).encode('utf-8')
request = urllib.request.Request(url,data,head)
print(request.headers)
response = urllib.request.urlopen(url, data)
html = response.read().decode('utf-8')
result = json.loads(html)
print(result['smartResult']['entries'])



但是还要注意是一个问题是,当代码频繁的访问还是会给服务器带来很大的压力,此时服务器会要求输入验证码,此时有两种解决方案:

1.程序每隔一段时间再爬取数据

2.为爬虫设置代理服务器

  代理帮忙访问网址,然后把看到的东西返回给我们。因为服务器看到的是代理的地址,而不是真正要请求的地址,如果用多个代理去访问应该是可行的。

使用代理步骤:

a. 参数是一个字典{'类型‘:’代理ip:端口号‘} 

proxy_support = urllib.request.ProxyHandler({})

类型可以是http,https等protocol

b. 定制/创建一个opener

opener = urllib.request.build_opener(proxy_support)

opener可以看作是私人定制,当使用urlopen打开一个特定网页的时候,其实已经在使用一个默认的openenr来工作了。opener是可以定制的,比如我们可以给他加上特殊的headers,指定相关的代理,使用这个代理ip去做相应的访问

 c.1安装opener

urllib.request.install_opener(opener)  

这个方法可以把opener安装到系统中,这是个一劳永逸的做法,因为之后只要使用urlopen函数,就会使用这个定制好的opener

如果不想永远使用这个opener,而只是必要的情况下需要这个opener,此时可以c2

c2. 调用opener:

opener.open(url)  #表示这个特定的url使用这个定制的opener,别的url使用默认opener,不受这个opener的影响