Scrapy學習-16-動態網頁技術

Selenium瀏覽器自動化測試框架
簡介
  •   Selenium 是一個用於Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操做同樣。
  •   支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
  •   這個工具的主要功能包括:測試與瀏覽器的兼容性——測試你的應用程序看是否可以很好得工做在不一樣瀏覽器和操做系統之上。
  •   測試系統功能——建立迴歸測試檢驗軟件功能和用戶需求。支持自動錄製動做和自動生成 .Net、Java、Perl等不一樣語言的測試腳本
 
功能
  •   框架底層使用JavaScript模擬真實用戶對瀏覽器進行操做。測試腳本執行時,瀏覽器自動按照腳本代碼作出點擊,輸入,打開,驗證等操做,就像真實用戶所作的同樣,從終端用戶的角度測試應用程序。
  •   使瀏覽器兼容性測試自動化成爲可能,儘管在不一樣的瀏覽器上依然有細微的差異。
  •   使用簡單,可以使用Java,Python等多種語言編寫用例腳本
 
安裝
1 pip install selenium

 

官方文檔
1 http://selenium-python.readthedocs.io/

 

驅動下載
Chrome  https://sites.google.com/a/chromium.org/chromedriver/downloads Edge https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ Firefox https://github.com/mozilla/geckodriver/releases

 

基本使用之模擬登錄知乎
from selenium import webdriver from scrapy.selector import Selector browser = webdriver.Chrome( executable_path="E:\Python Project\scrapyproject\_ArticleSpider\chromedriver_win32\chromedriver.exe" ) browser.get("https://www.zhihu.com/#signin") browser.find_element_by_css_selector(".view-signin input[name='account']").send_keys("18412542552") browser.find_element_by_css_selector(".view-signin input[name='password']").send_keys("as15fQAfa") browser.find_element_by_css_selector(".view-signin button.sign-button").click() # browser.quit()

 

基本使用之模擬登錄微博並下拉滾動條
from selenium import webdriver import time browser = webdriver.Chrome( executable_path="E:\Python Project\scrapyproject\_ArticleSpider\chromedriver_win32\chromedriver.exe" ) browser.get("https://weibo.com/") time.sleep(5) browser.find_element_by_css_selector("#loginname").send_keys("<username>") browser.find_element_by_css_selector(".info_list.password input[node-type='password']").send_keys("<password>") browser.find_element_by_css_selector(".info_list.login_btn a[node-type='submitBtn']").click() for i in range(3): browser.execute_script("window.scrollTo(0, document.body.scrollHeight); var lenOfPage=document.body.scrollHeight; return lenOfPage;") time.sleep(3) # browser.quit()

 

基本使用之不加載圖片提高頁面加載速度
from selenium import webdriver chrome_opt = webdriver.ChromeOptions() prefs = {"profile.managed_default_content_settings.images":2} chrome_opt.add_experimental_option("prefs", prefs) browser = webdriver.Chrome( executable_path="E:\Python Project\scrapyproject\_ArticleSpider\chromedriver_win32\chromedriver.exe", chrome_options=chrome_opt ) browser.get("https://www.taobao.com/") # browser.quit()

 

基本使用之隱藏chrom圖形界面
注意: 目前只能在linux中使用
 
下載相關模塊
1 pip install pyvirtualdisplay
相關依賴下載
sudo apt-get install xvfb pip install xvfbwrapper
使用步驟
from pyvirtualdisplay import Display display = Display(visible=0, size=(800, 600)) display.start() browser = webdriver.Chrome( executable_path="E:\Python Project\scrapyproject\_ArticleSpider\chromedriver_win32\chromedriver.exe" ) browser.get(https://www.taobao.com/) # browser.quit()

 

基本使用之phantomjs
特色
  •   無界面的瀏覽器,效率高
  •   在linux無圖形化界面時使用較多
  •   多進程下phantomjs性能會嚴重降低
  •   多線程執行時不穩定
 
下載
1 http://phantomjs.org/download.html
簡單使用
from selenium import webdriver browser = webdriver.PhantomJS( executable_path="E:\Python Project\scrapyproject\_ArticleSpider\phantomjs-2.1.1-windows\bin\phantomjs.exe" ) browser.get("https://item.taobao.com/item.htm?id=558638145403&ali_refid=a3_430673_1006:1109358544:N:%E6%89%8B%E6%9C%BA%E8%8B%B9%E6%9E%9C%E6%89%8B%E6%9C%BA:5d77c360cd1e64043b2f430be7531705&ali_trackid=1_5d77c360cd1e64043b2f430be7531705&spm=a2e15.8261149.07626516002.2") print(browser.page_source) browser.quit()

 

集成selenium到scrapy框架中
爲每個spider建立一個chrom瀏覽器對象
import scrapy from scrapy.xlib.pydispatch import dispatcher from scrapy import signals from selenium import webdriver class JobboleSpider(scrapy.Spider): name = "jobbole" allowed_domains = ["blog.jobbole.com"] start_urls = ['http://blog.jobbole.com/all-posts/'] def __init__(self): self.browser = webdriver.Chrome( executable_path="E:\Python Project\scrapyproject\_ArticleSpider\chromedriver_win32\chromedriver.exe" ) super(JobboleSpider, self).__init__() dispatcher.connect(self.spider_closed, signals.spider_closed) def spider_closed(self, spider): self.browser.quit() def parse(self, response): pass
編寫middleware在下載時使用chrom打開網頁
import time from scrapy.http import HtmlResponse class JSPageMiddleware(object): def process_request(self, request, spider): if spider.name == "jobbole": spider.browser.get(request.url) time.sleep(3) return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request)
配置settings
DOWNLOADER_MIDDLEWARES = { 'ArticleSpider.middlewares.JSPageMiddleware': 1, }

 

重寫downloader實現selenium支持異步請求
須要咱們熟悉並遵照scrapy編程規範,能夠參考
1 https://github.com/flisky/scrapy-phantomjs-downloader

 

其它瀏覽器自動化測試工具
更加輕量型的加載動態頁面的工具splash、grid
特色
  •   比chrom和phantomjs性能更優
  •   支持分佈式爬蟲
  •   穩定性不如chrom高
splash-github項目
1 https://github.com/scrapy-plugins/scrapy-splash
selenium擴展grid
1 https://www.oschina.net/question/tag/selenium-grid

 

其它瀏覽器自動化測試工具splinter (純python開發)
1 https://github.com/cobrateam/splinter
相關文章
相關標籤/搜索