摘要:是一個(gè)瀏覽器自動(dòng)化測(cè)試框架可以模擬用戶的所有操作很久以前就想把李敖大師的所有微博爬取下來(lái)一直沒(méi)空前天看見(jiàn)群里有人推薦和就學(xué)了做了個(gè)你們想爬別人的只要把李敖大師的地址換成你要的就行了我還沒(méi)學(xué)不過(guò)我猜他就是去掉功能的瀏覽器這樣可以讓爬蟲(chóng)更快如果
selenium 是一個(gè)瀏覽器自動(dòng)化測(cè)試框架.可以模擬用戶的所有操作.
很久以前就想把李敖大師的所有微博爬取下來(lái).一直沒(méi)空,前天看見(jiàn)群里有人推薦selenium和phantomjs 就學(xué)了selenium做了個(gè)demo.你們想爬別人的只要把李敖大師的地址換成你要的就行了.phantomjs我還沒(méi)學(xué),不過(guò)我猜他就是去掉ui功能的瀏覽器.這樣可以讓爬蟲(chóng)更快.如果專業(yè)做爬蟲(chóng)的可以看看.我做這個(gè)是玩的.
數(shù)據(jù)庫(kù)結(jié)構(gòu)爬蟲(chóng)思路:學(xué)習(xí)地址: 慕課網(wǎng) selenium 教程
項(xiàng)目地址: spiderSina
環(huán)境:
ide:Netbeans
java包:非常多(在lib文件夾中)
瀏覽器驅(qū)動(dòng):ie,火狐,谷歌隨便選(在res文件夾內(nèi))
打開(kāi)微博并登錄 這里的css選擇器就當(dāng)jQuery用打開(kāi)新浪微博首頁(yè)并登錄
跳轉(zhuǎn)到李敖大師主頁(yè)
觸發(fā)ajax將一個(gè)頁(yè)面全部顯示出來(lái)
對(duì)每一個(gè)微博進(jìn)行判斷解析 只獲取大師本人的微博
如果有展開(kāi)全文就點(diǎn)擊點(diǎn)擊一下.然后將微博內(nèi)容插入數(shù)據(jù)庫(kù)判斷是否有下一頁(yè),如果有就到下一頁(yè)然后進(jìn)入第四步
baseUrl = "https://weibo.com"; //打開(kāi)微博主頁(yè)面 driver.get(baseUrl); //設(shè)置窗口最大化 driver.manage().window().maximize(); //輸入用戶名 driver.findElement(By.cssSelector("#loginname")).clear(); driver.findElement(By.cssSelector("#loginname")).sendKeys(sinaUsername); //輸出密碼 driver.findElement(By.cssSelector("#pl_login_form .info_list.password input")).clear(); driver.findElement(By.cssSelector("#pl_login_form .info_list.password input")).sendKeys(password); //點(diǎn)擊登錄 driver.findElement(By.cssSelector("#pl_login_form.login_box div.login_innerwrap div.W_login_form .login_btn")).click();觸發(fā)ajax將一個(gè)頁(yè)面全部顯示出來(lái)
//判斷是否有下一頁(yè)那個(gè)按鈕 沒(méi)的就向下拉 for (int i = 0, scrollY = 5000; i < 20; i++, scrollY += 5000) { //判斷是否有下一頁(yè)那個(gè)div 如果有就表示到底了 if (this.isElementPresent(By.cssSelector(".page.next.S_txt1.S_line1"))) { break; } String setscroll = "window.scrollTo(0," + scrollY + ")"; //執(zhí)行js代碼 將頁(yè)面向下拉 jse.executeScript(setscroll); }對(duì)每一個(gè)微博進(jìn)行判斷解析 只獲取大師本人的微博
//獲取李大師所有的微博 Listdivs = driver.findElements(By.cssSelector("#Pl_Official_MyProfileFeed__23 div>.WB_cardwrap.WB_feed_type")); //對(duì)每一條微博進(jìn)行判斷是否為正常微博(非別人的點(diǎn)贊) 并進(jìn)行展開(kāi)全文 然后插入數(shù)據(jù)庫(kù) divs.forEach((WebElement ele) -> { String isZan = ele.findElement(By.cssSelector("div:first-of-type")).getAttribute("class"); if (!("WB_cardtitle_b S_line2".equals(isZan))) { String weiboContent; //如果要運(yùn)行的快一點(diǎn)就把數(shù)值改小,數(shù)值越小等待的時(shí)間越少 driver.manage().timeouts().implicitlyWait(10, TimeUnit.MILLISECONDS); //判斷是否微博中是否有超鏈接并且超鏈接內(nèi)容為展開(kāi)全文 如果是就點(diǎn)擊 if (this.isElementPresent(By.cssSelector(".WB_feed_detail>.WB_detail>.WB_text.W_f14 a"), ele) && "展開(kāi)全文".equals(ele.findElement(By.cssSelector(".WB_feed_detail>.WB_detail>.WB_text.W_f14 a")).getText().trim())) { //這里獲取全文應(yīng)該是300ms之內(nèi) 設(shè)置太久會(huì)浪費(fèi)時(shí)間 driver.manage().timeouts().implicitlyWait(300, TimeUnit.MILLISECONDS); //點(diǎn)擊 展開(kāi)全文按鈕 ele.findElement(By.cssSelector(".WB_feed_detail>.WB_detail>.WB_text.W_f14 a")).click(); //獲取微博內(nèi)容 weiboContent = ele.findElement(By.cssSelector(".WB_feed_detail>.WB_detail>div:last-of-type")).getText(); } else { //如果沒(méi)有展開(kāi)全文 獲取微博 這兩種內(nèi)容不在一個(gè)div里 weiboContent = ele.findElement(By.cssSelector(".WB_feed_detail>.WB_detail>.WB_text.W_f14")).getText(); } driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //獲取大師發(fā)微博的時(shí)間 String writeTime = ele.findElement(By.cssSelector(".WB_feed_detail>.WB_detail>.WB_from>a:first-of-type")).getText(); //這里我想把微博中偶爾出現(xiàn)的零寬字符去掉但是失敗了,可能是版本問(wèn)題.不想搞 //weiboContent = weiboContent.replaceAll("u200b", ""); //將微博插入數(shù)據(jù)庫(kù) this.insertToMysql(weiboContent, writeTime); //這個(gè)是獲取到的微博內(nèi)容調(diào)試時(shí)候可以打開(kāi)看看在哪里出來(lái)問(wèn)題 // System.out.println(weiboContent + " "); }
});
判斷是否有下一頁(yè)//查看按鈕的文本是否為"下一頁(yè)" 如果是那就還有下一頁(yè) WebElement nextPage = driver.findElement(By.cssSelector("#Pl_Official_MyProfileFeed__23 .WB_cardwrap.S_bg2>div>a:last-of-type")); String strNext = nextPage.getText(); if ("下一頁(yè)".equals(strNext)) { nextPage.click(); this.getPage(); }
沒(méi)有了... 其實(shí)selenium普通玩家應(yīng)該很快就能上手.高端玩法沒(méi)試過(guò).主要就是看一下他重要的幾個(gè)api
如果不知道api 就百度還有寫(xiě)demo猜api用法.
本來(lái)想用php寫(xiě)的,但是php寫(xiě)得話可能比較麻煩.
我本人對(duì)李敖大師十分敬仰,一直就想把他的語(yǔ)錄記下來(lái).待他百年之后,有人在網(wǎng)上吹牛李敖說(shuō)"xxx"
我能有勇氣發(fā)這個(gè)圖給他.
開(kāi)個(gè)玩笑,我是為了學(xué)習(xí).
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67650.html
摘要:編碼我們發(fā)現(xiàn),中有時(shí)候存在中文,這是就需要對(duì)進(jìn)行編碼。可以先將中文轉(zhuǎn)換成編碼,然后使用方法對(duì)參數(shù)進(jìn)行編碼后傳遞。 本文檔對(duì)日常學(xué)習(xí)中用 python 做數(shù)據(jù)爬取時(shí)所遇到的一些問(wèn)題做簡(jiǎn)要記錄,以便日后查閱,部分問(wèn)題可能因?yàn)檎J(rèn)識(shí)不到位會(huì)存在一些誤解,敬請(qǐng)告知,萬(wàn)分感謝,共同進(jìn)步。 估算網(wǎng)站規(guī)模 該小節(jié)主要針對(duì)于整站爬取的情況。爬取整站之前,肯定是要先對(duì)一個(gè)網(wǎng)站的規(guī)模進(jìn)行估計(jì)。這是可以使用g...
摘要:本人長(zhǎng)期出售超大量微博數(shù)據(jù)旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),。如果用戶傳入偽造的,則新浪微博會(huì)返回一個(gè)錯(cuò)誤。 PS:(本人長(zhǎng)期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),Message to [email protected]。由于微博接口更新后限制增大,這個(gè)代碼已經(jīng)不能用來(lái)爬數(shù)據(jù)了。如果只是為了收集數(shù)據(jù)可以咨詢我的郵箱,如果是為了學(xué)習(xí)爬蟲(chóng),...
摘要:本人長(zhǎng)期出售超大量微博數(shù)據(jù)旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),。如果用戶傳入偽造的,則新浪微博會(huì)返回一個(gè)錯(cuò)誤。 PS:(本人長(zhǎng)期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),Message to [email protected]。由于微博接口更新后限制增大,這個(gè)代碼已經(jīng)不能用來(lái)爬數(shù)據(jù)了。如果只是為了收集數(shù)據(jù)可以咨詢我的郵箱,如果是為了學(xué)習(xí)爬蟲(chóng),...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
閱讀 2744·2023-04-25 17:58
閱讀 3010·2021-11-15 11:38
閱讀 2416·2021-11-02 14:48
閱讀 1223·2021-08-25 09:40
閱讀 1853·2019-08-30 15:53
閱讀 1124·2019-08-30 15:52
閱讀 1056·2019-08-30 13:55
閱讀 2469·2019-08-29 15:21