java 如何大量访问某个网站

sinat_27567493 2015-05-13 01:59:06
我想用java做一个程序来大量摘取某网站的特定内容
下面的函数是用来建立链接并读取网站html源码的。

public static String getHtmlCode(String path) {
String html = "", temp = "";
try {
URL u = new URL(path);
URLConnection connection = u.openConnection();
HttpURLConnection htCon = (HttpURLConnection) connection;
htCon.addRequestProperty("baiduspider User-Agent", "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)");
int code = htCon.getResponseCode();
if (code == HttpURLConnection.HTTP_OK) {
System.out.println("find the website");
BufferedReader in=new BufferedReader(new InputStreamReader(htCon.getInputStream()));
while ((temp = in.readLine()) != null)
html = html + " " + temp;
in.close();
htCon.disconnect();
}
else {
System.out.println("Can not access the website");
}
}
catch(MalformedURLException e ) {
System.out.println("Wrong URL");
}
catch(IOException e) {
System.out.println("Can not connect");
}
return html;
}

现在的问题是:如果这段代码连续执行次数达到20次左右,网站就不再返回代码了,而是返回空白,要过一段时间后才能再有内容。我怀疑是网站禁止了我的ip,可是用浏览器却可以访问网站。而且就算我降低频率到每3秒读取一次,还是会发生上述情况,有人知道是怎么回事吗?
...全文
839 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
铁匠梁老师 2015-05-17
  • 打赏
  • 举报
回复
还没玩过web模拟,现在被smartclient整得没脾气了
东东东雷 2015-05-15
  • 打赏
  • 举报
回复
引用 12 楼 sinat_27567493 的回复:
[quote=引用 11 楼 u011845742 的回复:] [quote=引用 8 楼 sinat_27567493 的回复:] [quote=引用 5 楼 u011845742 的回复:] ip被禁是至少你当天是不可能在登上那个网站的,访问同一个网址,相同的内容可能是缓存的影响,不太确定。 不过我不太明白你一直访问同一个网址,你觉得有意义吗? 若是想得到网页里面的内容,可以将一次读入的 网页信息直接存起来慢慢解析就是,何必那么做呢? 要是URL 不一样的话 应该不会出现那种情况……
我的程序大致是先提取出它某个页面的超链接,在挨个访问这些超链接抓取里面的内容,所以每次访问的url是不同的。这不会造成服务器禁止我的ip吗?[/quote] 额……你的问题不好回答,因为要是无关的链接的话可能根本不是在访问同一台服务器,这要看URL的前缀,不过我猜是相关的。 正如我上次说的那样 ,要是封你的 IP 你早就不能再一次访问了,所以可以忽略屏蔽这个问题。 无论你是怎么得到的超链接,你看下廉洁是不是符合 URL 的 ,因为好多 网页中的超链接是需要特殊处理的, 如:需要添加 “http:// ” 等,你试试。我猜这个才是问题的关键。[/quote] 不是url写法的问题,我看了一下他返回的html内容,它说我是机器人。。。还是被屏蔽了[/quote] htCon.addRequestProperty("baiduspider User-Agent", "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"); 这个加 baiduspider 干嘛? 你自己写的代码? 去掉试试。没见过那种写法,你 或者可以把请求头补充全,可能更好。
sinat_27567493 2015-05-15
  • 打赏
  • 举报
回复
引用 11 楼 u011845742 的回复:
[quote=引用 8 楼 sinat_27567493 的回复:] [quote=引用 5 楼 u011845742 的回复:] ip被禁是至少你当天是不可能在登上那个网站的,访问同一个网址,相同的内容可能是缓存的影响,不太确定。 不过我不太明白你一直访问同一个网址,你觉得有意义吗? 若是想得到网页里面的内容,可以将一次读入的 网页信息直接存起来慢慢解析就是,何必那么做呢? 要是URL 不一样的话 应该不会出现那种情况……
我的程序大致是先提取出它某个页面的超链接,在挨个访问这些超链接抓取里面的内容,所以每次访问的url是不同的。这不会造成服务器禁止我的ip吗?[/quote] 额……你的问题不好回答,因为要是无关的链接的话可能根本不是在访问同一台服务器,这要看URL的前缀,不过我猜是相关的。 正如我上次说的那样 ,要是封你的 IP 你早就不能再一次访问了,所以可以忽略屏蔽这个问题。 无论你是怎么得到的超链接,你看下廉洁是不是符合 URL 的 ,因为好多 网页中的超链接是需要特殊处理的, 如:需要添加 “http:// ” 等,你试试。我猜这个才是问题的关键。[/quote] 不是url写法的问题,我看了一下他返回的html内容,它说我是机器人。。。还是被屏蔽了
bree06 2015-05-13
  • 打赏
  • 举报
