在下抓数据也小有研究,现分享几个自己研究出来的抓数据的技术,可能会有很多不足的地方,欢迎大家指正补充哈哈!
方法一:直接抓取网页源码
优点:速度快。
缺点:1,正由于速度快,易被服务器端检测,可能会限制当前ip的抓取。对于这点,可以尝试使用ip代码解决。
2,如果你要抓取的数据,是在网页加载完后,js修改了网页元素,无法抓取。
3,遇到抓取一些大型网站,如果需要抓取如登录后的页面,可能需要破解服务器端帐号加密算法以及各种加密算法,及其考验技术性。
适用场景:网页完全静态化,并且你要抓取的数据在网页首次加载完成就加载出来了。涉及登录或者权限操作的类似页面未做任何帐号加密或只做简单加密的。
当然,如果该网页你抓取的数据,是通过接口获得的json,那么,你就更幸福的,直接抓取json页面即可。
对于有登录的页面,我们如何拿到他的登录页之后的源码呢?
首先我要介绍一下,对于session保存帐号信息的情况下,服务器是如何确定该用户身份的。
首先,用户登录成功后,服务器端会将用户的当前会话信息保存到session中,每一个session有一个唯一标志sessionId。则用户访问这个页面,session被创建后,就会接收到服务器端传回的sessionId,并将其保存到cookie中,因此,我们可以用chrome浏览器打开检查项,查看当前页面的jsessionId。下次用户访问需要登录的页面时,用户发送的请求头会附上这个sessionId,服务器端通过这个sessionId就可以确定用户的身份。
这里,我搭建了一个简单的jsp登录页面,登录后的帐号信息保存在服务器端session中。
思路:1,登录。2,登录成功后获得cookie。3,将cookie放到请求头中,向登录页发送请求。
附上java版本的代码及python
java版:
package craw;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
public class CrawTest {
//获得网页源代码
private static String getHtml(String urlString,String charset,String cookie){
StringBuffer html = new StringBuffer();
try {
URL url = new URL(urlString);
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
urlConn.setRequestProperty(“Cookie”, cookie);
BufferedReader br = new BufferedReader(new InputStreamReader(urlConn.getInputStream(),charset));
String str;
while((str=br.readLine())!=null){
html.append(str);
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return html.toString();
}
//发送post请求,并返回请求后的cookie
private static String postGetCookie(String urlString,String params,String charset){
String cookies=null;
try {
URL url = new URL(urlString);
URLConnection urlConn = url.openConnection();
urlConn.setDoInput(true);
urlConn.setDoOutput(true);
PrintWriter out = new PrintWriter(urlConn.getOutputStream());
out.print(params);
out.flush();
cookies = urlConn.getHeaderFields().get("Set-Cookie").get(0);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cookies;
}
public static void main(String[] args) {
String cookie = postGetCookie("http://localhost:8080/loginDemo/login",
"username=admin&password=123456","utf-8");
String html = getHtml("http://localhost:8080/loginDemo/index.jsp", "utf-8", cookie);
System.out.println(html);//这里我们就可能输出登录后的网页源代码了
}
}
python版: