iframe的src怎么携带参数_Java 爬虫遇到需要登录的网站,该怎么办?
這是 Java 網絡爬蟲系列博文的第二篇,在上一篇 Java 網絡爬蟲,就是這么的簡單 中,我們簡單的學習了一下如何利用 Java 進行網絡爬蟲。在這一篇中我們將簡單的聊一聊在網絡爬蟲時,遇到需要登錄的網站,我們該怎么辦?
在做爬蟲時,遇到需要登陸的問題也比較常見,比如寫腳本搶票之類的,但凡需要個人信息的都需要登陸,對于這類問題主要有兩種解決方式:一種方式是手動設置 cookie ,就是先在網站上面登錄,復制登陸后的 cookies ,在爬蟲程序中手動設置 HTTP 請求中的 Cookie 屬性,這種方式適用于采集頻次不高、采集周期短,因為 cookie 會失效,如果長期采集的話就需要頻繁設置 cookie,這不是一種可行的辦法,第二種方式就是使用程序模擬登陸,通過模擬登陸獲取到 cookies,這種方式適用于長期采集該網站,因為每次采集都會先登陸,這樣就不需要擔心 cookie 過期的問題。
為了能讓大家更好的理解這兩種方式的運用,我以獲取豆瓣個人主頁昵稱為例,分別用這兩種方式來獲取需要登陸后才能看到的信息。獲取信息如下圖所示:
獲取圖片中的缺心眼那叫單純,這個信息顯然是需要登陸后才能看到的,這就符合我們的主題啦。接下來分別用上面兩種辦法來解決這個問題。
手動設置 cookie
手動設置 cookie 的方式,這種方式比較簡單,我們只需要在豆瓣網上登陸,登陸成功后就可以獲取到帶有用戶信息的cookie,豆瓣網登錄鏈接:https://accounts.douban.com/passport/login。如下圖所示:
圖中的這個 cookie 就攜帶了用戶信息,我們只需要在請求時攜帶這個 cookie 就可以查看到需要登陸后才能查看到的信息。我們用 Jsoup 來模擬一下手動設置 cookie 方式,具體代碼如下:
/*** 手動設置 cookies* 先從網站上登錄,然后查看 request headers 里面的 cookies* @param url* @throws IOException*/ public void setCookies(String url) throws IOException {Document document = Jsoup.connect(url)// 手動設置cookies.header("Cookie", "your 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("出錯啦!!!!!");} }從代碼中可以看出跟不需要登陸的網站沒什么區別,只是多了一個.header("Cookie", "your cookies"),我們把瀏覽器中的 cookie 復制到這里即可,編寫 main 方法
public static void main(String[] args) throws Exception {// 個人中心urlString user_info_url = "https://www.douban.com/people/150968577/";new CrawleLogin().setCookies(user_info_url);運行 main 得到結果如下:
可以看出我們成功獲取到了缺心眼那叫單純,這說明我們設置的 cookie 是有效的,成功的拿到了需要登陸的數據。這種方式是真的比較簡單,唯一的不足就是需要頻繁的更換 cookie,因為 cookie 會失效,這讓你使用起來就不是很爽啦。
模擬登陸方式
模擬登陸的方式可以解決手動設置 cookie 方式的不足之處,但同時也引入了比較復雜的問題,現在的驗證碼形形色色、五花八門,很多都富有挑戰性,比如在一堆圖片中操作某類圖片,這個還是非常有難度,不是隨便就能夠編寫出來。所以對于使用哪種方式這個就需要開發者自己去衡量利弊啦。今天我們用到的豆瓣網,在登陸的時候就沒有驗證碼,對于這種沒有驗證碼的還是比較簡單的,關于模擬登陸方式最重要的就是找到真正的登陸請求、登陸需要的參數。 這個我們就只能取巧了,我們先在登陸界面輸入錯誤的賬號密碼,這樣頁面將不會跳轉,所以我們就能夠輕而易舉的找到登陸請求。我來演示一下豆瓣網登陸查找登陸鏈接,我們在登陸界面輸入錯誤的用戶名和密碼,點擊登陸后,在 network 查看發起的請求鏈接,如下圖所示:
從 network 中我們可以查看到豆瓣網的登陸鏈接為https://accounts.douban.com/j/mobile/login/basic,需要的參數有五個,具體參數查看圖中的 Form Data,有了這些之后,我們就能夠構造請求模擬登陸啦。登陸后進行后續操作,接下來我們就用 Jsoup 來模擬登陸到獲取豆瓣主頁昵稱,具體代碼如下:
/*** Jsoup 模擬登錄豆瓣 訪問個人中心* 在豆瓣登錄時先輸入一個錯誤的賬號密碼,查看到登錄所需要的參數* 先構造登錄請求參數,成功后獲取到cookies* 設置request cookies,再次請求* @param loginUrl 登錄url* @param userInfoUrl 個人中心url* @throws IOException*/ public void jsoupLogin(String loginUrl,String userInfoUrl) throws IOException {// 構造登陸參數Map<String,String> data = new HashMap<>();data.put("name","your_account");data.put("password","your_password");data.put("remember","false");data.put("ticket","");data.put("ck","");Connection.Response login = 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 = 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("出錯啦!!!!!");} }這段代碼分兩段,前一段是模擬登陸,后一段是解析豆瓣主頁,在這段代碼中發起了兩次請求,第一次請求是模擬登陸獲取到 cookie,第二次請求時攜帶第一次模擬登陸后獲取的cookie,這樣也可以訪問需要登陸的頁面,修改 main 方法
public static void main(String[] args) throws Exception {// 個人中心urlString user_info_url = "https://www.douban.com/people/150968577/";// 登陸接口String login_url = "https://accounts.douban.com/j/mobile/login/basic";// new CrawleLogin().setCookies(user_info_url);new CrawleLogin().jsoupLogin(login_url,user_info_url); }運行 main 方法,得到如下結果:
模擬登陸的方式也成功的獲取到了網名缺心眼那叫單純,雖然這已經是最簡單的模擬登陸啦,從代碼量上就可以看出它比設置 cookie 要復雜很多,對于其他有驗證碼的登陸,我就不在這里介紹了,第一是我在這方面也沒什么經驗,第二是這個實現起來比較復雜,會涉及到一些算法和一些輔助工具的使用,有興趣的朋友可以參考崔慶才老師的博客研究研究。模擬登陸寫起來雖然比較復雜,但是只要你編寫好之后,你就能夠一勞永逸,如果你需要長期采集需要登陸的信息,這個還是值得你的做的。
除了使用 jsoup 模擬登陸外,我們還可以使用 httpclient 模擬登陸,httpclient 模擬登陸沒有 Jsoup 那么復雜,因為 httpclient 能夠像瀏覽器一樣保存 session 會話,這樣登陸之后就保存下了 cookie ,在同一個 httpclient 內請求就會帶上 cookie 啦。httpclient 模擬登陸代碼如下:
/*** httpclient 的方式模擬登錄豆瓣* httpclient 跟jsoup差不多,不同的地方在于 httpclient 有session的概念* 在同一個httpclient 內不需要設置cookies ,會默認緩存下來* @param loginUrl* @param userInfoUrl*/ public void httpClientLogin(String loginUrl,String userInfoUrl) throws Exception{CloseableHttpClient httpclient = HttpClients.createDefault();HttpUriRequest login = RequestBuilder.post().setUri(new URI(loginUrl))// 登陸url.setHeader("Upgrade-Insecure-Requests","1").setHeader("Accept","application/json").setHeader("Content-Type","application/x-www-form-urlencoded").setHeader("X-Requested-With","XMLHttpRequest").setHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36")// 設置賬號信息.addParameter("name","your_account").addParameter("password","your_password").addParameter("remember","false").addParameter("ticket","").addParameter("ck","").build();// 模擬登陸CloseableHttpResponse response = httpclient.execute(login);if (response.getStatusLine().getStatusCode() == 200){// 構造訪問個人中心請求HttpGet httpGet = new HttpGet(userInfoUrl);CloseableHttpResponse user_response = httpclient.execute(httpGet);HttpEntity entity = user_response.getEntity();//String body = EntityUtils.toString(entity, "utf-8");// 偷個懶,直接判斷 缺心眼那叫單純 是否存在字符串中System.out.println("缺心眼那叫單純是否查找到?"+(body.contains("缺心眼那叫單純")));}else {System.out.println("httpclient 模擬登錄豆瓣失敗了!!!!");} }運行這段代碼,返回的結果也是 true。
有關 Java 爬蟲遇到登陸問題就聊得差不多啦,來總結一下:對于爬蟲遇到登陸問題有兩種解決辦法,一種是手動設置cookie,這種方式適用于短暫性采集或者一次性采集,成本較低。另一種方式是模擬登陸的方式,這種方式適用于長期采集的網站,因為模擬登陸的代價還是蠻高的,特別是一些變態的驗證碼,好處就是能夠讓你一勞永逸
以上就是 Java 爬蟲時遇到登陸問題相關知識分享,希望對你有所幫助,下一篇是關于爬蟲是遇到數據異步加載的問題。如果你對爬蟲感興趣,不妨關注一波,相互學習,相互進步
源代碼:源代碼
文章不足之處,望大家多多指點,共同學習,共同進步最后
打個小廣告,歡迎掃碼關注微信公眾號:「平頭哥的技術博文」,一起進步吧。
總結
以上是生活随笔為你收集整理的iframe的src怎么携带参数_Java 爬虫遇到需要登录的网站,该怎么办?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没有为类型定义方法怎么办_拼多多开店没有
- 下一篇: csv 字符串_爬虫|python读写c