在寫爬蟲時往往會碰到一些通過js之類動態加載的網頁,這時直接去讀取的話,拿到的往往是不完整的源代碼,需要一些方法去解決
- 使用一些工具模擬瀏覽器把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()
具體參見:
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
裏的東西設置到我們的程序裏便可以了