介紹
在日常爬取過程中,動態網站的爬取是比較麻煩的,因為動態網站的資料是動態載入的,這時候我們需要用上selenuim中介軟體去模擬操作,獲取動態資料
開始
建立專案
1.scrapy startproject Taobao
複製程式碼
2.cd Taobao
複製程式碼
3. scrapy genspider taobao www.taobao.com
複製程式碼
開啟專案
首先我們什麼不做來爬取看看,先把setting裡面的爬蟲規則設定為False
ROBOTSTXT_OBEY = False
複製程式碼
我們在終端輸入
scrapy view "http://www.taobao.com"
複製程式碼
這時候會發現爬取到的頁面如下所示:
可以發現爬取到的頁面是一個空的框架,沒有資料,那這時怎麼辦呢??我們要用到selenuim這個中介軟體使用中介軟體
我們關注下載中介軟體( TaobaoDownloaderMiddleware)裡面的process_request函式 我們添上一行程式碼看看什麼效果:
def process_request(self, request, spider):
# Called for each request that goes through the downloader
# middleware.
# Must either:
# - return None: continue processing this request
# - or return a Response object
# - or return a Request object
# - or raise IgnoreRequest: process_exception() methods of
# installed downloader middleware will be called
print("------我是中介軟體,請求經過我------")
return None
複製程式碼
然後在seeting裡面,把下面的註釋去掉
DOWNLOADER_MIDDLEWARES = {
'Taobao.middlewares.TaobaoDownloaderMiddleware': 543,
}
複製程式碼
我們執行一下看看效果:
scrapy view "http://www.taobao.com"
複製程式碼
效果:
------我是中介軟體,請求經過我------
2018-08-29 15:38:21 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://www.taobao.com/> from <GET http://www.taobao.com>
------我是中介軟體,請求經過我------
2018-08-29 15:38:21 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.taobao.com/> (referer: None)
複製程式碼
說明中介軟體是有效果的,如果我們在中介軟體模擬一些操作,是不是就能獲取動態資料呢?
middlewares中介軟體的操作
首先匯入selenium
from selenium import webdriver
#無介面執行
from selenium.webdriver.chrome.options import Options
複製程式碼
在 process_request函式中寫入如下程式碼
def process_request(self, request, spider):
# Called for each request that goes through the downloader
# middleware.
print("------我是中介軟體,請求經過我------")
#設定無介面執行
option = Options()
option.add_argument("--headless")
#建立一個driver物件
#driver = webdriver.Chrome()
driver = webdriver.Chrome(chrome_options=option)
#等待15秒
driver.implicitly_wait(15)
driver.get(request.url)
# 讓頁面滾動最底層 模擬人的操作
js = 'window.scrollTo(0,document.body.scrollHeight)'
# 執行js
driver.execute_script(js)
# 獲取內容
content = driver.page_source
from scrapy.http import HtmlResponse
# 建立一個resp物件返回至解析函式
resp = HtmlResponse(request.url,request=request,body=content,encoding='utf-8')
return resp
return None
複製程式碼
好了,這時已經獲取到動態資料了,這裡就不解析了,以上就是動態網站爬取的思路