webmagic selenium 爬取動(dòng)態(tài)頁面

我們都知道很多數(shù)據(jù)都可以通過爬蟲進(jìn)行爬取霍比,如果我們爬取的是一個(gè)簡單的頁面策橘,那么很輕松就可以實(shí)現(xiàn)了元媚,如果要爬取動(dòng)態(tài)頁面甜无,那么怎么辦呢辩尊?

比如說我們要爬取東方財(cái)富網(wǎng)站上面的這些股票信息:
http://quote.eastmoney.com/center/list.html#10_0_0_u?sortType=C&sortRule=-1
但是我們查看源碼的時(shí)候卻看不到任何關(guān)于股票信息的數(shù)據(jù)划乖,可以看出這些股票數(shù)據(jù)是異步加載的蒂胞,果斷F12打開chrome開發(fā)者工具纸泄,在Network選項(xiàng)中查看基公,如果沒有的話可以F5刷新一下頁面就出來了幅慌。

QQ圖片20170208213844.png

然后點(diǎn)擊那個(gè)異步的api,會(huì)新打開一個(gè)頁面轰豆,出現(xiàn)以下的數(shù)據(jù):

var C1Cache={quotation:["0000011,上證指數(shù),3166.98,170854125568,13.89,0.44%,876|201|246|142,1380|270|360|204","3990012,深證成指,10130.12,215605108736,74.55,0.74%,876|201|246|142,1380|270|360|204"]}

本以為是一個(gè)json的數(shù)據(jù)欠痴,但是服務(wù)端傳來的是一個(gè)js變量迄靠,值類似一個(gè)json數(shù)據(jù),這應(yīng)該是為了開發(fā)的方便喇辽,但是我們要的是json的數(shù)據(jù)掌挚,所以需要過濾一下,split("=")然后取右邊的字符串就行了菩咨,但是需要注意下吠式,這個(gè)右邊的不是json數(shù)據(jù),注意json的key需要有雙引號(在java中和python中)抽米,或許在js下有沒有都可以吧特占,所以我們在java中還需要replace一下,這樣才是一個(gè)json字符串云茸,然后轉(zhuǎn)換成json對象是目,可以用jackson的 objectmapper,反正方法很多标捺。然后把這些數(shù)據(jù)持久化到數(shù)據(jù)庫就可以了懊纳,這樣我們就實(shí)現(xiàn)了一些動(dòng)態(tài)頁面的爬取。

但是這里需要注意的就是亡容,有些網(wǎng)站不允許你跨域去訪問嗤疯,即使你通過偽裝服務(wù)端還是有對策來防止你直接調(diào)用api,那么這個(gè)時(shí)候就需要用另一種方法闺兢,webmagic selenium茂缚,這個(gè)的原理就是,先運(yùn)行一個(gè)瀏覽器內(nèi)核去加載這個(gè)頁面屋谭,等到整個(gè)頁面加載完后再獲取html代碼脚囊,然后進(jìn)行處理。

比如說我們要爬取上交所的浦發(fā)銀行這支股票背后的公司信息桐磁,http://www.sse.com.cn/assortment/stock/list/info/company/index.shtml?COMPANY_CODE=600000
我們查看異步加載的api的時(shí)候凑术,發(fā)現(xiàn)不允許你直接的訪問這個(gè)api,所以只能用第二種方法了所意。

下面是項(xiàng)目的依賴:

    compile 'us.codecraft:webmagic-core:0.5.3'
    compile('us.codecraft:webmagic-extension:0.5.3')
    compile 'org.seleniumhq.selenium:selenium-java:2.8.0'
    compile group: 'us.codecraft', name: 'webmagic-selenium', version: '0.5.2'

源碼如下:

public class CompanyProcessor implements PageProcessor {


    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(3000)
            .setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");


