文档章节

配置Nutch模拟浏览器以绕过反爬虫限制

杨尚川
 杨尚川
发布于 2014/03/15 08:18
字数 766
阅读 2667
收藏 21

当我们配置Nutch抓取 http://yangshangchuan.iteye.com 的时候,抓取的所有页面内容均为:您的访问请求被拒绝 ...... 这是最简单的反爬虫策略(该策略简单地读取HTTP请求头User-Agent的值来判断是人(浏览器)还是机器爬虫,我们只需要简单地配置Nutch来模拟浏览器(simulate web browser)就可以绕过这种限制。

 

nutch-default.xml中有5项配置是和User-Agent相关的:

 

<property>
  <name>http.agent.description</name>
  <value></value>
  <description>Further description of our bot- this text is used in
  the User-Agent header.  It appears in parenthesis after the agent name.
  </description>
</property>
<property>
  <name>http.agent.url</name>
  <value></value>
  <description>A URL to advertise in the User-Agent header.  This will 
   appear in parenthesis after the agent name. Custom dictates that this
   should be a URL of a page explaining the purpose and behavior of this
   crawler.
  </description>
</property>
<property>
  <name>http.agent.email</name>
  <value></value>
  <description>An email address to advertise in the HTTP 'From' request
   header and User-Agent header. A good practice is to mangle this
   address (e.g. 'info at example dot com') to avoid spamming.
  </description>
</property>
<property>
  <name>http.agent.name</name>
  <value></value>
  <description>HTTP 'User-Agent' request header. MUST NOT be empty - 
  please set this to a single word uniquely related to your organization.
  NOTE: You should also check other related properties:
	http.robots.agents
	http.agent.description
	http.agent.url
	http.agent.email
	http.agent.version
  and set their values appropriately.
  </description>
</property>
<property>
  <name>http.agent.version</name>
  <value>Nutch-1.7</value>
  <description>A version string to advertise in the User-Agent 
   header.</description>
</property>

 

在类nutch1.7/src/plugin/lib-http/src/java/org/apache/nutch/protocol/http/api/HttpBase.java中可以看到这5项配置是如何构成User-Agent的:

 

this.userAgent = getAgentString( conf.get("http.agent.name"), 
        conf.get("http.agent.version"), 
        conf.get("http.agent.description"), 
        conf.get("http.agent.url"), 
        conf.get("http.agent.email") );

 

  private static String getAgentString(String agentName,
                                       String agentVersion,
                                       String agentDesc,
                                       String agentURL,
                                       String agentEmail) {
    
    if ( (agentName == null) || (agentName.trim().length() == 0) ) {
      // TODO : NUTCH-258
      if (LOGGER.isErrorEnabled()) {
        LOGGER.error("No User-Agent string set (http.agent.name)!");
      }
    }
    
    StringBuffer buf= new StringBuffer();
    
    buf.append(agentName);
    if (agentVersion != null) {
      buf.append("/");
      buf.append(agentVersion);
    }
    if ( ((agentDesc != null) && (agentDesc.length() != 0))
    || ((agentEmail != null) && (agentEmail.length() != 0))
    || ((agentURL != null) && (agentURL.length() != 0)) ) {
      buf.append(" (");
      
      if ((agentDesc != null) && (agentDesc.length() != 0)) {
        buf.append(agentDesc);
        if ( (agentURL != null) || (agentEmail != null) )
          buf.append("; ");
      }
      
      if ((agentURL != null) && (agentURL.length() != 0)) {
        buf.append(agentURL);
        if (agentEmail != null)
          buf.append("; ");
      }
      
      if ((agentEmail != null) && (agentEmail.length() != 0))
        buf.append(agentEmail);
      
      buf.append(")");
    }
    return buf.toString();
  }

 

在类nutch1.7/src/plugin/protocol-http/src/java/org/apache/nutch/protocol/http/HttpResponse.java中使用User-Agent请求头,这里的http.getUserAgent()返回的userAgent就是HttpBase.java中的userAgent:

 

String userAgent = http.getUserAgent();
if ((userAgent == null) || (userAgent.length() == 0)) {
	if (Http.LOG.isErrorEnabled()) { Http.LOG.error("User-agent is not set!"); }
} else {
	reqStr.append("User-Agent: ");
	reqStr.append(userAgent);
	reqStr.append("\r\n");
}

 

通过上面的分析可知:在nutch-site.xml中只需要增加如下几种配置之一便可以模拟一个特定的浏览器(Imitating a specific browser)

 

1、模拟Firefox浏览器:

 

<property>
	<name>http.agent.name</name>
	<value>Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko</value>
