如何解析帶JS動態的網頁?

在寫爬蟲時往往會碰到一些通過js之類動態加載的網頁,這時直接去讀取的話,拿到的往往是不完整的源代碼,需要一些方法去解決

  1. 使用一些工具模擬瀏覽器把js加載完後再去解析
    比如 selenium
    java中使用selenium有幾種方法,主要分成兩類:一類會啓動一個瀏覽器,對js的支持較好;一類不用啓動瀏覽器,使用htmlUnit,不需要加載瀏覽器,不過對js的支持不大好 。
    相對於java,在python中使用selenium稍微麻煩點,如果你想使用htmlUnit的話,你需要另外在運行一個 selenium server,參見:
    http://stackoverflow.com/questions/4618373/how-do-i-use-the-htmlunit-driver-with-selenium-from-python
    如果你是在linux服務器上運行,沒有GUI的話,直接使用那種開個窗口加載瀏覽器的方法會報以下的錯誤:
selenium.common.exceptions.WebDriverException: Message: The browser appears to have exited before we could connect. If you specified a log_file in the FirefoxBinary constructor, check it for details.

解決方法:
需要安裝一個類似虛擬機的東西來模擬:

sudo apt-get install xvfb
sudo pip install pyvirtualdisplay
from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=0, size=(1024, 768))
display.start()

browser = webdriver.Firefox()
browser.get('http://www.ubuntu.com/')
print browser.page_source

browser.close()
display.stop()

具體參見:

http://stackoverflow.com/questions/26070834/how-to-fix-selenium-webdriverexception-the-browser-appears-to-have-exited-befor


2.使用谷歌開發者工具等分析目標網站的加載過程
參見:https://www.zhihu.com/question/21332889
下面我以一個例子來說明下怎麼看目標網站請求的url是什麼?
比如騰訊應用寶:http://sj.qq.com/myapp/category.htm?orgame=1
當我們在看騰訊應用寶的應用時,它下面有一個 加載更多 的選項,當我們往下拉瀏覽器的右側下拉條時,它會加載新的app。但是我們如果直接去獲取這個頁面的時候,通過瀏覽器下拉條下拉加載的app我們是獲取不到的。
按照上面的鏈接介紹的方法,我們打開谷歌開發者工具,點擊Network 標籤,然後刷新騰訊應用寶頁面,我的如下圖:
這裏寫圖片描述
我們查看 Name,一個一個看,圖片之類的就不用看了,主要看那些有點像鏈接的東西,點擊,看對應右邊的 Preview,慢慢找,並在瀏覽器手工下拉那個下拉條,讓頁面加載新的app,再次查看 Name,會發現多了很多的圖中的藍框中鏈接:
這裏寫圖片描述
看右邊對應的 Preview ,可以發現這其實就是我們每次下拉時,騰訊頁面自動加載的app,他每次加載20個,我們找到了這個鏈接便可以直接向服務器發出請求了,返回的是json數據,如下圖:
這裏寫圖片描述

最後有的網站對header和cookie之類的都有要求,這時可以將
這裏寫圖片描述
圖中 Request Headers 裏的東西設置到我們的程序裏便可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章