1. 程式人生 > >scrapy利用scrapy-splash爬取JS動態生成的標籤

scrapy利用scrapy-splash爬取JS動態生成的標籤

1 引言

scrapy處理爬取靜態頁面,可以說是很好的工具,但是隨著技術的發展,現在很多頁面都不再是靜態頁面了,都是通過AJAX非同步載入資料動態生成的,我們如何去解決問題呢?今天給大家介紹一種方法:scrapy-splash

2 準備工作

首先需要安裝一下幾個工具
(1)docker
(2)scrapy-splash
因為這裡我的作業系統是window,所以只給出window安裝docker過程(Linux自行百度,安裝很方便的)

1)下載docker toolbox並解壓安裝即可(下載地址:https://download.csdn.net/download/qq_38003892/10391403


在這個過程中需要注意一下幾個問題:
這裡寫圖片描述
彈出這樣的對話方塊點選安裝即可

2)找到桌面上的Docker Quickstart Terminal開啟,它會自動安裝一些東西
3)修改pull源
注意:這裡預設的pull源不是國內的,所以下載速度特別慢,這裡可以通過國內的阿里雲映象庫去下載,具體做法如下:
1 開啟阿里雲官網:https://www.aliyun.com/
2 登入->進入管理控制檯
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
3 然後在docker 中輸入 docker pull xxxxxx.mirror.aliyuncs.com/scrapinghub/splash
4 下載好之後開啟splash 命令:docker run -p 8050:8050 scrapinghub/splash
5 然後在瀏覽器中輸入
這裡寫圖片描述


注意這裡的網址 是 由你的docker IP地址決定的 埠號就是你執行splash的埠號(8050)
這裡寫圖片描述
4)安裝scrapy-splash
開啟cmd 輸入命令:pip install scrapy-splash

3 測試

1 建立爬蟲專案(這裡不多說了)
2 在settings.py中設定以下幾項(若沒有則新增):

SPIDER_MIDDLEWARES = {
   'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}

# 渲染服務的url
SPLASH_URL = 'http://192.168.99.100:8050'

DOWNLOADER_MIDDLEWARES = {
   'scrapy_splash.SplashCookiesMiddleware'
: 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, } # 去重過濾器 DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' # 使用Splash的Http快取 HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

3 建立spider,並編寫
這裡用這樣一個例子,給大家說明
爬蟲目標網站:http://39.104.87.35/findex/
爬取網站今日更新截圖:
這裡寫圖片描述
網頁原始碼:
這裡寫圖片描述
爬蟲程式碼:

# -*- coding: utf-8 -*-
import scrapy
from scrapy_splash import SplashRequest

class TestSpider(scrapy.Spider):
    name = 'test'
    start_urls = ['http://39.104.87.35/findex/']

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url=url, callback=self.parse, args={'wait': 1})

    def parse(self, response):
        print(response.xpath('//ul[@id="updatelist"]/li//a/text()').extract())

爬取結果:
這裡寫圖片描述

這樣我們就大功告成了!