网络反爬技术有哪些?

网络反爬技术有哪些?

一、通过User-Agent来控制访问:

浏览器和爬虫程序在向服务器发起网络请求的时候,会发送一个头文件:headers,比如知乎的requests headers:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

Accept-Encoding:gzip, deflate, sdch, br

Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,da;q=0.2,la;q=0.2

Cache-Control:max-age=0

Connection:keep-alive

Cookie: **********

Host:http://zhuanlan.zhihu.com

Referer:Ehco - 知乎

Upgrade-Insecure-Requests:1

User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36

Query String Parameters

view source

view URL encoded


大多数的字段都是浏览器向服务器”表明身份“用的,对于爬虫程序来说,最需要注意的字段就是:User-Agent,很多网站都会建立 user-agent白名单,只有属于正常范围的user-agent才被允许访问。


比如知乎:

import requests

import bs4

import random


def get_html(url):

try:

r = requests.get(url, timeout=30)

r.raise_for_status

r.encoding = r.apparent_encoding

return r.text

except:

return "Someting Wrong!"


print(get_html('https://zhuanlan.zhihu.com'))


# OUT:

'''

500 Server Error

An internal server error occured.

'''

解决方法:

可以自己设置一下user-agent,或者更好的是,可以从一系列的user-agent里随机挑出一个符合标准的使用,代码如下:

def get_agent():

'''

模拟header的user-agent字段,

返回一个随机的user-agent字典类型的键值对

'''

agents = ['Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;',

'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv,2.0.1) Gecko/20100101 Firefox/4.0.1',

'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11',

'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',

'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)']

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_agent())

r.raise_for_status

r.encoding = r.apparent_encoding

return r.status_code

except:

return "Someting Wrong!"


'''

OUT:

200

'''

二、限制IP反爬虫:

如果一个固定的ip在短暂的时间内,频繁访问某个网站,管理员可以封堵来自该ip的访问,也就实现了反爬。


解决方法:


给爬虫设置IP代理池,就是通过ip代理,使用不同的ip进行访问。但ip代理本身就是一个很麻烦的事情,有免费和付费的,质量参差不齐。购买集群云服务来自建代理池效果可能更好。

def get_proxy():

'''

简答模拟代理池

返回一个字典类型的键值对,

'''

proxy = ["http://116.211.143.11:80",

"http://183.1.86.235:8118",

"http://183.32.88.244:808",

"http://121.40.42.35:9999",

"http://222.94.148.210:808"]

fakepxs = {}

fakepxs['http'] = proxy[random.randint(0, len(proxy))]


return fakepxs


三、通过JS脚本反爬:

爬虫只是程序,它不能像人一样去应对各种动态变化,如验证码,滑动解锁之类的验证手段。

比如,若想爬取某网站,在进入网站之前,有一个验证页面来验证访客是不是机器,如:通过js代码生成一大段随机的数字,然后要求浏览器通过js的运算得出这一串数字的和,再返回给服务器。爬虫遇到这种难关就无法翻越了。


解决方法:

PhantomJS是一个Python包,他可以在没有图形界面的情况下,完全模拟一个”浏览器“,js脚本验证什么的再也不是问题了。


四、通过robots.txt来限制爬虫:


世界最大的爬虫就是Google,每个搜索引擎本身就是一个超级大爬虫,Google的爬虫24小时不间断的爬取网上的新信息,并返回给数据库,但是这些搜索引擎的爬虫都遵守着一个协议:robots.txt


robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为一些系统中的URL是大小写敏感的,所以robots.txt的文件名应统一为小写。robots.txt应放置于网站的根目录下。如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的robots.txt,或者使用robots元数据(Metadata,又称元数据)。robots.txt协议并不是行业规范,只是约定俗成的‘规矩’,所以并不能保证网站的隐私。注意robots.txt是用字符串比较来确定是否获取URL,所以目录末尾有与没有斜杠“/”表示的是不同的URL。robots.txt允许使用类似"Disallow: *.gif"这样的通配符。robots.txt只是一个”君子协议“,遵守与否,都在于爬虫的编写者。


京东的'robots.txt'是这样的:

User-agent: *

Disallow: /?*

Disallow: /pop/*.html

Disallow: /pinpai/*.html?*

User-agent: EtaoSpider

Disallow: /

User-agent: HuihuiSpider

Disallow: /

User-agent: GwdangSpider

Disallow: /

User-agent: WochachaSpider

Disallow: /


京东的robots协议里指明四个”user-agent”是禁止访问的,这四个user-agent是四个恶性爬虫。


遵守网络上的君子之约,不要用爬虫做恶意的破坏,爬虫的获取网页的速度,和人类浏览网页是差不多的,这并不会给服务器造成太大的负担,在这种情况下, robots协议也可以不被遵守。


分享到:


相關文章: