Scrapy與scrapy-splash框架快速載入js頁面
一、前言
我們在使用爬蟲程式爬取網頁時,一般對於靜態頁面的爬取是比較簡單的,之前寫過挺多的案例。但是對於使用js動態載入的頁面如何爬取呢?
對於動態js頁面的爬取有以下幾種爬取的方式:
#透過selenium+phantomjs實作。
phantomjs是一個無頭瀏覽器,selenium是一個自動化測試的框架,透過無頭瀏覽器請求頁面,等待js加載,再透過自動化測試selenium取得數據。因為無頭瀏覽器非常消耗資源,所在效能方面有所欠缺。
Scrapy-splash框架:
#Splash作為js渲染服務,是基於Twisted和QT開發的輕量瀏覽器引擎,並提供直接的http api。快速、輕量的特點使其容易進行分散式開發。
splash和scrapy爬蟲框架融合,兩種互相相容的特點,抓取效率較好。
二、Splash環境建置
Splash服務是基於docker容器的,所以我們需要先安裝docker容器。
2.1 docker安裝(windows 10 家用版)
如果是win 10專業版或其他作業系統,都是比較好安裝的,在windows 10家用版安裝docker需要透過toolbox(需要最新的)工具安裝才行。
關於docker的安裝,請參考文件:WIN10安裝Docker
2.2 splash安裝
docker pull scrapinghub/splash
2.3 啟動Splash服務
docker run -p 8050:8050 scrapinghub/splash
這個時候,打開你的瀏覽器,輸入192.168.99.100:8050你會看到出現了這樣的介面。
你可以在上圖紅色框框的地方輸入任意的網址,點擊後面的Render me! 來查看渲染之後的樣子
2.4 安裝python的scrapy-splash包
pip install scrapy-splash
三、scrapy爬蟲載入js專案測試,以google news為例。
由於業務需要爬取一些國外的新聞網站,如google news。但是發現居然是js程式碼。於是開始使用scrapy-splash框架,配合Splash的js渲染服務,取得資料。具體看如下程式碼:
3.1 settings.py配置資訊
# 渲染服务的urlSPLASH_URL = 'http://192.168.99.100:8050'# 去重过滤器DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'# 使用Splash的Http缓存HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'SPIDER_MIDDLEWARES = { 'scrapy_splash.SplashDeduplicateArgsMiddleware': 100, }#下载器中间件DOWNLOADER_MIDDLEWARES = { 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, }# 请求头DEFAULT_REQUEST_HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', }# 管道ITEM_PIPELINES = { 'news.pipelines.NewsPipeline': 300, }
3.2 items欄位定義
class NewsItem(scrapy.Item): # 标题 title = scrapy.Field() # 图片的url链接 Scrapy與scrapy-splash框架快速載入js頁面_url = scrapy.Field() # 新闻来源 source = scrapy.Field() # 点击的url action_url = scrapy.Field()
3.3 Spider程式碼
在spider目錄下,創建一個new_spider.py的文件,文件內容如下:
from scrapy import Spiderfrom scrapy_splash import SplashRequestfrom news.items import NewsItemclass GoolgeNewsSpider(Spider): name = "google_news" start_urls = ["https://news.google.com/news/headlines?ned=cn&gl=CN&hl=zh-CN"] def start_requests(self): for url in self.start_urls: # 通过SplashRequest请求等待1秒 yield SplashRequest(url, self.parse, args={'wait': 1}) def parse(self, response): for element in response.xpath('//p[@class="qx0yFc"]'): actionUrl = element.xpath('.//a[@class="nuEeue hzdq5d ME7ew"]/@href').extract_first() title = element.xpath('.//a[@class="nuEeue hzdq5d ME7ew"]/text()').extract_first() source = element.xpath('.//span[@class="IH8C7b Pc0Wt"]/text()').extract_first() Scrapy與scrapy-splash框架快速載入js頁面Url = element.xpath('.//img[@class="lmFAjc"]/@src').extract_first() item = NewsItem() item['title'] = title item['Scrapy與scrapy-splash框架快速載入js頁面_url'] = Scrapy與scrapy-splash框架快速載入js頁面Url item['action_url'] = actionUrl item['source'] = source yield item
3.4 pipelines.py代碼
將item的數據,儲存到mysql資料庫。
建立db_news資料庫
CREATE DATABASE db_news
建立tb_news表
CREATE TABLE tb_google_news( id INT AUTO_INCREMENT, title VARCHAR(50), Scrapy與scrapy-splash框架快速載入js頁面_url VARCHAR(200), action_url VARCHAR(200), source VARCHAR(30), PRIMARY KEY(id) )ENGINE=INNODB DEFAULT CHARSET=utf8;
class NewsPipeline(object): def __init__(self): self.conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='db_news',charset='utf8') self.cursor = self.conn.cursor() def process_item(self, item, spider): sql = '''insert into tb_google_news (title,Scrapy與scrapy-splash框架快速載入js頁面_url,action_url,source) values(%s,%s,%s,%s)''' self.cursor.execute(sql, (item["title"], item["Scrapy與scrapy-splash框架快速載入js頁面_url"], item["action_url"], item["source"])) self.conn.commit() return item def close_spider(self): self.cursor.close() self.conn.close()

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數
