phantomjs集成到scrapy中,並禁用圖片,切換UA

phantomjs是一個沒有界面的瀏覽器,支持各類web標準,提供DOM 處理, CSS 選擇器, JSON, Canvas, SVG,對於爬取一些通過js渲染的頁面很是有用。可是phantomjs默認的user-agent通常都被那些防採集的網站屏蔽了,鬼都知道用這個瀏覽器,都是來爬取網頁的,不是正常的用戶。web

phantomjs至關於一個真實的瀏覽器,一個瀏覽器該加載的該渲染的它都加載都渲染,只是沒有界面而已。因此爬取網頁的速度很慢。若是能夠不加載圖片,網頁加載速度就會快很多. 瀏覽器

下面是PhantomJS禁用加載圖片,並隨機切換UAscrapy 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

相關文章
相關標籤/搜索