回复
这种情况应该是被主站点阻止的,不然不是很容易黑一个网站了。 浏览器之所以可以,一个原因可能是缓存,当取不到时就使用缓存的画面,还有一个原因可能是在url后面跟参数了,不如当前时间,当然只是猜测。。。 你可以在使用URL url = new URL(path + "&" + System.currentTimeMillis()); 再去试试。 不过你这样大量访问很不道德呀。网络警察发现了,你就成犯罪分子了
sinat_27567493 2015-05-13
  • 打赏
  • 举报
回复
引用 5 楼 u011845742 的回复:
ip被禁是至少你当天是不可能在登上那个网站的,访问同一个网址,相同的内容可能是缓存的影响,不太确定。 不过我不太明白你一直访问同一个网址,你觉得有意义吗? 若是想得到网页里面的内容,可以将一次读入的 网页信息直接存起来慢慢解析就是,何必那么做呢? 要是URL 不一样的话 应该不会出现那种情况……
我的程序大致是先提取出它某个页面的超链接,在挨个访问这些超链接抓取里面的内容,所以每次访问的url是不同的。这不会造成服务器禁止我的ip吗?
sinat_27567493 2015-05-13
  • 打赏
  • 举报
回复
引用 4 楼 u011004037 的回复:
可能就是被禁止ip了, 浏览器访问通常会带有cookie等信息, 就算禁用了cookie也会有session信息. 而lz的程序相当于打开浏览器, 打开网页, 关闭浏览器, 再打开浏览器.... 反正就是, 每次都是以新用户的身份访问的, 然后可能就被认为是恶意攻击了吧....
但是我把频率降到3秒访问一次还是会出现这种问题,3秒一次够低了吧,人工都可以比这快
sinat_27567493 2015-05-13
  • 打赏
  • 举报
回复
引用 1 楼 rumlee 的回复:
理论上说用浏览器能访问,那么用程序就能够访问,你用一个截包软件截几个包看一下,应该是你模仿浏览器模仿的不够。 例如http头里面的信息,你尽量模仿成和浏览器一样。
如果是对浏览器模仿不够,那应该前几次也不能成功读取啊?可是我前几次都是成功的啊
东东东雷 2015-05-13
  • 打赏
  • 举报
回复
ip被禁是至少你当天是不可能在登上那个网站的,访问同一个网址,相同的内容可能是缓存的影响,不太确定。 不过我不太明白你一直访问同一个网址,你觉得有意义吗? 若是想得到网页里面的内容,可以将一次读入的 网页信息直接存起来慢慢解析就是,何必那么做呢? 要是URL 不一样的话 应该不会出现那种情况……
youzi05 2015-05-13
  • 打赏
  • 举报
回复
可能就是被禁止ip了, 浏览器访问通常会带有cookie等信息, 就算禁用了cookie也会有session信息. 而lz的程序相当于打开浏览器, 打开网页, 关闭浏览器, 再打开浏览器.... 反正就是, 每次都是以新用户的身份访问的, 然后可能就被认为是恶意攻击了吧....
iphilip 2015-05-13
  • 打赏
  • 举报
回复
我感觉 addRequestProperty 里面的信息换换,多弄几组随机的,不要固定
聪头 2015-05-13
  • 打赏
  • 举报
回复
浏览器可能用的是缓存,所以不一定都是从网站取的
rumlee 2015-05-13
  • 打赏
  • 举报
回复
理论上说用浏览器能访问,那么用程序就能够访问,你用一个截包软件截几个包看一下,应该是你模仿浏览器模仿的不够。 例如http头里面的信息,你尽量模仿成和浏览器一样。
东东东雷 2015-05-13
  • 打赏
  • 举报
回复
引用 8 楼 sinat_27567493 的回复:
[quote=引用 5 楼 u011845742 的回复:] ip被禁是至少你当天是不可能在登上那个网站的,访问同一个网址,相同的内容可能是缓存的影响,不太确定。 不过我不太明白你一直访问同一个网址,你觉得有意义吗? 若是想得到网页里面的内容,可以将一次读入的 网页信息直接存起来慢慢解析就是,何必那么做呢? 要是URL 不一样的话 应该不会出现那种情况……
我的程序大致是先提取出它某个页面的超链接,在挨个访问这些超链接抓取里面的内容,所以每次访问的url是不同的。这不会造成服务器禁止我的ip吗?[/quote] 额……你的问题不好回答,因为要是无关的链接的话可能根本不是在访问同一台服务器,这要看URL的前缀,不过我猜是相关的。 正如我上次说的那样 ,要是封你的 IP 你早就不能再一次访问了,所以可以忽略屏蔽这个问题。 无论你是怎么得到的超链接,你看下廉洁是不是符合 URL 的 ,因为好多 网页中的超链接是需要特殊处理的, 如:需要添加 “http:// ” 等,你试试。我猜这个才是问题的关键。
糖几颗的 2015-05-13
  • 打赏
  • 举报
回复
应该是被别人阻止了的. 去抓取某网站的内容... 频率不可能这么快吧... 网站更新的速度也不可能是分钟级的吧... 感觉只要你的程序启动起来之后, 你就半天去取一次就好... 不过..还是比较想知道.. 你这么搞..是为了啥..............

62,615

社区成员

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

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