怎样将爬虫伪装像浏览器

大黑山唐僧 2014-03-26 10:38:19
小弟写了爬虫爬豆了个瓣的网页数据(不用登录),不一会儿就403错误了。

蛋四!通过浏览器还能正常访问!而且浏览器多刷新几次都没问题,爬虫程序是连一次请求都无法获取。

因此我得出结论:我的爬虫too young too simple,和正常浏览器行为不一样。

我想请问,怎样伪装爬虫,使它像一个浏览器,不被服务器封呢?(我知道有请求频率限制,暂时不考虑这点,肯定还有其他)

我上网查了部分资料,说需要加头部。我用chrome浏览器抓到了头部的信息(应该是吧?):

然后这是我的程序:
public String loadPage(String url)
{
String data = null;
System.out.println("Requesting: " + url);
try {
HttpGet httpget = new HttpGet(url);
httpget.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
httpget.setHeader("Accept-Encoding", "gzip,deflate,sdch");
httpget.setHeader("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6");
httpget.setHeader("Cache-Control", "max-age=0");
httpget.setHeader("Connection", "keep-alive");
httpget.setHeader("Host", "movie.douban.com");
httpget.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
HttpResponse response = httpClient.execute(httpget);
System.out.println(response.getStatusLine());
data = EntityUtils.toString(response.getEntity());
// httpget.releaseConnection();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return data;
}


结果还是403。

见过论坛一个旧帖:
http://bbs.csdn.net/topics/360161423
发现他也没有解决,最后用的是代理IP。但我用代理实在是太慢了。况且理论上讲,把爬虫伪装好,应该能像浏览器一样成功访问吧?

请各位大神指点迷津。。。
...全文
5219 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
HFUT_qianyang 2016-10-11
  • 打赏
  • 举报
回复
我写了一系列有关java爬虫的博客
  • 打赏
  • 举报
回复
phantomjs+selenium
程序员向西 2014-07-09
  • 打赏
  • 举报
回复
可以考虑在本地存一份cookie,每次new client时设置cookie; 我抓豆瓣的数据几年了,都没有这种问题;最多是访问太频繁导致出现验证码!
endless_hbyou 2014-04-29
  • 打赏
  • 举报
回复
请问一下我网页返回429是个什么情况,我有延迟访问频率的啊
大黑山唐僧 2014-04-14
  • 打赏
  • 举报
回复
引用 20 楼 zjz_52 的回复:
求代码,可不可以把cookie设置的那块和频率设置的代码让我看看啊,小妹也正在发愁这个问题
一句“小妹”都不忍心不帮你 我没有设置cookie。。。或者应该说我没考虑这点,不知道有没有用到cookie。 我在学校代码跑的基本没什么问题,跑了两个周跑完一个子任务,手动重启了一两次,但分配给其他学校甚至工作了的同学跑的任务,经常出错,主要是Unknown host错误,不知道为什么。。 具体细节可以通过QQ啥的在线聊吧,可以私信告诉我(无耻变相索要联系方式。。。),CSDN我上的不是很频繁,说起来费劲,呵呵
zjz_52 2014-04-12
  • 打赏
  • 举报
回复
设置两秒间隔不会太慢了吗,一分钟几个页面
zjz_52 2014-04-11
  • 打赏
  • 举报
回复
求代码,可不可以把cookie设置的那块和频率设置的代码让我看看啊,小妹也正在发愁这个问题
大黑山唐僧 2014-04-07
  • 打赏
  • 举报
回复
引用 18 楼 tiantianan 的回复:
应该每次都带上cookie,第一次请求之后,获取cookie,每次请求都带上
酱紫。。我的httpclient是全局的,还以为HttpClient会默认自动处理Cookies的事情。。 目前爬了一个周了,设置了至少每2秒间隔请求一次,效果还不错,没有被封
tiantianan 2014-04-02
  • 打赏
  • 举报
回复
应该每次都带上cookie,第一次请求之后,获取cookie,每次请求都带上
大黑山唐僧 2014-04-01
  • 打赏
  • 举报
回复
引用 12 楼 icesharp 的回复:
请求完后使用httpGet.abort()断开连接,也许是因为你没断开,导致维持了许多连接,然后被封了 httpget.releaseConnection()会清理session,一般不用,或者在最后用。
恩,很有道理~ 我确实没有关,我再试试 不过小弟还有个疑问,如果你说的是对的,怎么解释爬虫程序重启仍然403错误(程序重启就会释放连接了吧),然后浏览器仍能访问?服务器是怎么识别出来的呢?
icesharp 2014-04-01
  • 打赏
  • 举报
回复
引用 15 楼 swb0802 的回复:
[quote=引用 14 楼 icesharp 的回复:] [quote=引用 13 楼 swb0802 的回复:] [quote=引用 12 楼 icesharp 的回复:] 请求完后使用httpGet.abort()断开连接,也许是因为你没断开,导致维持了许多连接,然后被封了 httpget.releaseConnection()会清理session,一般不用,或者在最后用。
恩,很有道理~ 我确实没有关,我再试试 不过小弟还有个疑问,如果你说的是对的,怎么解释爬虫程序重启仍然403错误(程序重启就会释放连接了吧),然后浏览器仍能访问?服务器是怎么识别出来的呢?[/quote] 这个确实不知道了。。。你现在是多长时间抓一次?网上看1秒多抓一次才比较保险。 你重启是指重启tomcat吗?如果是的话,按理说确实连接会重置,可能还是你爬的太快了。 借鉴下这个帖子吧http://www.zhihu.com/topic/19857338/newest[/quote] 访问频率我没有设限制,看网速,有快有慢,大部分不会超过一秒钟两次。看来我还是设置一下频率吧。 我用的是HttpClient包,没有tomcat服务器。目前正在一步步完善,多谢你的帮助~ 我刚也查到了HttpClient tutorial文档,还是有些收获的,回赠给你哈~ http://hc.apache.org/httpcomponents-client-4.3.x/tutorial/pdf/httpclient-tutorial.pdf[/quote] 豆瓣有时候发帖稍微快点都会403,你这1秒两次,果断一上来就完蛋- -!
大黑山唐僧 2014-04-01
  • 打赏
  • 举报
回复
引用 14 楼 icesharp 的回复:
[quote=引用 13 楼 swb0802 的回复:] [quote=引用 12 楼 icesharp 的回复:] 请求完后使用httpGet.abort()断开连接,也许是因为你没断开,导致维持了许多连接,然后被封了 httpget.releaseConnection()会清理session,一般不用,或者在最后用。
恩,很有道理~ 我确实没有关,我再试试 不过小弟还有个疑问,如果你说的是对的,怎么解释爬虫程序重启仍然403错误(程序重启就会释放连接了吧),然后浏览器仍能访问?服务器是怎么识别出来的呢?[/quote] 这个确实不知道了。。。你现在是多长时间抓一次?网上看1秒多抓一次才比较保险。 你重启是指重启tomcat吗?如果是的话,按理说确实连接会重置,可能还是你爬的太快了。 借鉴下这个帖子吧http://www.zhihu.com/topic/19857338/newest[/quote] 又有新进展了!与Cookies有关! 当我用爬虫爬到403 forbidden时,用浏览器还是能够打开网页的。但我关闭浏览器cookie后,浏览器也403了!开Cookie又能访问~ 然后我删掉了这个网站的相关cookies,并打开浏览器Cookies功能,这下也不能访问了,可以证明就是Cookies在起作用了吧~ 我猜无论浏览器还是爬虫,访问过快还是会被禁的。。我先研究一下HttpClient的Cookies功能,然后调整下访问频率。
大黑山唐僧 2014-04-01
  • 打赏
  • 举报
回复
引用 14 楼 icesharp 的回复:
[quote=引用 13 楼 swb0802 的回复:] [quote=引用 12 楼 icesharp 的回复:] 请求完后使用httpGet.abort()断开连接,也许是因为你没断开,导致维持了许多连接,然后被封了 httpget.releaseConnection()会清理session,一般不用,或者在最后用。
恩,很有道理~ 我确实没有关,我再试试 不过小弟还有个疑问,如果你说的是对的,怎么解释爬虫程序重启仍然403错误(程序重启就会释放连接了吧),然后浏览器仍能访问?服务器是怎么识别出来的呢?[/quote] 这个确实不知道了。。。你现在是多长时间抓一次?网上看1秒多抓一次才比较保险。 你重启是指重启tomcat吗?如果是的话,按理说确实连接会重置,可能还是你爬的太快了。 借鉴下这个帖子吧http://www.zhihu.com/topic/19857338/newest[/quote] 访问频率我没有设限制,看网速,有快有慢,大部分不会超过一秒钟两次。看来我还是设置一下频率吧。 我用的是HttpClient包,没有tomcat服务器。目前正在一步步完善,多谢你的帮助~ 我刚也查到了HttpClient tutorial文档,还是有些收获的,回赠给你哈~ http://hc.apache.org/httpcomponents-client-4.3.x/tutorial/pdf/httpclient-tutorial.pdf
icesharp 2014-04-01
  • 打赏
  • 举报
回复
引用 13 楼 swb0802 的回复:
[quote=引用 12 楼 icesharp 的回复:] 请求完后使用httpGet.abort()断开连接,也许是因为你没断开,导致维持了许多连接,然后被封了 httpget.releaseConnection()会清理session,一般不用,或者在最后用。
恩,很有道理~ 我确实没有关,我再试试 不过小弟还有个疑问,如果你说的是对的,怎么解释爬虫程序重启仍然403错误(程序重启就会释放连接了吧),然后浏览器仍能访问?服务器是怎么识别出来的呢?[/quote] 这个确实不知道了。。。你现在是多长时间抓一次?网上看1秒多抓一次才比较保险。 你重启是指重启tomcat吗?如果是的话,按理说确实连接会重置,可能还是你爬的太快了。 借鉴下这个帖子吧http://www.zhihu.com/topic/19857338/newest
icesharp 2014-03-31
  • 打赏
  • 举报
回复
请求完后使用httpGet.abort()断开连接,也许是因为你没断开,导致维持了许多连接,然后被封了 httpget.releaseConnection()会清理session,一般不用,或者在最后用。
大黑山唐僧 2014-03-31
  • 打赏
  • 举报
回复
引用 8 楼 shanxiuwei 的回复:
http请求也就头部和cookie
恩,如果是这样,那爬虫伪装只要做好这两点就可以了呗~
大黑山唐僧 2014-03-31
  • 打赏
  • 举报
回复
引用 5 楼 insulator2008 的回复:
不知所云,不明就里
坐等接分
大黑山唐僧 2014-03-31
  • 打赏
  • 举报
回复
引用 7 楼 taxuelingbing 的回复:
一个是模拟点击,另外一个IP一定要换的。 你刷新个浏览器才多少链接,跟爬虫不一样啊。 关于IP没有什么好方法来伪装,用免费代理一般都很慢,浪费资源。而且现在代理也可以被查。 最好用路由拨号,隔一阵就断开重连。
多谢仁兄解答,小弟有几处疑问: 模拟点击……是这样的,爬虫直接请求要访问的页面,没有点击按钮。类似的,我打开浏览器输入网址按回车后,就能得到我想要的页面。这涉及点击吗?我不是很懂。。。 你提到的连接数。。具体是什么概念?我写的爬虫,每次请求URL时候,都是用HttpClient.execute(HttpUriRequest)这个方法,应该只建立一条连接吧。。。也不是很懂。。。 我现在的问题貌似还没有被封ip,因为浏览器还能用
insulator2008 2014-03-28
  • 打赏
  • 举报
回复
不知所云,不明就里
只是_曾经 2014-03-28
  • 打赏
  • 举报
回复
http请求也就头部和cookie
加载更多回复(6)

81,087

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