手把手教你寫網絡爬蟲(5):PhantomJS實戰
本系列:
大家好!從今天開始,我要與大家一起打造一個屬于我們自己的分布式爬蟲平臺,同時也會對涉及到的技術進行詳細介紹。大家如果有什么好的想法請多留言,多提意見,一起來完善我們的爬蟲平臺。在正式介紹平臺之前,先用一些篇幅對基礎篇做一點補充。模擬滾動
這次的目標是爬一個眾籌網站的所有項目,項目列表頁如下:https://www.kaistart.com/project/more.html。打開后進行分析,頁面顯示出10個項目:
如果想看到更多項目,并不能像網易云音樂那樣點“下一頁”翻頁,而是需要向下拉滾動條或者向下滾動鼠標滾輪來觸發異步請求。爬蟲該如何應對這種情況呢?我們可以使用selenium的api執行js代碼將屏幕內容滾動到指定位置。
下面這段代碼會一直向下滾動項目頁,一直到滾不動為止:
- # 一直滾動到***部
- js1 = 'return document.body.scrollHeight'
- js2 = 'window.scrollTo(0, document.body.scrollHeight)'
- old_scroll_height = 0
- while browser.execute_script(js1) >= old_scroll_height:
- old_scroll_height = browser.execute_script(js1)
- browser.execute_script(js2)
- time.sleep(1)
scrollTo() 方法可把內容滾動到指定的坐標:
參數 | 描述 |
xpos | 必需。要在窗口文檔顯示區左上角顯示的文檔的 x 坐標。 |
ypos | 必需。要在窗口文檔顯示區左上角顯示的文檔的 y 坐標。 |
這里用到了scrollHeight,它和ClientHeight還有OffsetHeight有什么區別呢?
- browser = webdriver.PhantomJs()
- url = 'https://www.kaistart.com/project/more.html'
- try:
- browser.get(url)
- wait = ui.WebDriverWait(browser, 20)
- wait.until(lambda dr: dr.find_element_by_class_name('project-detail').is_displayed())
- # 一直滾動到***部
- js1 = 'return document.body.scrollHeight'
- js2 = 'window.scrollTo(0, document.body.scrollHeight)'
- old_scroll_height = 0
- while browser.execute_script(js1) >= old_scroll_height:
- old_scroll_height = browser.execute_script(js1)
- browser.execute_script(js2)
- time.sleep(1)
- sel = Selector(text=browser.page_source)
- proj_list = sel.xpath('//li[@class="project-li"]')
- browser.save_screenshot(debug.png')
這樣就會把圖片保存在項目目錄,打開看看:
- browser = webdriver.Chrome()
再次運行程序,不出所料,Chrome瀏覽器彈出來,不僅能夠正確顯示頁面,還一直在滾動:
項目全都刷出來了,想爬什么就爬吧!什么?你問我在Linux服務器上怎么爬?純命令行的那種嗎?
- from selenium import webdriver
- from pyvirtualdisplay import Display
- display = Display(visible=0, size=(800, 600))
- display.start()
- driver = webdriver.Chrome()
- driver.get("http://www.baidu.com")
- print (driver.page_source.encode('utf-8'))
- driver.quit()
- display.stop()