iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 22
2
AI & Data

Scrapy爬蟲與資料處理30天筆記系列 第 22

[Day 22] 實戰:Scrpay 爬取動態網頁

嗨,昨天說明了如何設定Scrapy-splash爬取動態網頁,包含透過docker啟動Splash來幫助渲染Js,以及ScprayMiddlewares的設定,今天我們會以來實際操做一次如何使用,至於設定的詳情,請見昨天的文章,那我們就開始吧!

今天我們要爬的範例網站為 http://quotes.toscrape.com/js/

首先,來看網頁的內容(如下圖),假設我們今天要抓的是文字,可以看到它在<div class="quote"></div>內的<span class="text"></span>
Imgur

可以來撰寫程式了,在spider/內新增一個spider程式碼:

import scrapy
from bs4 import BeautifulSoup 

class NewsSpider(scrapy.Spider):
    name = "quotesjs"
    start_urls = ['http://quotes.toscrape.com/js/']
    
    def parse(self, response):
        soup = BeautifulSoup(response.text, 'lxml')
        quotes = soup.select('div.quote span.text')
        for q in quotes:
            print(q.text)

執行後會發現我們沒抓到任何的內容,這是因為裡面的文字是透過js渲染的,所以我們現在來更改程式碼,為了測試是否有爬到文字,所以我們重寫了start_requests()的內容,將start_urls裡的連結透過SplashRequest送到parse的function,在parse內解析網頁內容,而這個部分我沒有做變更,如下程式碼:

import scrapy
from bs4 import BeautifulSoup 
from scrapy_splash import SplashRequest
class NewsSpider(scrapy.Spider):
    name = "quotesjs"
    start_urls = ['http://quotes.toscrape.com/js/']

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.parse, args={'wait': 0.5})
    
    def parse(self, response):
        soup = BeautifulSoup(response.text, 'lxml')
        quotes = soup.select('div.quote span.text')
        for q in quotes:
            print(q.text)

執行結果:

Imgur

上面可以看到[scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/js/ via http://localhost:8050/render.html> 表示我們有透過Splash渲染內容,因此可以看到下面為爬到的文字,表示成功了。

但是這樣只有爬到一頁而已,如果我們要切頁怎麼做呢?很簡單只要取得它的href,我們先來看下一頁的內容:

Imgur

可以看到它就在<li class="next"></i>內的<a>內,為什麼不直接抓<a>是因為<a>可能有很多個,但在<li class="next"></i>的只有這一個,理解以後我們只需要新增幾行程式碼在parse下面:

print('------------------------------------')
next_page_href = soup.select_one('li.next a').get('href')
next_url = 'http://quotes.toscrape.com' +  next_page_href
yield SplashRequest(next_url, self.parse, args={'wait': 0.5})
  • print()只是用來區隔不同頁用的
  • next_page_href<a>內的href內容,取到後我們接起來變成next_url下一頁的url,再透過SplashRequest的callback去做。

執行後就可以看到下圖,我們爬到了多頁的內容,透過--分隔開:

Imgur

好的,接續昨天的主題,今天用一個簡單的範例網站說明了如何使用Splash爬取動態的網站。

最近真的忙到焦頭爛額(暈)
上週末跑高雄兩天、這週期中考、拜六要跑臺北,學校還有很多事務在趕(現在是在抱怨嗎?)
所以如果有誤的話還請多包涵(歡迎回覆糾正錯字了!),不過這幾天是寫範例應該比較不會有誤吧我覺得,畢竟都有自己再重寫過程式碼測試一次,總之就是默默的也第22天了,不管有沒有人看都會盡力的完成這最後幾天的(鞠躬)。

那就明天見了!


上一篇
[Day 21] Scrapy 爬動態網頁
下一篇
[Day 23] Scrapy 爬免費代理(Proxy)
系列文
Scrapy爬蟲與資料處理30天筆記30

1 則留言

0
SunAllen
iT邦研究生 1 級 ‧ 2018-11-06 12:18:23

不管有沒有人看

報告,我一直在看/images/emoticon/emoticon07.gif

plusone iT邦新手 5 級 ‧ 2018-11-06 12:29:14 檢舉

報告,我一直在看

這句真的是今年冬天最溫暖了謝謝你
/images/emoticon/emoticon47.gif

我要留言

立即登入留言