php抓取网页json数据(一个从网络上抓取数据的一个小程序(图))
优采云 发布时间: 2021-10-11 08:29php抓取网页json数据(一个从网络上抓取数据的一个小程序(图))
最近做了一个小程序,从网上抓取数据。主要是关于信用,一些黑名单网站采集,从网站抓到自己的系统。
我也找到了一些资料,但我认为没有一个很好的和全面的例子。所以在这里做个笔记以提醒自己。
首先需要一个jsoup jar包,我用的是1.6.0。. 下载地址为:
1.获取网页内容(核心代码,技术有限,无封装)。
2.登录后,抓取网页数据(如何在请求中携带cookies)。
3、获取网站的ajax请求方法(返回json)。
上面三点我都会用一个class来收录(见谅,看的粗糙,直接复制代码就行了,应该可以的)
一、这个类分别有上面的1、2、3个方法,可以直接测试main方法
package com.minxinloan.black.web.utils;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.StringTokenizer;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class CookieUtil {
public final static String CONTENT_TYPE = "Content-Type";
public static void main(String[] args) {
//String loginURL = "http://www.p2peye.com/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=Lsc66&username=puqiuxiaomao&password=a1234567";
String listURL = "http://www.p2peye.com/blacklist.php?p=2";
String logURL = "http://www.p2peye.com/member.php";
//********************************需要登录的*************************************************
try {
Connection.Response res =
Jsoup.connect(logURL)
.data("mod","logging"
,"action","login"
,"loginsubmit","yes"
,"loginhash","Lsc66"
,"username","puqiuxiaomao"
,"password","a1234567")
.method(Method.POST)
.execute();
//这儿的SESSIONID需要根据要登录的目标网站设置的session Cookie名字而定
Connection con=Jsoup.connect(listURL);
//设置访问形式(电脑访问,手机访问):直接百度都参数设置
con.header("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
//把登录信息的cookies保存如map对象里面
Map map=res.cookies();
Iterator it =map.entrySet().iterator();
while(it.hasNext()){
Entry en= it.next();
//把登录的信息放入请求里面
con =con.cookie(en.getKey(), en.getValue());
}
//再次获取Document对象。
Document objectDoc = con.get();
Elements elements = objectDoc.getAllElements();//获取这个连接返回页面的源码内容(不是源码跟源码差不多)
for (Element element : elements) {
//element是迭代出来的标签:如:
Elements elements2= element.getAllElements();//
for (Element element2 : elements2) {
element2.text();
element2.attr("href");//获取标签属性。element2代表a标签:href代表属性
element2.text();//获取标签文本
}
}
//********************************不需要登录的*************************************************
String URL = "http://www.p2peye.com/blacklist.php?p=2";
Document conTemp = Jsoup.connect(URL).get();
Elements elementsTemps = conTemp.getAllElements();
for (Element elementsTemp : elementsTemps) {
elementsTemp.text();
elementsTemp.attr("href");//获取标签属性。element2代表a标签:href代表属性
elementsTemp.text();//获取标签文本
}
//********************************ajax方法获取内容。。。*************************************************。
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
StringBuffer sb = new StringBuffer();
URL getUrl = new URL(URL);
connection = (HttpURLConnection)getUrl.openConnection();
reader = new BufferedReader(new InputStreamReader(
connection.getInputStream(),"utf-8"));
String lines;
while ((lines = reader.readLine()) != null) {
sb.append(lines);
};
List list = parseJSON2List(sb.toString());//json转换成list
} catch (Exception e) {
} finally{
if(reader!=null)
try {
reader.close();
} catch (IOException e) {
}
// 断开连接
connection.disconnect();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Map parseJSON2Map(String jsonStr){
Map map = new HashMap();
//最外层解析
JSONObject json = JSONObject.fromObject(jsonStr);
for(Object k : json.keySet()){
Object v = json.get(k);
//如果内层还是数组的话,继续解析
if(v instanceof JSONArray){
List list = new ArrayList();
Iterator it = ((JSONArray)v).iterator();
while(it.hasNext()){
JSONObject json2 = it.next();
list.add(parseJSON2Map(json2.toString()));
}
map.put(k.toString(), list);
} else {
map.put(k.toString(), v);
}
}
return map;
}
public static List parseJSON2List(String jsonStr){
JSONArray jsonArr = JSONArray.fromObject(jsonStr);
List list = new ArrayList();
Iterator it = jsonArr.iterator();
while(it.hasNext()){
JSONObject json2 = it.next();
list.add(parseJSON2Map(json2.toString()));
}
return list;
}
}
二、这是获取验证码的类,可以研究一下。(但是要分析网站的验证码的请求地址)
Java抓取网页数据,登录后抓取数据,补不扣,
Java抓取网页数据,登录后抓取数据。
原来的: