有哪些屡试不爽的反反爬技巧_学习

 

随着大数据的火热,谁能第一时间掌握数据就等于掌握了先机,网页数据成了大家争相掠夺的资源,大量的网页抓取工具(爬虫)蜂拥而来。网站运营者则需要反爬虫系统来保护自己的数据资源,以达到系统稳定性保障、竞争优势保持的目的。爬虫与反爬虫,这相爱相杀的一对,简直可以写出一部壮观的斗争史。爬虫与反爬虫斗争史第一回合:

 

逗汁儿对某个网站的内容很感兴趣,于是想要写一个爬虫把信息全部抓取下来。然后逗汁写了一个标准的python爬虫,不断地遍历某站的信息列表页面,根据 Html 分析内容存进自己的数据库。网站运维X监控发现某个时段访问量陡增,ip相同,user-agent都是python,判断为非人类行为,封杀。第二回合:

爬虫爬到一半就停了,这可不行,这批信息我势在必得啊,于是逗汁儿针对性的变换了一下策略:

1)user-agent 模拟firefox,获取ip代理;

2)每爬半个小时就换一个IP代理。

运维X发现了ip变化,直接要求登陆才能访问。第三回合:逗汁儿:注册账号,每次请求带cookie或者token,还多注册了几个账号联合爬取。运维X:加剧ip访问频率限制。第四回合:逗汁儿:模拟人的请求,限制请求速度。运维X:弹出验证码进行识别。第五回合:逗汁儿:通过学习图像识别(关键词PIL,tesseract),再对验证码进行了二值化,分词,模式训练之后识别了网站验证码。运维X:增加动态网站,数据通过js动态加载,增加网络分析复杂度。第六回合:逗汁儿:通过selenium和phantomjs完全模拟浏览器操作。运维X:成本太高!放弃,猝......有哪些屡试不爽的反反爬技巧_学习_02爬虫和反爬虫作为相生相克的死对头,无论爬虫多厉害,都能被复杂的反爬虫机制发现,同样的,无论反爬虫机制多么缜密,都能被高级的网络爬虫所攻破,而胜负的关键就看双方的资源投入多少。为什么反爬虫?为了更好的理解爬虫和反爬虫,我们来看一些定义:爬虫:使用任何技术手段,批量获取网站信息的一种方式。关键在于批量。反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。关键也在于批量。误伤:在反爬虫的过程中,错误的将普通用户识别为爬虫。误伤率高的反爬虫策略,效果再好也不能用。拦截:成功地阻止爬虫访问。这里会有拦截率的概念。通常来说,拦截率越高的反爬虫策略,误伤的可能性就越高。因此需要做个权衡。资源:机器成本与人力成本的总和。关于网站为什么反爬虫以及反什么样的爬虫,我们可以看看携程酒店技术部总结的关于反爬虫的心得体会。对于公司来说,为什么反爬虫?·爬虫占总PV比例较高。有大量的硕士在写论文的时候会选择爬取OTA数据,并进行舆情分析。因为五月份交论文,到了三月份了,来不及了,赶紧抓数据,四月份分析一下,五月份交论文。·公司可免费查询的资源被批量抓走,丧失竞争力。OTA的价格可以在非登录状态下直接被查询,这个是底线。如果强制登陆,那么可以通过封杀账号的方式让对方付出代价,这也是很多网站的做法。但是我们不能强制对方登录。那么如果没有反爬虫,对方就可以批量复制我们的信息,我们的竞争力就会大大减少。·爬虫是否涉嫌违法?爬虫在国内还是擦边球,还是需要用技术手段来做最后的保障。反什么样的爬虫?·十分低级的应届毕业生应届毕业生的爬虫通常简单粗暴,根本不管服务器压力,加上人数不可预测,很容易把站点弄挂。·十分低级的创业小公司不计其数的小爬虫,出于公司生死存亡的考虑,不断爬取数据。·不小心写错了没人去停止的失控小爬虫托管在某些服务器上的小爬虫,已经无人认领了,依然在辛勤地工作着。·成型的商业对手商业对手有钱、有技术,如果和你死磕,你就只能硬着头皮和他死磕。·抽风的搜索引擎
搜索引擎有时也会抽风,可能导致服务器性能下降,请求量跟网络攻击没什么区别。也就是说,其实公司反爬虫的对象,都是一些会给网站本身带来困扰甚至伤害的爬虫,在爬虫与反爬虫的战役当中,最后获胜的一定是爬虫,因为网站不可能不要用户查询。换言之,只要你的爬虫足够规范,尽可能的模拟正常用户行为,在不影响网站正常运作的情况下爬取信息,网站根本不会花大力气与你死磕。反反爬技巧网络爬虫一般通过设置HTTP请求头信息的字段来模拟正常浏览器访问网站。 所以,通常网络管理员会通过检查头信息中的User Agent字段、分析access_log统计访问,根据IP、请求时间、频率、访问的路径来确认黑名单。一般网站从三个方面反爬虫,请求网站访问时的请求头Headers,用户行为,目标网站的目录和数据加载方式。

 

