对于大多数网站来说,如果网站发现你是爬虫程序,会禁止你的访问,从而让你获取不到你想要的数据。所以,我们要尽可能的伪装自己,像是真人从浏览器访问访问的一样。
通常防止爬虫被反主要有以下几个策略:
动态设置请求头headers(User-Agent)(随机切换User-Agent,模拟不同用户的浏览器信息)
使用IP地址池:VPN和代理IP,现在大部分网站都是根据IP来ban的
Cookies
设置延迟下载(防止访问过于频繁,设置为2秒或更高)
设置请求头(urllib.request.Request)
urllib.request.Request是urllib的一个抽象类,用于构造一个http请求对象实例。
request类Request方法常用的内置方法:
Request.add_data(data)设置data参数,如果一开始创建的时候没有给data参数,那么可以使用该方法追加data参数;
Request.get_method() 返回HTTP请求方法,一般返回GET或是POST;
Request.has_data() 查看是否设置了data参数;
Request.get_data() 获取data参数的数据;
Request.add_header(key, val) 添加头部信息,key为头域名,val为域值;
Request.get_full_url() 获取请求的完整url;
Request.get_host() 返回请求url的host(主域名);
Request.set_proxy(host, type) 设置代理,第一个参数是代理ip和端口,第二个参数是代理类型(http/https)。
简单代码示例
# 导入urllib库
import urllib.parse
import urllib.request
# 声明定义请求头
headers = {
# 在这个头字典里面可以将你所有需要传递的头添加进来
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}
# 向指定的url发送请求,并返回
post_url = 'https://fanyi.baidu.com/sug'
# 传入参数
form_data = {
'kw': 'honey'
}
# 格式化参数
form_data = urllib.parse.urlencode(form_data).encode()
# 创建Request类
req = urllib.request.Request(url=post_url, headers=headers, data=form_data)
# 进行请求,打印结果
ret = urllib.request.urlopen(req)
print(ret.read())
爬虫示例
爬取拉勾网Python职位招聘信息(由于拉勾网进行了防爬,访问其接口需要传递Cookie,本人直接在浏览器复制出来写入到请求头中的)。
# 引入urllib库
import urllib.parse
import urllib.request
# 声明定义请求头
h