由于有些网站不喜欢被程序访问,因此他们会检查链接的来源,如果访问来源不是正常的途径,就给你“掐掉”。所以为了让我们的爬虫更好的为我们服务,需要对代码进行一些改进——隐藏,让他看起来更像是普通人通过普通浏览器的正常点击。但是这仅仅是最简单的方式了,如果这要是用于爬取网页爬虫(例如说批量下载图片。。。),那么一个IP在短时间之内连续进行网页的访问,很明显是不符合普通人类的行为标准的,同事对服务器造成不小的压力。因此服务器只需要记录每个IP的访问频率,在单位时间之内,如果访问频率超过一个阈值,便认为该IP地址很可能是爬虫,于是可以返回一个验证码页面,要求用户填写验证码。如果是爬虫的话当然不可能填写验证码,便可拒绝。
以我们目前的水平,有两种策略可以提供选择:第一种就是延迟提交的时间,还有一种策略就是使用代理。
下面我们就以代理的方式对本地IP页面进行访问:
#使用代理获取网页数据 访问本地IP
def use_proxy_request(proxy_addr, url):
#参数是一个字典,字典的键是代理的类型,如 http、ftp 或 https
proxy = urllib.request.ProxyHandler({"http":proxy_addr})
#当 urlopen() 函数打开一个网页的时候默认的使用 opener 在工作,可认为是私人定制
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
#定制请求头
opener.addheaders = [("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36")]
#将定制好的 opener 安装到系统中
urllib.request.install_opener(opener)
#请求
response = urllib.request.urlopen(url)
data = response.read().decode("utf-8")
return data
#调用
proxy_addr = "60.177.224.13:18118"
url = "http://www.whatismyip.com.tw/"
data = use_proxy_request(proxy_addr, url)
print(data)
接下来我们执行代码出现如下效果即可访问成功: