使用python框架Scrapy爬取數(shù)據(jù)的操作步驟
什么是Scrapy?
Scrapy是一個(gè)基于Python的強(qiáng)大的開源網(wǎng)絡(luò)爬蟲框架,用于從網(wǎng)站上抓取信息。它提供了廣泛的功能,使得爬取和分析數(shù)據(jù)變得相對容易。Scrapy的特點(diǎn)包括:
- 強(qiáng)大的數(shù)據(jù)提取工具,支持XPath和CSS選擇器。
- 簡化的HTTP請求和響應(yīng)處理。
- 可配置的下載中間件,用于處理不同類型的請求。
- 數(shù)據(jù)存儲支持,包括JSON、CSV、XML等。
- 并發(fā)請求管理,提高效率。
創(chuàng)建Scrapy項(xiàng)目
要使用Scrapy來爬取網(wǎng)站,首先需要創(chuàng)建一個(gè)Scrapy項(xiàng)目。下面是創(chuàng)建一個(gè)名為douban_top250的Scrapy項(xiàng)目的步驟:
- 打開終端,導(dǎo)航到您想要創(chuàng)建項(xiàng)目的目錄,并運(yùn)行以下命令:
scrapy startproject douban_top250
- 進(jìn)入項(xiàng)目目錄:
cd douban_top250
- 創(chuàng)建一個(gè)用于爬取電影信息的Spider:
scrapy genspider douban_movie douban.com
現(xiàn)在,項(xiàng)目的基本結(jié)構(gòu)已經(jīng)創(chuàng)建,包括爬蟲(Spider)模板文件。
編寫Scrapy Spider
Spider是Scrapy項(xiàng)目中負(fù)責(zé)定義如何抓取信息的部分。需要編輯Spider文件,以指定要爬取的URL、如何處理響應(yīng)和如何提取數(shù)據(jù)。
以下是一個(gè)示例Spider代碼:
import scrapy from douban_top250.items import DoubanTop250Item class DoubanMovieSpider(scrapy.Spider): name = 'douban_movie' # Spider的名稱 allowed_domains = ['douban.com'] # 允許爬取的域名 start_urls = ['https://movie.douban.com/top250'] # 起始URL def parse(self, response): for movie in response.css('ol.grid_view li'): item = DoubanTop250Item() # 創(chuàng)建一個(gè)DoubanTop250Item對象用于存儲數(shù)據(jù) item['rank'] = movie.css('em::text').get() # 提取電影排名 item['title'] = movie.css('.title::text').get() # 提取電影標(biāo)題 item['rating'] = movie.css('.rating_num::text').get() # 提取電影評分 item['link'] = movie.css('a::attr(href)').get() # 提取電影鏈接 yield item # 返回Item以供后續(xù)處理 next_page = response.css('.next a::attr(href)').get() # 提取下一頁的鏈接 if next_page is not None: yield response.follow(next_page, self.parse) # 繼續(xù)爬取下一頁
在這個(gè)Spider中,指定了Spider的名稱(name)、允許的域名(allowed_domains)、起始URL(start_urls)以及如何解析響應(yīng)的方法(parse)。使用CSS選擇器來提取排名、標(biāo)題、評分和鏈接等信息,并將它們保存到一個(gè)自定義的Item類中。
創(chuàng)建Item類
在Scrapy中,Item是用來定義要提取的數(shù)據(jù)結(jié)構(gòu)的類。在的項(xiàng)目中,創(chuàng)建了一個(gè)DoubanTop250Item類,用于定義電影信息的數(shù)據(jù)結(jié)構(gòu)。以下是Item類的代碼:
import scrapy class DoubanTop250Item(scrapy.Item): rank = scrapy.Field() title = scrapy.Field() rating = scrapy.Field() link = scrapy.Field()
在這個(gè)類中,定義了四個(gè)字段:排名(rank)、標(biāo)題(title)、評分(rating)和鏈接(link)。這些字段將用于存儲從網(wǎng)頁上提取的數(shù)據(jù)。
配置數(shù)據(jù)存儲
Scrapy允許您配置不同的數(shù)據(jù)存儲選項(xiàng),包括JSON、CSV、XML等格式。我選擇將數(shù)據(jù)保存為JSON文件。
在項(xiàng)目的設(shè)置中,配置了FEEDS設(shè)置,以指定JSON文件的保存位置和格式:
FEEDS = { 'douban_top250.json': { 'format': 'json', 'encoding': 'utf-8', }, }
這將數(shù)據(jù)以JSON格式保存到名為douban_top250.json的文件中。
運(yùn)行Scrapy爬蟲
一旦編寫好Spider和Item類,并配置好數(shù)據(jù)存儲選項(xiàng),就可以運(yùn)行Scrapy爬蟲來抓取豆瓣Top 250電影數(shù)據(jù)了。運(yùn)行以下命令:
scrapy crawl douban_movie
Scrapy將開始訪問豆瓣電影網(wǎng)站的頁面,抓取數(shù)據(jù)并保存為JSON文件。
拿到的數(shù)據(jù)如圖:
處理常見問題
在爬取網(wǎng)站數(shù)據(jù)時(shí),可能會遇到各種常見問題,如請求限制、頁面解析問題和網(wǎng)絡(luò)連接問題。以下是一些處理這些問題的一般指導(dǎo):
請求限制:如果您遇到HTTP狀態(tài)碼403(禁止訪問)或其他請求限制問題,可以嘗試設(shè)置合適的User-Agent、使用IP代理、限制請求速度以及尊重網(wǎng)站的robots.txt規(guī)則。
本次遇到的問題:
DEBUG: Crawled (403) <GET https://movie.douban.com/top250> (referer: None)
解決方案: User-Agent設(shè)置:嘗試在Scrapy中設(shè)置一個(gè)常見的瀏覽器User-Agent,以使請求看起來更像是由瀏覽器發(fā)出的。這可以通過在Spider中添加
USER_AGENT
設(shè)置來完成,如下:USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
頁面解析問題:在編寫Spider時(shí),確保您的選擇器和規(guī)則正確。經(jīng)常檢查網(wǎng)站的HTML結(jié)構(gòu),以適應(yīng)可能的更改。
網(wǎng)絡(luò)連接問題:網(wǎng)絡(luò)連接問題可能會導(dǎo)致請求超時(shí)或失敗。確保您
的網(wǎng)絡(luò)連接穩(wěn)定,使用合理的超時(shí)設(shè)置,以及適當(dāng)處理連接異常。
結(jié)論
使用Scrapy爬取豆瓣Top 250電影數(shù)據(jù)是一個(gè)很好的示例,展示了如何創(chuàng)建一個(gè)功能強(qiáng)大的網(wǎng)絡(luò)爬蟲,用于從網(wǎng)站上抓取數(shù)據(jù)。在本文中,涵蓋了創(chuàng)建Scrapy項(xiàng)目、編寫Spider、數(shù)據(jù)提取、保存為JSON文件以及處理常見問題的方方面面。Scrapy為爬蟲開發(fā)者提供了強(qiáng)大的工具,使得數(shù)據(jù)抓取變得更容易。
以上就是使用python框架Scrapy爬取數(shù)據(jù)的操作步驟的詳細(xì)內(nèi)容,更多關(guān)于python Scrapy爬取數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python?from?import導(dǎo)包ModuleNotFoundError?No?module?named
最近在執(zhí)行python腳本時(shí),from?import的模塊沒有被加載進(jìn)來,找不到module,這篇文章主要給大家介紹了關(guān)于Python?from?import導(dǎo)包ModuleNotFoundError?No?module?named找不到模塊問題的解決辦法,需要的朋友可以參考下2022-08-08Python3實(shí)現(xiàn)獲取圖片文字里中文的方法分析
這篇文章主要介紹了Python3實(shí)現(xiàn)獲取圖片文字里中文的方法,結(jié)合實(shí)例形式分析了Python基于文字識別引擎tesseract-ocr針對圖片里中文識別的相關(guān)操作技巧與操作注意事項(xiàng),需要的朋友可以參考下2018-12-12一個(gè)簡單的python爬蟲程序 爬取豆瓣熱度Top100以內(nèi)的電影信息
這篇文章主要為大家詳細(xì)介紹了一個(gè)簡單的python爬蟲程序,爬取豆瓣熱度Top100以內(nèi)的電影信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04淺談Python3中datetime不同時(shí)區(qū)轉(zhuǎn)換介紹與踩坑
最近的項(xiàng)目需要根據(jù)用戶所屬時(shí)區(qū)制定一些特定策略,學(xué)習(xí)、應(yīng)用了若干python3的時(shí)區(qū)轉(zhuǎn)換相關(guān)知識,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08