    public void process(Page page) {
        WebDriver driver = new ChromeDriver();
        driver.get("http://www.sse.com.cn/assortment/stock/list/info/company/index.shtml?COMPANY_CODE=600000");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        WebElement webElement = driver.findElement(By.id("tableData_stockListCompany"));
//        WebElement webElement = driver.findElement(By.xpath("http://div[@class='table-responsive sse_table_T05']"));
        String str = webElement.getAttribute("outerHTML");
        System.out.println(str);

        Html html = new Html(str);
        System.out.println(html.xpath("http://tbody/tr").all());
        String companyCode = html.xpath("http://tbody/tr[1]/td/text()").get();

        DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String dateString = html.xpath("http://tbody/tr[3]/td/text()").get().split("/")[0];

        String stockCode = html.xpath("http://tbody/tr[2]/td/text()").get().split("/")[0];
        String name = html.xpath("http://tbody/tr[5]/td/text()").get().split("/")[0];
        String department = html.xpath("http://tbody/tr[14]/td/text()").get().split("/")[0];
        System.out.println(companyCode);
        System.out.println(stockCode);
        System.out.println(name);
        System.out.println(department);
        driver.close();

    }

    public Site getSite() {
        return site;
    }

    public static void main(String[] args) {
        Spider.create(new CompanyProcessor())
                .addUrl("http://www.sse.com.cn/assortment/stock/list/info/company/index.shtml?COMPANY_CODE=600000")
                .thread(5)
                .run();
    }
}

這里面有一些webmagic的知識淮逊,如果不熟悉的可以看一下中文文檔,因?yàn)檫@個(gè)爬蟲框架是中國人寫的扶踊,所以中文文檔很詳細(xì)http://webmagic.io/docs/zh/

這里注意一下這行代碼:

  WebDriver driver = new ChromeDriver();

如果要讓代碼運(yùn)行成功需要下載一個(gè)chromedriver泄鹏,如果你是windows可以去這個(gè)網(wǎng)址去下https://chromedriver.storage.googleapis.com/2.25/chromedriver_win32.zip,雖然是32位的但是64位也可以用秧耗,如果不行的話或者你是其他OS备籽,可以去官網(wǎng)下https://chromedriver.storage.googleapis.com/index.html?path=2.27/
這里為什么不直接推薦去官網(wǎng)下載最新的呢?因?yàn)槲抑坝眠^,最新的在我的兩個(gè)電腦上的windows系統(tǒng)都出現(xiàn)了問題〕碘現(xiàn)在完成后解壓放在C:\Windows\System32目錄下霉猛,或者設(shè)置一下環(huán)境變量都行。

然后就可以運(yùn)行了珠闰,之后的就是去提取一些數(shù)據(jù)或者url了惜浅,就像處理靜態(tài)頁面一樣了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伏嗜,一起剝皮案震驚了整個(gè)濱河市坛悉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌承绸,老刑警劉巖裸影,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異军熏,居然都是意外死亡轩猩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門荡澎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來均践,“玉大人,你說我怎么就攤上這事衔瓮。” “怎么了抖甘?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵热鞍,是天一觀的道長。 經(jīng)常有香客問我衔彻,道長薇宠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任艰额,我火速辦了婚禮澄港,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柄沮。我一直安慰自己回梧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布祖搓。 她就那樣靜靜地躺著狱意,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拯欧。 梳的紋絲不亂的頭發(fā)上详囤,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音镐作,去河邊找鬼藏姐。 笑死隆箩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的羔杨。 我是一名探鬼主播捌臊,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼问畅!你這毒婦竟也來了娃属?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤护姆,失蹤者是張志新(化名)和其女友劉穎矾端,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卵皂,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秩铆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灯变。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殴玛。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖添祸,靈堂內(nèi)的尸體忽然破棺而出滚粟,到底是詐尸還是另有隱情,我是刑警寧澤刃泌,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布凡壤,位于F島的核電站,受9級特大地震影響耙替,放射性物質(zhì)發(fā)生泄漏亚侠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一俗扇、第九天 我趴在偏房一處隱蔽的房頂上張望硝烂。 院中可真熱鬧,春花似錦铜幽、人聲如沸滞谢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爹凹。三九已至,卻和暖如春镶殷,著一層夾襖步出監(jiān)牢的瞬間禾酱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颤陶,地道東北人颗管。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像滓走,于是被迫代替她去往敵國和親垦江。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,098評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫搅方、插件比吭、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,098評論 4 62
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)姨涡,斷路器衩藤,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,368評論 7 249
  • 感覺自己最近有點(diǎn)負(fù)能量匈仗,昨天考砸了心里更難受了瓢剿。雖然朋友勸了我不少,但是我還是要靠自己走出來悠轩,爭取能變成向周圍散發(fā)...
    白菜花君閱讀 183評論 6 5