php用正则表达抓取网页中文章(爬虫过期目标网站怎么用设置cookie? )
优采云 发布时间: 2021-11-09 05:23php用正则表达抓取网页中文章(爬虫过期目标网站怎么用设置cookie?
)
简介:使用爬虫时,某些网站爬虫需要登录才能爬取。一般网站有登录,信息通常以cookies的形式存储。所以有两种方式: 模拟登录获取cookies和所有带有cookies的请求,直接登录网站保存cookies,相当于写死;第一个在当时比较灵活,第二个会涉及到cookie过期目标网站:豆瓣+我的用户名(binbin)
手动获取 cookie:查看请求
1 使用 Jsoup 设置 cookie 和查看节点
代码:
package Jsoup;
import HttpClient.HttpClientPc;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.io.IOException;
/**
* 已经有了cookie
*/
public class LoginCookie {
public static void main(String[] args) throws IOException {
String url="https://www.douban.com/people/205769149/";
LoginCookie loginCookie=new LoginCookie();
String cookie="";
loginCookie.setCookies(url,cookie);
}
/**
* 手动设置 cookies
* 先从网站上登录,然后查看 request headers 里面的 cookies
* @param url
* @throws IOException
*/
public void setCookies(String url,String cookie) throws IOException {
Document document = org.jsoup.Jsoup.connect(url)
// 手动设置cookies
.header("Cookie", cookie)
.get();
//
if (document != null) {
// 获取豆瓣昵称节点
Element element = document.select(".info h1").first();
if (element == null) {
System.out.println("没有找到 .info h1 标签");
return;
}
// 取出豆瓣节点昵称
String userName = element.ownText();
System.out.println("豆瓣我的网名为:" + userName);
} else {
System.out.println("出错啦!!!!!");
}
}
}
运行结果:
模拟登录方式:登录链接:登录豆瓣
代码:
package Jsoup;
import org.jsoup.Connection;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class login {
public static void main(String[] args) throws IOException {
String loginUrl="https://accounts.douban.com/j/mobile/login/basic";
String userInfoUrl="https://www.douban.com/people/205769149/";
login login=new login();
login.jsoupLogin(loginUrl,userInfoUrl);
}
/**
* Jsoup 模拟登录豆瓣 访问个人中心
* 在豆瓣登录时先输入一个错误的账号密码,查看到登录所需要的参数
* 先构造登录请求参数,成功后获取到cookies
* 设置request cookies,再次请求
* @param loginUrl 登录url :https://accounts.douban.com/j/mobile/login/basic
* @param userInfoUrl 个人中心url https://www.douban.com/people/205769149/
* @throws IOException
*/
public void jsoupLogin(String loginUrl,String userInfoUrl) throws IOException {
// 构造登陆参数
Map data = new HashMap();
data.put("name","用户名");
data.put("password","密码");
data.put("remember","false");
data.put("ticket","");
data.put("ck","");
Connection.Response login = org.jsoup.Jsoup.connect(loginUrl)
.ignoreContentType(true) // 忽略类型验证
.followRedirects(false) // 禁止重定向
.postDataCharset("utf-8")
.header("Upgrade-Insecure-Requests","1")
.header("Accept","application/json")
.header("Content-Type","application/x-www-form-urlencoded")
.header("X-Requested-With","XMLHttpRequest")
.header("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36")
.data(data)
.method(Connection.Method.POST)
.execute();
login.charset("UTF-8");
// login 中已经获取到登录成功之后的cookies
// 构造访问个人中心的请求
Document document = org.jsoup.Jsoup.connect(userInfoUrl)
// 取出login对象里面的cookies
.cookies(login.cookies())
.get();
if (document != null) {
Element element = document.select(".info h1").first();
if (element == null) {
System.out.println("没有找到 .info h1 标签");
return;
}
String userName = element.ownText();
System.out.println("豆瓣我的网名为:" + userName);
} else {
System.out.println("出错啦!!!!!");
}
}
}