動態網站的爬取

小杰哥001發表於2018-08-29

介紹

在日常爬取過程中,動態網站的爬取是比較麻煩的,因為動態網站的資料是動態載入的,這時候我們需要用上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
複製程式碼

好了,這時已經獲取到動態資料了,這裡就不解析了,以上就是動態網站爬取的思路

相關文章