必須的,如果你跳過他的攔截器,直接訪問它的頁面,那就不安全了,在設(shè)計的時候就是這么設(shè)計的
成都創(chuàng)新互聯(lián)公司專注于龍門企業(yè)網(wǎng)站建設(shè),響應式網(wǎng)站,成都做商城網(wǎng)站。龍門網(wǎng)站建設(shè)公司,為龍門等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站制作,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
如果評論是通過AJAX顯示的,那么抓取有一定難度。
你的爬蟲需要能夠解釋JS,并解惑JS的內(nèi)容。
但如果你只針對少數(shù)的網(wǎng)站進行抓取,則可以針對這些網(wǎng)站開發(fā)專用的蜘蛛。人工分析其JS,從中找到其獲取評論的AJAX接口,然后抓之。這樣簡單。
還可以用爬蟲操作一個瀏覽器,通過瀏覽器的接口獲取其運行完成后的顯示的內(nèi)容
import?java.awt.BorderLayout;
import?java.awt.event.ActionEvent;
import?java.awt.event.ActionListener;
import?java.io.BufferedReader;
import?java.io.IOException;
import?java.io.InputStream;
import?java.io.InputStreamReader;
import?java點虐 .HttpURLConnection;
import?java點虐 .MalformedURLException;
import?java點虐 .URL;
import?java.util.regex.Matcher;
import?java.util.regex.Pattern;
import?javax.swing.JFrame;
import?javax.swing.JLabel;
import?javax.swing.JPanel;
import?javax.swing.JScrollPane;
import?javax.swing.JTextArea;
import?javax.swing.JTextField;
public?class?HttpViewer?extends?JFrame?{
private?JTextField?urlInput;
private?JTextArea?viewArea;
public?static?void?main(String[]?args)?{
new?HttpViewer();
}
public?HttpViewer()?{
this.setTitle("Http?Viewer");
this.setSize(800,?600);
this.setResizable(false);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
initPanel();
initAction();
this.setVisible(true);
}
//?這個方法用來設(shè)置窗口布局
private?void?initPanel()?{
JPanel?northPanel?=?new?JPanel();
JLabel?urlInputLabel?=?new?JLabel("URL:");
urlInput?=?new?JTextField(60);
northPanel.add(urlInputLabel);
northPanel.add(urlInput);
this.add(northPanel,?BorderLayout.NORTH);
JPanel?centerPanel?=?new?JPanel();
viewArea?=?new?JTextArea(27,?60);
centerPanel.add(new?JScrollPane(viewArea));
this.add(centerPanel);
}
//?這個方法用來設(shè)置事件
private?void?initAction()?{
urlInput.addActionListener(new?ActionListener()?{
public?void?actionPerformed(ActionEvent?e)?{
String?text?=?urlInput.getText();
if?(text?==?null?||?text.length()?==?0)?{
viewArea.setText("您沒有輸入URL");
return;
}
try?{
URL?url?=?new?URL(text);
String?context?=?getContent(url);
if?(context?!=?null)?{
searchFromText(context);
}
}?catch?(MalformedURLException?e1)?{
viewArea.setText("您輸入的URL不合法:"?+?text);
}
}
});
}
private?String?getContent(URL?url)?{
StringBuffer?builder?=?new?StringBuffer();
int?responseCode?=?-1;
HttpURLConnection?con?=?null;
try?{
con?=?(HttpURLConnection)?url.openConnection();
con.setRequestProperty("User-Agent",
"Mozilla/4.0?(compatible;?MSIE?5.0;?Windows?NT;?DigExt)");//?IE代理進行下載
con.setConnectTimeout(60000);
con.setReadTimeout(60000);
//?獲得網(wǎng)頁返回信息碼
responseCode?=?con.getResponseCode();
if?(responseCode?==?-1)?{
viewArea.setText("連接失敗:"?+?url.toString());
return?null;
}
if?(responseCode?=?400)?{
viewArea.setText("請求失敗,錯誤碼:"?+?responseCode);
return?null;
}
InputStream?is?=?con.getInputStream();
InputStreamReader?isr?=?new?InputStreamReader(is);
BufferedReader?br?=?new?BufferedReader(isr);
String?str?=?null;
while?((str?=?br.readLine())?!=?null)
builder.append(str);
is.close();
}?catch?(IOException?e)?{
e.printStackTrace();
viewArea.setText("IOException:?"?+?url.toString());
}?finally?{
con.disconnect();
}
return?builder.toString();
}
private?void?searchFromText(String?context)?{
viewArea.setText("查找URL中:\n");
Pattern?pattern?=?Pattern點抗 pile("a(?[^]+)*(.*?)/a");
Matcher?matcher?=?pattern.matcher(context);
while?(matcher.find())?{
for?(String?prop?:?matcher.group(1).split("?"))?{
int?indexOf?=?prop.indexOf('=');
if?(indexOf??0)?{
if?(prop.substring(0,?indexOf).equals("href"))?{
String?url2?=?prop.substring(indexOf?+?2,?prop.length()?-?1);
viewArea.append(url2?+?"\n");
}
}
}
}
}
}