java 模擬登入新浪微博(通過cookie)
java模擬登入新浪微博(通過cookie)
這幾天一直在研究新浪微博的爬蟲,發現爬取微博的資料首先要登入。本來打算是通過賬號和密碼模擬瀏覽器登入。但是現在微博的登入機制比較複雜。通過賬號密碼還沒有登入成功QAQ。所以就先記錄下,通過cookie直接訪問自己的微博主頁。
微博登入的認證過程
微博登入的細節在其他的部落格裡已經有了詳細的介紹。大概就是使用者輸入賬號和密碼後與伺服器產生幾次會話。若認證成功後,微博的伺服器會返回給瀏覽器一個cookie。在之後訪問微博的其他內容時,通過傳送這個cookie就能正常訪問微博了。所以用過cookie訪問微博,過程就簡化為了獲取cookie,然後通過程式模擬瀏覽器訪問微博首頁。
獲取微博的cookie
通過抓包軟體或瀏覽器自帶的除錯工具都可以抓取網頁的cookie。本文使用的是火狐瀏覽器的HttpFox 外掛來獲取微博的cookie。
1,開啟微博首頁,開啟HttpFox
2,輸入使用者名稱和密碼,勾選“記住我”,點選登入。點選登入後我們可以看到HttpFox下產生了很多的URL。進入主頁後在HTTPFox中找到你主頁對應的URL,如下圖:
點選主頁的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。