在網(wǎng)上閱讀有關(guān)scrapy的教程也有一段時(shí)間了,可是一直沒(méi)能真正寫出能爬出數(shù)據(jù)的代碼。。。今天趁著有點(diǎn)時(shí)間,趕快實(shí)戰(zhàn)一下吧!
目標(biāo):豆瓣電影250
為啥選它呢,因?yàn)榫W(wǎng)上有關(guān)爬取豆瓣電影的教程多呀,可以很容易的復(fù)刻他人的代碼,少走彎路。
可是,可是,萬(wàn)萬(wàn)沒(méi)想到的是,這次的寫爬蟲(chóng)過(guò)程中我?guī)缀醢涯懿鹊目尤葌€(gè)遍,菜鳥(niǎo)的煩惱~ 。~
同時(shí)我也明白了,人家的以前寫的代碼,擱到現(xiàn)在未必全部適用。
先把寫的流程過(guò)一下,然后在慢慢填坑。
至于詳細(xì)的教程可以參考scrapy中文網(wǎng)
- 首先,打開(kāi)cmd,切換到你希望的路徑中,啟動(dòng)項(xiàng)目
scrapy startproject douban
-
打開(kāi)pycharm,找到所在的項(xiàng)目的文件夾并打開(kāi),如圖
圖1.png - 在items.py填寫代碼如下
import scrapy
class DoubanItem(scrapy.Item):
ranking = scrapy.Field() # 排名
name = scrapy.Field() #電影名稱
score = scrapy.Field() #得分
people_mun = scrapy.Field() #評(píng)價(jià)人數(shù)
introduction = scrapy.Field() #電影簡(jiǎn)介
- 在spiders文件夾下創(chuàng)建douban_spider.py文件,然后填寫代碼如下
import scrapy
from douban.items import DoubanItem
class DoubanSpiderSpider(scrapy.Spider):
name = 'douban_spider' #定義爬蟲(chóng)的名字
start_urls = ['https://movie.douban.com/top250?start=0&filter='] #爬取的起始頁(yè)
#定義解析函數(shù),用來(lái)解析返回的response對(duì)象
def parse(self, response):
#用xpath選擇器提取數(shù)據(jù)
infos = response.xpath("http://ol[@class='grid_view']/li")
for info in infos:
ranking = info.xpath(".//div[@class='pic']/em/text()").get()
name = info.xpath(".//div[@class='hd']/a/span[1]/text()").get()
score = info.xpath(".//div[@class='star']/span[2]/text()").get()
people_mun = info.xpath(".//div[@class='star']/span[4]/text()").get()
introduction = info.xpath(".//p[@class='quote']/span/text()").get()
item = DoubanItem(ranking=ranking, name=name, score=score, people_mun=people_mun, introduction=introduction)
yield item
next_url = response.xpath("http://span[@class='next']/a/@href").get() #獲取下一頁(yè)鏈接
if not next_url:
return
else:
next_url = 'https://movie.douban.com/top250'+next_url #將獲取的下一頁(yè)鏈接拼接完整
yield scrapy.Request(next_url, callback=self.parse) #將提取的URL返回給解析函數(shù)
- 最后在所在項(xiàng)目的文件夾下運(yùn)行power shell,輸入如下
scrapy crawl douban_spider -o douban.csv
scrapy就會(huì)自動(dòng)將提取的數(shù)據(jù)保存到CSV文件當(dāng)中去。
可是現(xiàn)實(shí)往往沒(méi)有那么美好,下面就是我開(kāi)始填坑的辛苦路程了。。。
- 首先,返回的是403還是什么的,弄得我一臉懵逼,什么鬼,網(wǎng)不好嗎?
突然間,我靈光一閃,憑著那僅有的一丟丟經(jīng)驗(yàn),headers浮現(xiàn)在了腦海當(dāng)中。
headers是放在哪里的?settings.py! - 好了終于有數(shù)據(jù)了!心里一陣激動(dòng),mmp,怎么只有前25條電影數(shù)據(jù)?
眼尖的我發(fā)現(xiàn)了這個(gè)
圖2.png
還好我看過(guò)scrapy中文網(wǎng)中的采花大盜教程,跟著在Middleware中設(shè)置一遍
def process_request(self, request, spider):
referer = request.url
if referer:
request.headers['Referer'] = referer
然后再在settings里面啟動(dòng)middleware

圖3.png
但是應(yīng)該打開(kāi)的是紅箭頭所示的,而不是綠箭頭的,這又是一個(gè)坑,自己沒(méi)動(dòng)腦子就踩上去了。。。
- 其實(shí)除了這些還有很多磕磕絆絆呢,像是我沒(méi)有拼接next_url,start_url設(shè)置成了‘https://movie.douban.com/top250’,自作聰明的添加了allowed_domains導(dǎo)致爬取出錯(cuò)。。。都是淚啊~~~
最后貼上第一個(gè)scrapy爬到的成果吧

圖4.png
作為一個(gè)全靠自己摸索前進(jìn)的菜鳥(niǎo)的學(xué)習(xí)之路,就是一個(gè)踩坑填坑的過(guò)程,但是當(dāng)你踩的坑多了,那說(shuō)明,你浪費(fèi)的時(shí)間也就多了! _ !

