在網(wǎng)上閱讀有關(guān)scrapy的教程也有一段時間了独旷,可是一直沒能真正寫出能爬出數(shù)據(jù)的代碼音榜。望几。邓夕。今天趁著有點時間,趕快實戰(zhàn)一下吧顷链!
目標(biāo):豆瓣電影250
為啥選它呢目代,因為網(wǎng)上有關(guān)爬取豆瓣電影的教程多呀,可以很容易的復(fù)刻他人的代碼嗤练,少走彎路榛了。
可是,可是煞抬,萬萬沒想到的是霜大,這次的寫爬蟲過程中我?guī)缀醢涯懿鹊目尤葌€遍,菜鳥的煩惱~ 革答。~
同時我也明白了战坤,人家的以前寫的代碼曙强,擱到現(xiàn)在未必全部適用。
先把寫的流程過一下途茫,然后在慢慢填坑碟嘴。
至于詳細(xì)的教程可以參考scrapy中文網(wǎng)
- 首先,打開cmd囊卜,切換到你希望的路徑中娜扇,啟動項目
scrapy startproject douban
-
打開pycharm,找到所在的項目的文件夾并打開栅组,如圖
- 在items.py填寫代碼如下
import scrapy
class DoubanItem(scrapy.Item):
ranking = scrapy.Field() # 排名
name = scrapy.Field() #電影名稱
score = scrapy.Field() #得分
people_mun = scrapy.Field() #評價人數(shù)
introduction = scrapy.Field() #電影簡介
- 在spiders文件夾下創(chuàng)建douban_spider.py文件雀瓢,然后填寫代碼如下
import scrapy
from douban.items import DoubanItem
class DoubanSpiderSpider(scrapy.Spider):
name = 'douban_spider' #定義爬蟲的名字
start_urls = ['https://movie.douban.com/top250?start=0&filter='] #爬取的起始頁
#定義解析函數(shù),用來解析返回的response對象
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() #獲取下一頁鏈接
if not next_url:
return
else:
next_url = 'https://movie.douban.com/top250'+next_url #將獲取的下一頁鏈接拼接完整
yield scrapy.Request(next_url, callback=self.parse) #將提取的URL返回給解析函數(shù)
- 最后在所在項目的文件夾下運行power shell玉掸,輸入如下
scrapy crawl douban_spider -o douban.csv
scrapy就會自動將提取的數(shù)據(jù)保存到CSV文件當(dāng)中去刃麸。
可是現(xiàn)實往往沒有那么美好,下面就是我開始填坑的辛苦路程了司浪。嫌蚤。。
- 首先断傲,返回的是403還是什么的,弄得我一臉懵逼智政,什么鬼认罩,網(wǎng)不好嗎?
突然間续捂,我靈光一閃垦垂,憑著那僅有的一丟丟經(jīng)驗,headers浮現(xiàn)在了腦海當(dāng)中牙瓢。
headers是放在哪里的劫拗?settings.py! - 好了終于有數(shù)據(jù)了矾克!心里一陣激動页慷,mmp,怎么只有前25條電影數(shù)據(jù)胁附?
眼尖的我發(fā)現(xiàn)了這個
還好我看過scrapy中文網(wǎng)中的采花大盜教程酒繁,跟著在Middleware中設(shè)置一遍
def process_request(self, request, spider):
referer = request.url
if referer:
request.headers['Referer'] = referer
然后再在settings里面啟動middleware
但是應(yīng)該打開的是紅箭頭所示的,而不是綠箭頭的控妻,這又是一個坑州袒,自己沒動腦子就踩上去了。弓候。郎哭。
- 其實除了這些還有很多磕磕絆絆呢他匪,像是我沒有拼接next_url,start_url設(shè)置成了‘https://movie.douban.com/top250’夸研,自作聰明的添加了allowed_domains導(dǎo)致爬取出錯邦蜜。。陈惰。都是淚啊~~~
最后貼上第一個scrapy爬到的成果吧
作為一個全靠自己摸索前進(jìn)的菜鳥的學(xué)習(xí)之路畦徘,就是一個踩坑填坑的過程,但是當(dāng)你踩的坑多了抬闯,那說明井辆,你浪費的時間也就多了! _ !