前两个方面可以说是反爬虫策略中最为常见的,而第三个则是应用ajax(异步加载)的方式加载页面目录或者内容,增大爬虫在对目标网站形成访问之后获取数据的难度。反反爬的主要思路就是:尽可能的去模拟浏览器,浏览器在如何操作,代码中就如何去实现。1.Headers限制

 

这应该是最常见的,最基本的反爬虫手段,主要是初步判断你是否是真实的浏览器在操作。

 

遇到这类反爬机制,可以直接在自己写的爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中。

以edge浏览器为例,浏览器中打开页面;

第一步:点击上图中“网络”标签,然后刷新或载入页面

第二步:在右侧“标头”下方的“请求标头”中的所有信息都是headers内容,添加到请求中即可。

 

有哪些屡试不爽的反反爬技巧_学习_03代码示例如下:headers = {'Accept': 'image/png, image/svg+xml, image/*; q=0.8, */*; q=0.5',
               'Accept - Encoding':'gzip, deflate, br',
               'Accept-Language':'zh-Hans-CN, zh-Hans; q=0.5',
               'Connection':'Keep-Alive',
               'Host':'pb.sogou.com',
               'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'}值得注意的是,很多网站只需要userAgent信息就可以通过,但是有的网站还需要验证一些其他的信息,比如知乎,有一些页面还需要 authorization 的信息。所以需要加哪些Headers,还需要尝试,可能还需要Referer、Accept-encoding等信息。2.IP限制

 

限制IP也是很多网站反爬虫的初衷,有些人随便写一个循环,就开始暴力爬取 ,确实会给网站服务器带来很大的负担。而这种频繁的访问,显然也不会是真实用户行为,索性果断把你封掉。

 

这种情况,你可以遵守规则,把你爬取的速度变慢,每次爬取停个几秒就行了。如果爬取的数据量不大,其实也浪费不了多少时间,反正你也可以利用这段时间做做其他事情,或者好好思考一下人生。

 

time.sleep(5)

 

当然,你也可以通过不断换IP的形式来绕过这种限制,网上很多免费的IP资源,你可以自己搭一个IP池,爬到一定的量就切换IP。3.动态加载

 

通过异步加载,一方面是为了反爬虫,一方面也可以给网页浏览带来不同的体验,实现更多的功能。很多动态网站都是通过ajax或者JavaScript来加载请求的网页。

 

在遇到动态加载的网页的时候就需要去分析ajax请求,一般情况都能直接找到包含我们想要数据的json文件。有哪些屡试不爽的反反爬技巧_学习_04如果网站给文件加密,那么可以通过selenium+phantomJS框架,调用浏览器内核,并利用phantomJS执行js来模拟人为操作以及触发页面中的js脚本。理论上selenium是比较全能的爬虫方案,因为这个确实算是真实的用户行为。除非网站的反爬虫严苛到宁愿误杀的地步。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import re
from pyquery import PyQuery as pq

browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
#进入淘宝网,输入鸡蛋,返回页面
def search():
    try:
        browser.get('https://www.taobao.com')
        input =wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#q"))
        submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#J_TSearchForm > div.search-button > button")))
        input.send_keys('鸡蛋')
        submit.click()
        total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total")))
        get_products()
        return total.text
    except TimeoutException:
        return search()

 

 

 

4.验证码

 

我们在很多网站会遇到,如果请求量大了之后就会遇到验证码的情况。最让人诟病的12306,其实也是一定程度上的防止非正当请求的产生。

 

对于验证码,可以通过OCR来识别图片,Github上面有很多大神分享的代码可以用,可以去看看。简单的OCR识别验证码:

from PIL import Image
import tesserocr
#tesserocr识别图片的2种方法
img = Image.open("code.jpg")
verify_code1 = tesserocr.image_to_text(img)
#print(verify_code1)
verify_code2 = tesserocr.file_to_text("code.jpg")
#print(verify_code2)

 

 

5.减少返回的信息

 

最基本的隐藏真实的数据量,只有不断加载才能刷新信息。还有的就更变态,会只给你展示一部分信息,人都看不到,爬虫也无能为力。比如CNKI,你每次搜索能够得到的内容就是非常有限的。这个貌似没有很好的解决办法,但是这么干的网站毕竟是少数,因为这种方式,其实在某种程度上是牺牲了一部分真实用户的体验。

 

 

6.返回伪造的信息

 

这个真的是程序员何苦为难程序员。反爬虫的工程师也是煞费苦心,一方面是不让真实的数据被大规模爬取,另一方面也给你后期的数据处理增加负担。如果数据伪造的好,可能你真的不容易发现自己爬的是假数据,当然只能依靠你后期去清洗这些数据了。常见的反爬及反爬应对措施大概就是如此了,结论的东西可以在大家在遇到问题的时候带来一些思路和参考。爬虫作为一门技术,意味着在真实技术场景下会发生许多变化,需要学习者在实践中去探索这些技巧并加以掌握。有哪些屡试不爽的反反爬技巧_学习_05

- DataCastle -

 

有哪些屡试不爽的反反爬技巧_学习_06