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

原文链接:http://yangshangchuan.iteye.com/blog/2030741

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

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

Xml代码  

  1. <property>
  2. <name>http.agent.description</name>
  3. <value></value>
  4. <description>Further description of our bot- this text is used in
  5. the User-Agent header.  It appears in parenthesis after the agent name.
  6. </description>
  7. </property>
  8. <property>
  9. <name>http.agent.url</name>
  10. <value></value>
  11. <description>A URL to advertise in the User-Agent header.  This will
  12. appear in parenthesis after the agent name. Custom dictates that this
  13. should be a URL of a page explaining the purpose and behavior of this
  14. crawler.
  15. </description>
  16. </property>
  17. <property>
  18. <name>http.agent.email</name>
  19. <value></value>
  20. <description>An email address to advertise in the HTTP ‘From‘ request
  21. header and User-Agent header. A good practice is to mangle this
  22. address (e.g. ‘info at example dot com‘) to avoid spamming.
  23. </description>
  24. </property>
  25. <property>
  26. <name>http.agent.name</name>
  27. <value></value>
  28. <description>HTTP ‘User-Agent‘ request header. MUST NOT be empty -
  29. please set this to a single word uniquely related to your organization.
  30. NOTE: You should also check other related properties:
  31. http.robots.agents
  32. http.agent.description
  33. http.agent.url
  34. http.agent.email
  35. http.agent.version
  36. and set their values appropriately.
  37. </description>
  38. </property>
  39. <property>
  40. <name>http.agent.version</name>
  41. <value>Nutch-1.7</value>
  42. <description>A version string to advertise in the User-Agent
  43. header.</description>
  44. </property>
<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的:

Java代码  

  1. this.userAgent = getAgentString( conf.get("http.agent.name"),
  2. conf.get("http.agent.version"),
  3. conf.get("http.agent.description"),
  4. conf.get("http.agent.url"),
  5. conf.get("http.agent.email") );
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") );

Java代码  

  1. private static String getAgentString(String agentName,
  2. String agentVersion,
  3. String agentDesc,
  4. String agentURL,
  5. String agentEmail) {
  6. if ( (agentName == null) || (agentName.trim().length() == 0) ) {
  7. // TODO : NUTCH-258
  8. if (LOGGER.isErrorEnabled()) {
  9. LOGGER.error("No User-Agent string set (http.agent.name)!");
  10. }
  11. }
  12. StringBuffer buf= new StringBuffer();
  13. buf.append(agentName);
  14. if (agentVersion != null) {
  15. buf.append("/");
  16. buf.append(agentVersion);
  17. }
  18. if ( ((agentDesc != null) && (agentDesc.length() != 0))
  19. || ((agentEmail != null) && (agentEmail.length() != 0))
  20. || ((agentURL != null) && (agentURL.length() != 0)) ) {
  21. buf.append(" (");
  22. if ((agentDesc != null) && (agentDesc.length() != 0)) {
  23. buf.append(agentDesc);
  24. if ( (agentURL != null) || (agentEmail != null) )
  25. buf.append("; ");
  26. }
  27. if ((agentURL != null) && (agentURL.length() != 0)) {
  28. buf.append(agentURL);
  29. if (agentEmail != null)
  30. buf.append("; ");
  31. }
  32. if ((agentEmail != null) && (agentEmail.length() != 0))
  33. buf.append(agentEmail);
  34. buf.append(")");
  35. }
  36. return buf.toString();
  37. }
  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:

Java代码  

  1. String userAgent = http.getUserAgent();
  2. if ((userAgent == null) || (userAgent.length() == 0)) {
  3. if (Http.LOG.isErrorEnabled()) { Http.LOG.error("User-agent is not set!"); }
  4. } else {
  5. reqStr.append("User-Agent: ");
  6. reqStr.append(userAgent);
  7. reqStr.append("\r\n");
  8. }
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浏览器:

Xml代码  

  1. <property>
  2. <name>http.agent.name</name>
  3. <value>Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko</value>
  4. </property>
  5. <property>
  6. <name>http.agent.version</name>
  7. <value>20100101 Firefox/27.0</value>
  8. </property>
<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浏览器:

Xml代码  

  1. <property>
  2. <name>http.agent.name</name>
  3. <value>Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident</value>
  4. </property>
  5. <property>
  6. <name>http.agent.version</name>
  7. <value>6.0)</value>
  8. </property>
<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浏览器:

Xml代码  

  1. <property>
  2. <name>http.agent.name</name>
  3. <value>Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari</value>
  4. </property>
  5. <property>
  6. <name>http.agent.version</name>
  7. <value>537.36</value>
  8. </property>
<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浏览器:

Xml代码  

  1. <property>
  2. <name>http.agent.name</name>
  3. <value>Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari</value>
  4. </property>
  5. <property>
  6. <name>http.agent.version</name>
  7. <value>534.57.2</value>
  8. </property>
