对于CSDN博客文章不能爬取的问题
2012-08-03 10:43
225 查看
看过Robin的一篇文章,就是反爬虫的。他提到了几种反爬虫的方法:1.手工拒绝,即爬虫的并发量相当高,那么按照80端口进行并发排序,然后手动的把爬虫的IP给禁掉。2.根据User-Agent拒绝,比如如果我们用Java程序进行爬取时,如果没有设header的话,User-Agent就是java,那么就禁掉User-Agent不为浏览器那样的请求。3.根据流量统计和日志分析来屏蔽爬虫,封掉流量特别大的爬虫。4.实时屏蔽,即如果一个IP在一段时间内请求特别频繁,就为爬虫,加入黑名单,不再响应后续请求。
高并发的爬虫却是会对网站的服务器造成很大的压力,但是有时候我们需要从ITEYE或者CSDN上爬取一些东西时,也被拒绝掉了。(CSDN博客爬取时报403拒绝请求)
很明显,1,3,4,条对我们无效,因为我们的爬取不是高并发的频繁的;第2条,User-Agent的判别,才是封掉我们爬取的真正原因。那么,我们就只能加入头部,让自己的爬取像是一个浏览器请求的样子。那么浏览器请求时,发出的是怎样的数据包呢?
我们可以写个程序在10086端口监听一下(端口你自己随便取):
然后再在浏览器中输入:http://localhost:10086/ 我们就可以得到IE发送的信息:
GET / HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET CLR 1.1.4322; .NET4.0C)
Accept-Encoding: gzip, deflate
Host: localhost:10086
Connection: Keep-Alive
我们可以看到,只有我们把User-Agent设置好,就不会出现爬取被拒绝的问题了:
高并发的爬虫却是会对网站的服务器造成很大的压力,但是有时候我们需要从ITEYE或者CSDN上爬取一些东西时,也被拒绝掉了。(CSDN博客爬取时报403拒绝请求)
很明显,1,3,4,条对我们无效,因为我们的爬取不是高并发的频繁的;第2条,User-Agent的判别,才是封掉我们爬取的真正原因。那么,我们就只能加入头部,让自己的爬取像是一个浏览器请求的样子。那么浏览器请求时,发出的是怎样的数据包呢?
我们可以写个程序在10086端口监听一下(端口你自己随便取):
package com.JavaUtil.IESimilator; import java.io.*; import java.net.*; import java.util.*; public class IEHeaderTest { //在端口10086上监听,得到IE发送的数据包 public IEHeaderTest() { int port = 10086; ServerSocket serverSocket = null; Socket client = null; BufferedInputStream bis = null; try{ serverSocket = new ServerSocket(port); client = serverSocket.accept(); bis = new BufferedInputStream(client.getInputStream()); int index = -1; byte[] buffer = new byte[1024]; while((index=bis.read(buffer))!=-1){ System.out.println(new String(buffer,0,index)); } }catch(Exception ex){ ex.printStackTrace(); }finally{ if(bis!=null){ try { bis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(client!=null){ try { client.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(serverSocket!=null){ try { serverSocket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public static void main(String[] args) { IEHeaderTest headerTest = new IEHeaderTest(); } }
然后再在浏览器中输入:http://localhost:10086/ 我们就可以得到IE发送的信息:
GET / HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET CLR 1.1.4322; .NET4.0C)
Accept-Encoding: gzip, deflate
Host: localhost:10086
Connection: Keep-Alive
我们可以看到,只有我们把User-Agent设置好,就不会出现爬取被拒绝的问题了:
package com.JavaUtil.IESimilator; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.params.DefaultHttpParams; /* * author:Tammy Pi */ public class IESimilatorFetchCSDN { private HttpClient httpClient = new HttpClient(); private GetMethod getMethod = null; private BufferedReader bis = null; private String rtn = null; //get page public String getPage(String url){ StringBuilder sb = new StringBuilder(); getMethod = new GetMethod(url); //set http header List<Header> headers = new ArrayList<Header>(); headers.add(new Header("Accept"," image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*")); headers.add(new Header("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET CLR 1.1.4322; .NET4.0C)")); headers.add(new Header("Connection","Keep-Alive")); //设置Cookie,解决cookie reject问题 DefaultHttpParams.getDefaultParams().setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY); httpClient.getHostConfiguration().getParams().setParameter("http.default-headers",headers); try { //设置编码格式 int status = httpClient.executeMethod(getMethod); System.out.println("status:"+status); bis = new BufferedReader(new InputStreamReader(getMethod.getResponseBodyAsStream(),getMethod.getResponseCharSet())); String line = null; while((line=bis.readLine())!=null){ sb.append(line); } try { rtn = new String(sb.toString().getBytes(getMethod.getResponseCharSet()),"utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (HttpException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ if(getMethod!=null){ getMethod.releaseConnection(); } } return rtn; } public static void main(String[] args){ IESimilatorFetchCSDN similator = new IESimilatorFetchCSDN(); String rtn = similator.getPage("http://blog.csdn.net/hdhtqq/article/details/6088461"); System.out.println(rtn); } }
相关文章推荐
- 对于CSDN博客文章不能爬取的问题
- [小技巧] 解决CSDN博客 类别管理/文章分类 批量移动管理问题
- poj 2528 Mayor's posters(之前写的有BUG,CSDN博客那篇文章不能修改,现删掉重发)
- [小技巧] 解决CSDN博客 类别管理/文章分类 批量移动管理问题
- 第一篇csdn博客文章提交就出这个问题
- CSDN博客不能正常发布的问题
- CSDN博客:对于一个程序员,写程序就是实现功能,遇到具体问题,解决这个问题,并记录问题到CSDN上,从而有所提高和互相帮助。
- 解决CSDN博客 类别管理/文章分类 批量移动管理问题
- CSDN的第一篇博客发布时遇见的“选择文章类型”的问题
- 解决CSDN博客文章 保存网页到本地后,页面显示不全的问题
- 《本博客将搬至CSDN》 博客主QQ 654436731 有关于本博客任何文章的问题欢迎打扰
- 关于CSDN博客文章个数不更新的相关问题解答
- 由于csdn不能放广告,所以我主要还是在javaeye的博客上发文章,呵呵
- CSDN博客常见问题解决
- 在CSDN开通博客专栏后如何发布文章(图文)
- CSDN博客不能上传附件: 有效地促进了信息共享
- Tomcat7.0数据源的配置 (我原csdn博客上的文章)
- C#采集CSDN单个博客所有文章
- 在CSDN开通博客专栏后如何发布文章及改进建议(图文)
- 对于session.getAttribute("user");不能用问题的解决办法