Scrapy爬取豆瓣電影TOP250并保存數(shù)據(jù)、下載海報(bào)圖片
https://movie.douban.com/top250。需要爬取的字段為排名

環(huán)境:
????---windows 11
????---python 3.8.9
????---Pycharm

首先打開windows命令終端,切換到想保存項(xiàng)目的文件夾,如:D:\Python Porjects:
新建scrapy項(xiàng)目:
切換到douban文件夾:
在該文件夾下創(chuàng)建兩個(gè)爬蟲模板:
創(chuàng)建好后,在windows資源管理器中打開項(xiàng)目所在目錄,右鍵Open Folder as PyCharm Project。也可以先打開PyCharm,在PyCharm的歡迎界面將項(xiàng)目文件夾拖入。
打開之后,為項(xiàng)目創(chuàng)建一個(gè)虛擬環(huán)境,懶的話可以直接用略過。虛擬環(huán)境的用處一般是項(xiàng)目需要給別人用,需要打包當(dāng)前環(huán)境下所有的依賴項(xiàng)的時(shí)候。
虛擬環(huán)境創(chuàng)建方法:在PyCharm中,F(xiàn)ile——settings——Project:(項(xiàng)目名)——單擊Python Interpreter,找到Python Interpreter最右邊的齒輪,單擊它,Add,在彈出的選項(xiàng)中(Virtualenv Environment)選擇Location(路徑),Base interpreter為默認(rèn)當(dāng)前默認(rèn)解釋器就好。其他的不用填,直接點(diǎn)ok。
創(chuàng)建好虛擬環(huán)境后,所有的依賴項(xiàng)都從虛擬環(huán)境安裝。在當(dāng)前項(xiàng)目下的PyCharm中,選擇底部的Terminal,打開Pycharm內(nèi)置的終端,查看當(dāng)前虛擬環(huán)境下的依賴項(xiàng):
當(dāng)自己的項(xiàng)目需要給別人用時(shí),依賴項(xiàng)打包:

正文開始

1,設(shè)置爬蟲字段
安裝好依賴項(xiàng)后,切換到項(xiàng)目下的items.py文件,先來設(shè)置預(yù)爬取的字段,代碼如下:

2,編寫爬蟲文件:
接著切換到項(xiàng)目文件夾下的爬蟲文件db.py,開始解析響應(yīng)。代碼如下:
在終端運(yùn)行scrapy crawl db,字段都采集到了,并且數(shù)據(jù)格式都正確。但是,這僅僅是第一頁的數(shù)據(jù),接下來修改一下爬蟲代碼:
修改的部分在第一個(gè)回調(diào)函數(shù)parse()的最后,next_page_urls部分的代碼就是翻頁的邏輯。
上面的兩種情況可能會(huì)導(dǎo)致多爬25條,那是因?yàn)榈谝豁摰逆溄佑袃蓚€(gè):
https://movie.douban.com/top250?start=0&filter=

3,下載器中間件設(shè)置COOKIES:
a, 為請求設(shè)置cookies
實(shí)現(xiàn)好了翻頁之后,最重要要做的事就是模擬登錄,豆瓣電影,請求過多,Ip就會(huì)被封了,登錄后就可以無限訪問。設(shè)置cookies是一種很好的辦法。先從網(wǎng)頁登錄一下豆瓣賬號(hào),打開瀏覽器的開發(fā)者調(diào)試工具,將請求頭中的cookies復(fù)制下來。然后切換到項(xiàng)目文件下的middlewares.py——下載器中間件,為請求設(shè)置cookies,代碼如下:
為了簡化代碼,將原來的爬蟲中間件全部pass掉了,下載器中間件的里的類方法也pass掉了。只在類方法process_request()中設(shè)置了cookies。運(yùn)行的時(shí)候還是得加上。
b,隨機(jī)的User-Agent
如果要切換隨機(jī)的User-Agent,也是在中間件里定義,代碼如下:
c,為請求設(shè)置代理或者代理池(略)
寫好后,在項(xiàng)目文件夾下的settings.py文件中開啟中間件,代碼如下:

4,Scrapy數(shù)據(jù)管道保存數(shù)據(jù)
首先csv和json保存方法很簡單,打開終端:
管道文件編寫都在項(xiàng)目文件夾下的pipelines.py中。
a,保存Json文件數(shù)據(jù)的管道:
寫好之后在項(xiàng)目文件夾下的settings.py文件中配置管道:
b,保存數(shù)據(jù)到csv文件的管道:
只要將encoding的值寫成utf-8-sig,用excel打開的時(shí)候就不會(huì)出現(xiàn)亂碼的情況。寫好之后在settings.py中配置管道。
c,保存數(shù)據(jù)到Excel文檔的管道:
管道寫好后,在項(xiàng)目文件夾下的settings.py中啟用管道:
d,保存數(shù)據(jù)到sqlite數(shù)據(jù)庫的管道:
同樣的,在settings.py中開啟管道:
e,第五個(gè)管道是MySql,代碼如下:
寫好之后在settings.py中配置管道:
f,保存海報(bào)圖片的管道:
我在預(yù)設(shè)字段的時(shí)候預(yù)設(shè)了電影的海報(bào),那就最后再配置一個(gè)下載文件的管道,這個(gè)管道要繼承scrapy內(nèi)置的文件管道,對(duì)海報(bào)圖片進(jìn)行重命名(以電影名稱命名),代碼如下:
寫好之后在settings.py中配置管道并開啟文件存儲(chǔ)路徑:
下載海報(bào)圖片沒有繼承scrapy的ImagesPipeline,因?yàn)閟crapy的圖片管道是繼承文件管道的,而且scrapy在請求圖片下載的時(shí)候可能會(huì)多幾個(gè)字節(jié)少幾個(gè)字節(jié)都是有可能的,但是下載文件肯定是原數(shù)據(jù)下載,也就是說,如果在下載高清圖片的時(shí)候,圖片管道和文件管道的質(zhì)量可能會(huì)相差很多。用scrapy下載文件,推薦用文件管道。如果遇到因?yàn)閞obots文件規(guī)則禁止下載圖片的話,在settings.py里將遵循robots的規(guī)則設(shè)定改為False就行了:
至此,一個(gè)爬取豆瓣電影TOP250的爬蟲就制作完成了。
最后運(yùn)行:
scrapy crawl db