</property>
<property>
	<name>http.agent.version</name>
	<value>20100101 Firefox/27.0</value>
</property>

 

2、模拟IE浏览器:

 

<property>
	<name>http.agent.name</name>
	<value>Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident</value>
</property>
<property>
	<name>http.agent.version</name>
	<value>6.0)</value>
</property>

 

3、模拟Chrome浏览器:

 

<property>
	<name>http.agent.name</name>
	<value>Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari</value>
</property>
<property>
	<name>http.agent.version</name>
	<value>537.36</value>
</property>

 

4、模拟Safari浏览器:

 

<property>
	<name>http.agent.name</name>
	<value>Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari</value>
</property>
<property>
	<name>http.agent.version</name>
	<value>534.57.2</value>
</property>

 

 

5、模拟Opera浏览器:

 

<property>
	<name>http.agent.name</name>
	<value>Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36 OPR</value>
</property>
<property>
	<name>http.agent.version</name>
	<value>19.0.1326.59</value>
</property>

 

 

后记:查看User-Agent的方法:

1、http://www.useragentstring.com

2、http://whatsmyuseragent.com

3、http://www.enhanceie.com/ua.aspx

 

NUTCH/HADOOP视频教程

© 著作权归作者所有

杨尚川

杨尚川

粉丝 1103
博文 220
码字总数 1624053
作品 12
东城
架构师
私信 提问
开发网络爬虫应该怎样选择爬虫框架?

有些人问,开发网络爬虫应该选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector还是其他的?这里按照我的经验随便扯淡一下: 上面说的爬虫,基本可以分3类: 1.分布式爬虫:Nutch 2.JAV...

Airship
2015/11/03
372
0
网络爬虫面临的挑战 之 链接构造

爬虫与反爬虫就好像是安全领域的破解与反破解一样,相互矛盾,相互克制,同时也相互促进。 网站的构建技术从简单的静态网站发展到动态网站,信息的传递从用户单向接收发展到双向交互,内容的...

杨尚川
2014/03/16
904
2
为你的爬虫添加 IP 池反反爬策略

最近发现自己之前爬的某个网站更换了新的网页设计,于是重写了爬虫,在测试的时候突然被封了 IP,虽然说一般网站都不是永久封 IP,但是等不了的我还是尝试用 IP 池来突破该网站的反爬。 而就...

fesoncn
03/28
0
0
Python爬虫之web内容获取(一)

Python爬虫之web内容获取: 一:简单的向服务器发送请求方式: # -- coding:utf-8 --import urllib2向指定的url 发送请求,并返回响应的类文件对象response = urllib2.urlopen("http://www....

zxszxs
2018/03/30
104
0
【爬虫】你需要的反反爬小妙招来啦~

1 前言 作为一名职业的爬虫工程师,每天面对的就是要和目标网站后方的反爬虫工程师斗智斗勇,似乎颇有一种攻城拔寨的感觉,在终于突破层层阻碍之后,“200 OK”将会到来。 在关于反反爬的第一...

Mocha_Lee
2017/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

yapi上传接口idea插件

YapiIdeaUploadPlugin 插件使用 目的 减少手动维护yapi接口文档的时间成本,通过idea插件快速提交接口文档到yapi; 保证接口文档的准确性,方便后台、前端、测试等查看接口文档; 反向规范代...

狂奔的熊二
6分钟前
5
0
最近学习到的Lambda表达式

前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 中秋去了躺上海,在外滩上打了个卡: 紧接着学了一下Java的函数式编程,给大家整理了...

Java3y
17分钟前
11
0
一条insert语句批量插入多条记录

-- 一条insert只能插入一条数据 insert into person (id, personCode, personName , telNumber)values(1,'5112403' , '张三' , '1378902134'); 一次插入多条数据的方法: 方式一: insert i......

葬-花
29分钟前
2
0
IT兄弟连 HTML5教程 HTML5的基本语法 简单HTML实例制作

现在学习HTML5的方式 目前HTML还处于HTML4与HTML5之间的过渡使用阶段。移动端的Web界面开发已经全面使用HTML5的技术,而在PC端由于用户升级浏览器周期较长,面临着页面的兼容性问题,以及开发...

老码农的一亩三分地
43分钟前
4
0
[Android] 【每日更新书源】「阅读」APP -100+ 精品书源一键导入!每天自动更新最新书源!

我特地写了个爬虫爬取书源,每天自动更新书源(URL是固定的)!大家也可以定期导入一下! 放心!导入时会自动去除重复书源的! 前段时间我发过一个书源大礼包的帖子,不过现在已经无法编辑修...

xiaogg
47分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部