详细解析反爬手段以及处理方案
前言
互联网时代,无论在工作上,还是生活上都离不开网络,而网络能给我们带来什么?
新闻,小说,资料,各行业的数据或者报表等等;
比如:快毕业了为了论文,在各种网站上爬取需要的数据进行分析;还有一些为了兴趣爱好,爬取各种类型的图片,视频,文章,数据等。
各网站的开发人员为了约束这种行为,开始绞尽脑汁,采取各种手段去约束爬虫,于是,有了反爬机制!
常见反爬机制
1,通过对 User-Agent 过滤来控制访问
无论是浏览器,程序,还是爬虫,在向服务器发起网络请求时,都会先发送一个请求头文件 headers ,
比如:
{
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,zh-HK;q=0.8",
"Host": "httpbin.org",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-5fe2b4fe-6e4edc1c4dbbe85a3c25492b"
}
}
# "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
请求头大部分的字段主要是浏览器向服务端 “表明自己的身份”用的,很多网站都会建立 user-agent 白名单,只有在正常范围内的 user-agent 才能正常访问 。
user-agent 是一个阅读器标志,用户都是一中阅读器,网站很粗糙的辨别你有咩有作弊,必须要结构不同的阅读器标志,不然就会认为你是爬虫,宁杀错,不放过,你说气不气;
缺点:很容易伪造头部
处理方案:
修改阅读器标志,模拟其他阅读器的标志(定义一个标志库,随机获取一个),能够通过API接口实现各种阅读器的收集模拟;
# 定义 user-agent/标志库
# 第一种方法
def get_user_agent():
"""
模拟headers的user-agent字段,
返回一个随机的user-agent字典类型的键值对
"""
agents = [
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0;) Gecko/20100101 Firefox/61.0",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
]
fakeheader = {
}
fakeheader['User-agent'] = agents[random.randint(0,len(agents))]
return fakeheader
def get_html(url):
try:
r= requests.get(url, timeout=30,headers=get_user_agent())
r.raise_for_status
r.encoding = r.apparent_encding
return r.status_code
except:
return "someting wrong!"
# 第二种方法
def get_html():
agents = [...]
headers = {
'User-Agent': random.choice(user_agent_list