java 模拟登录新浪微博(通过cookie)

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。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用Java实现模拟微博登录并保存Cookie的过程可以参考以下示例代码: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; public class CookieSimulation { public static void main(String[] args) { try { // 1. 发送GET请求获取登录页面 String loginUrl = "https://weibo.com/login.php"; URL url = new URL(loginUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 2. 获取响应中的Cookie Map<String, List<String>> headerFields = connection.getHeaderFields(); List<String> cookies = headerFields.get("Set-Cookie"); StringBuilder cookieBuilder = new StringBuilder(); if (cookies != null) { for (String cookie : cookies) { cookieBuilder.append(cookie).append("; "); } } String cookie = cookieBuilder.toString(); // 3. 构造POST请求参数 String postData = "username=your_username&password=your_password"; // 4. 发送POST请求模拟登录 URL loginPostUrl = new URL("https://weibo.com/login.php"); HttpURLConnection loginPostConnection = (HttpURLConnection) loginPostUrl.openConnection(); loginPostConnection.setRequestMethod("POST"); loginPostConnection.setRequestProperty("Cookie", cookie); loginPostConnection.setDoOutput(true); loginPostConnection.getOutputStream().write(postData.getBytes()); // 5. 获取登录结果 int responseCode = loginPostConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 登录成功,可以继续后续操作 // 6. 发送其他请求时,将保存的Cookie添加到请求头中 URL otherUrl = new URL("https://weibo.com/other"); HttpURLConnection otherConnection = (HttpURLConnection) otherUrl.openConnection(); otherConnection.setRequestProperty("Cookie", cookie); // 7. 处理其他请求的响应 // ... } else { // 登录失败,处理失败情况 // ... } } catch (Exception e) { e.printStackTrace(); } } } ``` 请注意,这只是一个简单示例,实际的微博登录可能涉及更复杂的流程和参数。您可能需要根据微博登录页面的具体情况进行适当的修改。此外,使用爬虫时要遵守网站的规则,并确保您的行为合法和道德。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值