phantomjs是一個沒有界面的瀏覽器,支持各類web標準,提供DOM 處理, CSS 選擇器, JSON, Canvas, 和 SVG,對於爬取一些通過js渲染的頁面很是有用。可是phantomjs默認的user-agent通常都被那些防採集的網站屏蔽了,鬼都知道用這個瀏覽器,都是來爬取網頁的,不是正常的用戶。web
phantomjs至關於一個真實的瀏覽器,一個瀏覽器該加載的該渲染的它都加載都渲染,只是沒有界面而已。因此爬取網頁的速度很慢。若是能夠不加載圖片,網頁加載速度就會快很多. 瀏覽器
下面是PhantomJS禁用加載圖片,並隨機切換UA的scrapy middleware的完整代碼緩存
from selenium import webdriver dom from selenium.webdriver.common.by import By scrapy from selenium.webdriver.support import expected_conditions as EC ide from selenium.webdriver.support.wait import WebDriverWait 網站 from selenium.webdriver.common.desired_capabilities import DesiredCapabilities url from fake_useragent import UserAgent spa from scrapy.http import HtmlResponse code
class SeleniumSpiderMiddleware(object): def process_request(self, request, spider): # 隨機請求頭 ua = UserAgent() ua_use = ua.random # 設置請求頭 dcap = dict(DesiredCapabilities.PHANTOMJS) # --load-images=false 圖片不加載 # --disk - cache = true 啓用緩存 # --max-disk-cache-size=1024 設置最大緩存數量 SERVICE_ARGS = [' --disk-cache=true','--max-disk-cache-size=1024', '--load-images=false'] dcap["phantomjs.page.settings.userAgent"] = ua_use # 請求頭生效, 圖片不加載生效 driver = webdriver.PhantomJS(desired_capabilities=dcap, service_args=SERVICE_ARGS) # 請求的url是這個 url = request.url driver.get(url) # 設置等待全部的td標籤加載完成 locator = (By.CSS_SELECTOR, 'tbody > tr > td') WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located(locator)) # 截圖看是否有圖片加載 driver.save_screenshot('aqi.png') body = driver.page_source driver.close() # body必須爲bytes類型 response = HtmlResponse(url=url, request=request, encoding='utf8', body=body.encode()) # 直接return response 直接將response返回到engine不會從新下載 return response |