Mike的Python學院

Scrapy、Python、網路爬蟲

Mike Ku

Learn Code With Mike品牌創辦人

2022/01/19

詳解Scrapy框架爬取分頁資料的實用技巧(下)

Q: Scrapy爬取多頁的網頁內容
在定位到INSIDE硬塞的網路趨勢觀察網站-AI新聞( https://www.inside.com.tw/tag/ai )的「下一頁」按鈕後,接下來就要判斷這個按鈕是否存在,如果存在的話代表後續還有分頁,需要繼續往下爬取,反之,則停止,如下範例:
import scrapy
class InsideSpider(scrapy.Spider):
name = 'inside'
allowed_domains = ['www.inside.com.tw']
def parse(self, response):
yield from self.scrape(response) #爬取網頁內容
# 定位「下一頁」按鈕元素
next_page_url = response.xpath(
"//a[@class='pagination_item pagination_item-next']/@href")
if next_page_url:
url = next_page_url.get() #取得下一頁的網址
yield scrapy.Request(url, callback=self.parse) #發送請求
def scrape(self, response):
...
其中,callback關鍵字參數(Keyword Argument)代表的意思,就是在Scrapy網頁爬蟲請求下一頁的網址後,再重新執行parse()方法(Method),也就會取得下一頁的回應結果(response),爬取網頁內容,並且定位「下一頁」按鈕,判斷如果存在的話,代表還有下一頁,則取得下一頁的網址,發送請求,以此類推,直到沒有下一頁為止。
以上就是將INSIDE硬塞的網路趨勢觀察網站-AI新聞的所有分頁資料爬取下來的實作方法。當然,有時候並不想爬取那麼多的資料,可能只需要特定頁數的內容,舉例來說前3頁,就可以在每一次請求下一頁的網址前,將執行次數(count)加1,判斷如果在3次內,就發送請求,否則停止,如下範例:
import scrapy
class InsideSpider(scrapy.Spider):
name = 'inside'
allowed_domains = ['www.inside.com.tw']
count = 1 # 執行次數
def parse(self, response):
yield from self.scrape(response) #爬取網頁內容
# 定位「下一頁」按鈕元素
next_page_url = response.xpath(
"//a[@class='pagination_item pagination_item-next']/@href")
if next_page_url:
url = next_page_url.get() #取得下一頁的網址
InsideSpider.count += 1
if InsideSpider.count <= 3:
yield scrapy.Request(url, callback=self.parse) #發送請求
def scrape(self, response):
...
最後,利用以下指令來執行Scrapy網頁爬蟲:
$ scrapy crawl inside
以上就是爬取INSIDE硬塞的網路趨勢觀察網站-AI新聞的前3頁內容,讀者可依自己的需求來進行頁數的調整。
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike(https://www.learncodewithmike.com/2021/02/scraping-multiple-pages-with-scrapy.html
)網站觀看更多精彩內容。
1 0 210 0