zoukankan      html  css  js  c++  java
  • java 模拟登录新浪微博(通过cookie)

    这几天一直在研究新浪微博的爬虫,发现爬取微博的数据首先要登录。本来打算是通过账号和密码模拟浏览器登录。但是现在微博的登录机制比较复杂。通过账号密码还没有登录成功QAQ。所以就先记录下,通过cookie直接访问自己的微博主页

    微博登录的认证过程

    微博登录的细节在其他的博客里已经有了详细的介绍。大概就是用户输入账号和密码后与服务器产生几次会话。若认证成功后,微博的服务器会返回给浏览器一个cookie。在之后访问微博的其他内容时,通过发送这个cookie就能正常访问微博了。所以用过cookie访问微博,过程就简化为了获取cookie,然后通过程序模拟浏览器访问微博首页。

    获取微博的cookie

    通过抓包软件或浏览器自带的调试工具都可以抓取网页的cookie。本文使用的是火狐浏览器的HttpFox 插件来获取微博的cookie。

    1,打开微博首页,打开HttpFox
    这里写图片描述
    2,输入用户名和密码,勾选“记住我”,点击登录。点击登录后我们可以看到HttpFox下产生了很多的URL。进入主页后在HTTPFox中找到你主页对应的URL,如下图:
    图2
    点击主页的URL后,我们可以看见左下方的一些信息。包括“Headers”,“Cookies”等。
    3,在“Headers”中可以看到有一条“Cookie”的信息。这个就是我们所需要的cookie了。点击右键保存cookie。
    至此,就获取了我们登录时所要的cookie了!

    代码实现

    由于我们是直接通过cookie进行的登录。所以少了很多认证的过程。直接使用HttpClient的相关包,带上之前获取的cookie就可以访问个人首页。获取了首页,我们就可以通过正则表达式来分析微博数据了。

    
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.config.Registry;
    import org.apache.http.config.RegistryBuilder;
    import org.apache.http.cookie.CookieSpec;
    import org.apache.http.cookie.CookieSpecProvider;
    import org.apache.http.impl.client.BasicCookieStore;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.cookie.DefaultCookieSpec;
    import org.apache.http.message.BasicHeader;
    import org.apache.http.protocol.HttpContext;
    import org.apache.http.util.EntityUtils;
    
    
    /**
     * 
     * 
     * @author zkw
     *
     */
    public class cookieLogin {
        private HttpClient client;
        private HttpPost post;
        private HttpGet get;
        private BasicCookieStore cookieStore;
    
        public cookieLogin() {
            //cookie策略,不设置会拒绝cookie rejected,设置策略保存cookie信息
            cookieStore = new BasicCookieStore();
            CookieSpecProvider myCookie = new CookieSpecProvider() {
    
                public CookieSpec create(HttpContext context) {
                    return new DefaultCookieSpec();
                }
            };
            Registry<CookieSpecProvider> rg = RegistryBuilder.<CookieSpecProvider> create().register("myCookie", myCookie)
                    .build();
    
            client = HttpClients.custom().setDefaultCookieStore(cookieStore).setDefaultCookieSpecRegistry(rg).build();
            get = new HttpGet();
            post = new HttpPost();
        }
    
        public void Login() throws ClientProtocolException, IOException, URISyntaxException {
    
            String LoginUrl = "你的微博主页网址";
    
            get.setURI(new URI(LoginUrl));
            get.addHeader("Host", "weibo.com");
            get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0");
            get.addHeader("Accept", "*/*");
            get.addHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
            get.addHeader("Accept-Encoding", "gzip, deflate");
            get.addHeader("Referer", "http://weibo.com/");
            get.addHeader(new BasicHeader("Cookie", "上述获取的cookie值"));
    
            HttpResponse resp = client.execute(get);
            HttpEntity entity = resp.getEntity();
            String cont = EntityUtils.toString(entity);
            System.out.println("获取的微博内容:" + cont);
    
        }
    
        public HttpClient getClient() {
            return client;
        }
    
        public void setClient(HttpClient client) {
            this.client = client;
        }
    
        public HttpPost getPost() {
            return post;
        }
    
        public void setPost(HttpPost post) {
            this.post = post;
        }
    
        public HttpGet getGet() {
            return get;
        }
    
        public void setGet(HttpGet get) {
            this.get = get;
        }
    
        public BasicCookieStore getCookieStore() {
            return cookieStore;
        }
    
        public void setCookieStore(BasicCookieStore cookieStore) {
            this.cookieStore = cookieStore;
        }
    
        public static void main(String[] args) throws ClientProtocolException, IOException, URISyntaxException {
            new cookieLogin().Login();
        }
    }
    

    总结

    通过cookie登录微博是一种快捷方式,但是存在不少问题。所以博主还在研究微博账号认证过程,希望过几天能有所突破QAQ。

  • 相关阅读:
    [转]Delphi中进行延时的4种方法
    [转]delphi 删除动态数组的指定元素
    vue-transition-fade
    移动端list布局,左边固定,右边自适应
    移动端弹窗
    多行文字超出省略显示
    jsonp
    barba 页面渲染
    barba.js 优化页面跳转用户体验
    页面返回无刷新
  • 原文地址:https://www.cnblogs.com/qianzf/p/7747899.html
Copyright © 2011-2022 走看看