<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浏览器:

Xml代码  

  1. <property>
  2. <name>http.agent.name</name>
  3. <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>
  4. </property>
  5. <property>
  6. <name>http.agent.version</name>
  7. <value>19.0.1326.59</value>
  8. </property>
<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视频教程

时间: 2024-11-08 04:36:11

配置Nutch模拟浏览器以绕过反爬虫限制的相关文章

Python冒充其他浏览器抓取猫眼电影数据(绕过反爬虫)

原文地址:http://blog.51cto.com/2290153/2127855

网站常见的反爬虫和应对方法

这几天在爬一个网站,网站做了很多反爬虫工作,爬起来有些艰难,花了一些时间才绕过反爬虫.在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下. 从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分.这里我们只讨论数据采集部分. 一般网站从三个方面反爬虫:用户请求的Headers,用户行为,网站目录和数据加载方式.前两种比较容易遇到,大多数网站都从这些角度来反爬虫.第三种一些应用ajax的网站会采用,这样增大了爬取的难度. 通过Headers反爬虫  从用户请求的Headers反爬虫是最常

常见的反爬虫和应对方法

0x01 常见的反爬虫 这几天在爬一个网站,网站做了很多反爬虫工作,爬起来有些艰难,花了一些时间才绕过反爬虫.在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下. 从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分.这里我们只讨论数据采集部分. 一般网站从三个方面反爬虫:用户请求的Headers,用户行为,网站目录和数据加载方式.前两种比较容易遇到,大多数网站都从这些角度来反爬虫.第三种一些应用ajax的网站会采用,这样增大了爬取的难度. 0x02 通过Headers反爬虫 从用户

网站常见的反爬虫和应对方法(转)

在我们的对2016年大数据行业的预测文章<2016年大数据将走下神坛拥抱生活 资本青睐创业机会多>里,我们曾经提到“在2016年,防止网站数据爬取将变成一种生意.”.今天我找到了来自”BSDR“的一篇文章,文章里主要介绍了常见的反爬虫应对方法,下面是正文. 常见的反爬虫 这几天在爬一个网站,网站做了很多反爬虫工作,爬起来有些艰难,花了一些时间才绕过反爬虫.在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下. 从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分.这里我们只讨论数据采

【转载】网站常见的反爬虫和应对方法

http://www.36dsj.com/archives/40809 在我们的对2016年大数据行业的预测文章<2016年大数据将走下神坛拥抱生活 资本青睐创业机会多>里,我们曾经提到“在2016年,防止网站数据爬取将变成一种生意.”.今天我找到了来自”BSDR“的一篇文章,文章里主要介绍了常见的反爬虫应对方法,下面是正文. 常见的反爬虫 这几天在爬一个网站,网站做了很多反爬虫工作,爬起来有些艰难,花了一些时间才绕过反爬虫.在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下. 从功

反-反爬虫:用几行代码写出和人类一样的动态爬虫

欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:李大伟 Phantomjs简介 什么是Phantomjs Phantomjs官网介绍是:不需要浏览器的完整web协议栈(Full web stack No browser required),也就是常说的无头浏览器--或者好听点叫做:无界面的web解析器. Phantomjs的特点 由于"无头"--免去了渲染可视化的网页界面,她的速度要比一般的浏览器快不少,又因为她是完整的web协议栈,所以不仅仅提供了JavaScri

(转)常见的反爬虫和应对方法

0x01 常见的反爬虫 这几天在爬一个网站,网站做了很多反爬虫工作,爬起来有些艰难,花了一些时间才绕过反爬虫.在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下. 从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分.这里我们只讨论数据采集部分. 一般网站从三个方面反爬虫:用户请求的Headers,用户行为,网站目录和数据加载方式.前两种比较容易遇到,大多数网站都从这些角度来反爬虫.第三种一些应用ajax的网站会采用,这样增大了爬取的难度. 0x02 通过Headers反爬虫 从用户

第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

第三百三十三节,web爬虫讲解2-Scrapy框架爬虫-Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于start_urls,start_requests()返回的请求会替代start_urls里的请求 Request()get请求,可以设置,url.cookie.回调函数 FormRequest.from_response()表单post提交,第一个必须参数,上一次响应cookie的response对象,其

爬虫实例——爬取煎蛋网OOXX频道(反反爬虫——伪装成浏览器)

煎蛋网在反爬虫方面做了不少工作,无法通过正常的方式爬取,比如用下面这段代码爬取无法得到我们想要的源代码. import requests url = 'http://jandan.net/ooxx' print requests.get(url).text 执行上述代码,你得到的结果应该跟我一样: 煎蛋网应该是通过检测headers来判断是否爬虫,要想获取正常的源代码,需要伪装成浏览器. # -*- coding: utf-8 -*- import re import requests from