模拟登录网站获取cookie(针对不可直接访问目标url获取数据的操作)

上一篇大概讲了一下如何简单粗暴的拿到数据:爬虫入门(爬取目标网站的一些数据)

但是那个只是一次性的,只要过一段时间,cookie等值就会失效,访问失败,所以该如何能够每次拿到最新的cookie值确保可以请求数据呢?java

这篇主要讲讲如何模拟登录网页,获取最新cookie。

  1. 首先需要下载浏览器驱动,我下载的是chromedriver,可以操控启动浏览器。配置教程
  2. 配置好后,首先来写一个可以实现模拟登录的主要类TencentyunFetcher(自己起的名)。这个类的主要功能就是拿着你的账户密码去目标网站模拟登录,获取你需要的cookie,我把注释仔细一点写在代码里。
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.apache.http.client.CookieStore;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;

import com.thoughtworks.selenium.Selenium;
import com.thoughtworks.selenium.webdriven.WebDriverBackedSelenium;

public class TencentyunFetcher {
	private WebDriver webDriver;
    private Selenium selenium;

    // 第三方的登录工具的用户名,XXXX填写自己的
    private String username = "XXXX";
    // 第三方的登录工具的密码
    private String password = "XXXX";

    public TencentyunFetcher() throws Exception {
        // 设置google浏览器的驱动位置
        System.setProperty("webdriver.chrome.driver" , "C:\\chromedriver_win32\\chromedriver.exe");
        webDriver = new ChromeDriver();
        webDriver.manage().timeouts().pageLoadTimeout(12000, TimeUnit.SECONDS);
        //
        selenium = new WebDriverBackedSelenium(webDriver, "https://cloud.tencent.com/?fromSource=gwzcw.2212127.2212127.2212127&utm_medium=cpd&utm_id=gwzcw.2212127.2212127.2212127");
        selenium.setTimeout("2000000");
    }

    public CookieStore fetch() throws Exception {
       //这里是登陆界面的url,功能打开该网页
    	webDriver.get("https://cloud.tencent.com/login?s_url=http%3A%2F%2Fiaas.cloud.tencent.com%2Fcgi%2Fcapi%3Fi%3Dimage%2FDescribeImages");
        waitForPageToLoad();   //等待加载完成
        //下面这部分是通过分析html,利用xpath定位到需要输入内容的模块,进行输入
        webDriver.findElement(By.xpath("//a[@class='J-btnSwitchLoginType' and @title='邮箱']")).click();   //点击登录按钮
        Thread.sleep(2000);
        
        webDriver.findElement(By.xpath("//input[@type='text']")).sendKeys(username);
        webDriver.findElement(By.xpath("//input[@type='password'and @placeholder='密码']")).sendKeys(password);      
        webDriver.findElement(By.xpath("//a[@class='clg-btn J-loginBtn']")).click();   //点击登录按钮
        
        
        Thread.sleep(2000);
        
      //你想要获取的的目标cookie的url
         webDriver.get("https://buy.cloud.tencent.com/cvm?tab=custom&step=1&devPayMode=monthly&regionId=1&instanceType=S5.SMALL2&bandwidthType=BANDWIDTH_PREPAID");
         Thread.sleep(2000);

        Set<org.openqa.selenium.Cookie> cookies = webDriver.manage().getCookies();   //得到cookie
    

        
        Iterator<org.openqa.selenium.Cookie> itr = cookies.iterator();

        CookieStore cookieStore = new BasicCookieStore();

        while (itr.hasNext()) {       //将所有cookie数据存储到了cookieStore里
            org.openqa.selenium.Cookie cookie = itr.next();
            BasicClientCookie bcco = new BasicClientCookie(cookie.getName(), cookie.getValue());
            bcco.setDomain(cookie.getDomain());
            bcco.setPath(cookie.getPath());
            cookieStore.addCookie(bcco);
        }
    
        return cookieStore;       
    }
    
    
    private void waitForPageToLoad() {
        selenium.waitForPageToLoad("12000");
    }
}
  1. 写个函数调用TencentyunFetcher,返回值是你的目标——CookieStore。
/*
	 * 获取cookie
	 */
	public static CookieStore searchCookie() throws Exception {
		
		 TencentyunFetcher fetcher = new TencentyunFetcher();          
		 CookieStore cookieStore= fetcher.fetch();
        
		
		return cookieStore;
		
	}
	
  1. 上面调用完返回的是cookieStore,就是把cookie里面每个键值对分开按一定格式存储而已,内容都有,处理内容注意下。
    可以这样为你的请求加上“许可证”——cookie
((AbstractHttpClient) client).setCookieStore(cookieStore);
  1. 如果你想在cookieStore里找到具体的某个键值对的值,可以用下面这个一个函数搞定,转化为map,直接用map.get()方法获取具体某个值。
Map<String,String> map=finduin(cookieStore);
post.setHeader("content-type", "application/json");
post.setHeader("cookie", "uin="+map.get("uin")+"; skey="+map.get("skey"));

我自己试过的,绝对可以用,如果是第一次尝试出现什么问题,请放心大胆去解决bug😄,最后一定可以成功。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值