爬虫代理服务器(如何爬取网页数据)

屏蔽爬虫是对资源网站的一种保护措施,最常用的反爬虫策略应该是基于用户的访问行为。比如每台服务器在一定时间内只能被访问x次。如果超过这个数量,就会被认为是爬虫访问

屏蔽爬虫是对资源网站的一种保护措施,最常用的反爬虫策略应该是基于用户的访问行为。比如每台服务器在一定时间内只能被访问x次。如果超过这个数量,就会被认为是爬虫访问。基于用户的访问行为判断是否为爬虫,不仅基于访问次数,还基于每个请求的用户代理请求头、每次访问的间隔时间等。一般来说是由很多因素决定的,其中访问次数是主要的。

反爬虫是各资源网站自我保护的措施,旨在保护资源不被爬虫程序占用。比如我们之前用的Douban.com,会根据用户的访问行为屏蔽掉爬虫程序。每个IP达到一定的每分钟访问次数后,后面一段时间内的请求会直接返回403错误,认为你没有访问页面的权限。所以今天,让我们再次以Douban.com为例。我们用程序模拟了这种现象。下面是我写的一个收集豆瓣电影的程序。

/* * *收藏豆瓣电影*/公共类爬虫电影{ public static void main(string[]args){ try { crawler movie crawler movie = new crawler movie();//豆瓣电影链接列表< String & gtmovies = crawler movie . movie list();//创建10个线程的线程池,executorserviceexec = executors . newfixedthreadpool(10);for(String URL:movies){//thread exec . execute(new crawlmoviethread(URL));}//线程关闭exec . shut down();} catch(Exception e){ e . printstacktrace();}}/* * *豆瓣电影列表链接*采用逆向分析法* * @ return */public list < String & gt;MovieList()抛出异常{//获取100个电影链接String URL = " https://movie . douban . com/j/search _ subjects?类型=电影& amp标签=热门&排序=推荐& amppage_limit=200。page _ start = 0 ";closeable http client client = http clients . create default();列表& lt字符串& gtmovies = new ArrayList & lt& gt(100);try { http get http get = new http get(URL);CloseableHttpResponse response = client . execute(http get);System.out.println("获取豆瓣电影列表,返回验证码:"+response.getstatusline()。getstatuscode());if (response.getStatusLine()。getStatusCode()= = 200){ HttpEntity entity = response . getentity();string body = entity utils . tostring(entity," utf-8 ");//将请求结果格式化为JSON JSON Object JSON Object = JSON . parse Object(body);JSON array data = JSON object . getjson array(" subjects ");for(int I = 0;我& ltdata . size();i++){ JSON object movie = data . getjson object(I);movies . add(movie . getstring(" URL "));} } response . close();} catch(Exception e){ e . printstacktrace();}最后{ client . close();}还电影;}}/* * *捕获豆瓣电影线程*/classcrawlmoviethread扩展线程{//链接要捕获的字符串urlpublic CrawlMovieThread(字符串URL){ this . URL = URL;} public void run(){ try { Connection Connection = jsoup . connect(URL)。方法(连接。方法. GET)。超时(50000);联系。Response Response = connection . execute();System.out.println("收集豆瓣电影并返回状态码:"+response . status code());} Catch(exception one){ system . out . println(" Catch豆瓣电影,Catch a exception:"+e . getmessage()));}}}这个程序的逻辑比较简单。一、收集豆瓣热门电影。这里使用直接访问Ajax获取豆瓣热门电影的链接,然后解析电影的详情页链接,多线程访问详情页链接,因为豆瓣的访问需求只有多线程才能满足。豆瓣热门电影页面如下:

爬虫代理服务器(如何爬取网页数据)插图

多次运行上述程序,最终会得到如下图所示的结果。

爬虫代理服务器(如何爬取网页数据)插图(1)

从上图我们可以看到httpclient访问返回的状态码是403,也就是说我们没有权限访问这个页面,也就是说Douban.com已经认为我们是爬虫,拒绝了我们的访问请求。让我们分析一下我们当前的访问架构。因为我们直接访问Douban.com,所以此时的访问体系结构如下图所示:

爬虫代理服务器(如何爬取网页数据)插图(2)

如果我们想突破这个限制,我们不能直接访问Douban.com的服务器。我们需要引入第三方,让别人代替我们访问。每次拜访都找不同的人,这样就不会被限制了。这也称为IP代理。此时,的访问架构如下图所示:

爬虫代理服务器(如何爬取网页数据)插图(3)

我们使用的IP代理需要一个IP代理池。接下来,我们来谈谈IP代理池。

IP代理池

做服务器这部分的厂商很多,我就不说细节了。我自己可以找到很多百度IP代理。这些IP代理都提供付费和免费的代理IP。付费代理IP具有高可用性和高速度。如果在线环境下需要使用代理,建议使用付费代理IP。如果只做自己的研究,可以收集这些厂商的免费公共代理IP。这些IP的性能和可用性差,但不影响我们使用。

因为我们是一个演示项目,所以我们建立了自己的IP代理池。我们如何设计一个IP代理池?下图是我画的一个简单的IP代理池架构图。

爬虫代理服务器(如何爬取网页数据)插图(4)

从上面的架构图可以看出,一个IP代理系统会涉及到四个模块,分别是IP获取模块、IP存储模块、IP检测模块和API接口模块。

IP 采集模块

负责从主要的IP代理供应商收集代理IP。收集的网站越多,代理IP的可用性越高。

IP 存储模块

收集的代理IP通常在Redis等高性能数据库中使用。在存储方面,我们需要存储两种数据,一种是检测可用的代理IP,另一种是收集未检测到的代理IP。

IP 检测模块

检查收集的IP是否可用,可以让我们提供的IP更可用。我们先过滤掉不可用的IP。

API 接口模块

以接口的形式向外界提供可用的代理IP

以上是关于IP代理池的相关设计。我们只需要简单了解一下,因为现在我们基本上没有必要编写IP代理池服务。GitHub上已经有很多优秀的开源项目了,没必要重复造轮子。我在GitHub上选择了8K star的开源IP代理池项目proxy_pool,我们将它作为我们的IP代理池。关于proxy_pool,请访问:https://github.com/jhao104/proxy_pool

部署代理池

Proxy_pool是用python语言写的,不过没关系,因为现在已经可以在容器中部署了。使用容器化部署可以屏蔽某些环境的安装。只需要运行镜像就可以运行服务,不需要知道里面的具体实现,所以这个项目中不懂Python的Java程序员也可以使用。Proxy_pool使用Redis存储收集的IP,所以在启动proxy_pool之前需要启动Redis服务。下面是proxy_pool docker启动步骤。

拉取镜像

docker pull jhao104/proxy_pool

运行镜像

docker run-env db _ type = REDIS-env db _ host = 127 . 0 . 0 . 1-env db _ port = 6379-env db _ password = pwd _ str-p 5010:5010 jhao 104/proxy _ pool

运行镜像后,我们等待一段时间,因为第一次启动采集数据和处理数据需要一段时间。等待之后访问 http://{your_host}:5010/get_all/,如果你得到下图所示的结果,说明 proxy_pool 项目你已经部署成功。

爬虫代理服务器(如何爬取网页数据)插图(5)

使用IP代理

设置好IP代理池后,我们就可以用代理IP收藏豆瓣电影了。我们已经知道,除了IP之外,用户代理请求头会是豆瓣判断访问是否为爬虫的一个因素,所以我们也伪造了用户代理请求头,我们对每次访问使用不同的用户代理请求头。

我们为豆瓣电影采集程序引入IP代理和随机用户代理请求头,具体代码如下:

类crawler移动代理{/* * *常用用户代理列表*/static list < String & gt;USER _ AGENT = new ArrayList & lt字符串& gt(10){ { add(" Mozilla/5.0(Linux;安卓4 . 1 . 1;nexus 7 Build/jro 03d)apple WebKit/535.19(KHTML,像壁虎)Chrome/18 . 0 . 1025 . 166 Safari/535.19”);添加(" Mozilla/5.0(Linux;u;安卓4 . 0 . 4;en-GB;GT-I 9300 Build/IMM 76d)apple WebKit/534.30(KHTML,像壁虎一样)版本/4.0 Mobile Safari/534.30”);添加(" Mozilla/5.0(Linux;u;安卓2.2;en-GB;GT-p 1000 Build/FROYO)apple WebKit/533.1(KHTML,像壁虎一样)版本/4.0 Mobile Safari/533.1”);添加(" Mozilla/5.0(Windows NT 6.2;WOW64rv:21.0)壁虎/20100101火狐/21.0”);添加(" Mozilla/5.0(安卓;移动;rv:14.0)壁虎/14.0火狐/14.0”);添加(" Mozilla/5.0(Windows NT 6.2;WOW64) AppleWebKit/537.36 (KHTML,像壁虎)Chrome/27 . 0 . 1453 . 94 Safari/537.36”);添加(" Mozilla/5.0(Linux;安卓4 . 0 . 4;galaxy Nexus Build/IMM 76 b)apple WebKit/535.19(KHTML,像壁虎一样)Chrome/18 . 0 . 1025 . 133 Mobile Safari/535.19”);add(" Mozilla/5.0(iPad;CPU OS 5_0像Mac OS X)apple WebKit/534.46(KHTML像壁虎)版本/5.1 Mobile/9a 334 Safari/7534 . 48 . 3”);add(" Mozilla/5.0(iPod;u;像Mac OS X这样的CPUen) AppleWebKit/420.1 (KHTML,像壁虎一样)版本/3.0 Mobile/3a 101 a Safari/419.3”);} };/* * *随机获取用户代理* * @ return */PublicString随机用户代理(){ Random Random = new Random();int num = random . nextint(USER _ agent . size());返回USER _ agent . get(num);}/* * *设置代理ip池* * @ param queue queue * @ throwsioexception */public void代理ippool (linkedblockingqueue

爬虫代理服务器(如何爬取网页数据)插图(6)

结果我们在40次访问电影详情页的过程中可以看到大量代理IP无效,只有少部分代理IP有效。结果直接证明免费代理IP的可用性不高,所以如果需要在线使用代理IP,最好使用付费代理IP。虽然我们自己的IP代理池的可用性不是太高,但是我们设置的IP代理已经成功访问豆瓣电影,并且使用IP代理成功绕过了Douban.com的限制。

爬虫服务器被封锁的原因有很多。本文主要介绍如何通过设置IP代理和伪造用户代理的请求头来绕过Douban.com的访问限制。如何让我们的程序不被资源网站当成爬虫?以下三点需要做好:

伪造 User Agent 请求头使用 IP 代理不固定的采集间隔时间

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/114608.html

发表回复

登录后才能评论