Python爬蟲筆記(4):利用scrapy爬取豆瓣電影250

weixin_34402408發表於2018-11-10

在網上閱讀有關scrapy的教程也有一段時間了,可是一直沒能真正寫出能爬出資料的程式碼。。。今天趁著有點時間,趕快實戰一下吧!

目標:豆瓣電影250

為啥選它呢,因為網上有關爬取豆瓣電影的教程多呀,可以很容易的復刻他人的程式碼,少走彎路。
可是,可是,萬萬沒想到的是,這次的寫爬蟲過程中我幾乎把能踩的坑全踩個遍,菜鳥的煩惱~ 。~
同時我也明白了,人家的以前寫的程式碼,擱到現在未必全部適用。

先把寫的流程過一下,然後在慢慢填坑。

至於詳細的教程可以參考scrapy中文網

  1. 首先,開啟cmd,切換到你希望的路徑中,啟動專案
scrapy startproject douban
  1. 開啟pycharm,找到所在的專案的資料夾並開啟,如圖


    14645088-cdc74306283f9774.png
    圖1.png
  2. 在items.py填寫程式碼如下
import scrapy


class DoubanItem(scrapy.Item):
    ranking = scrapy.Field() # 排名
    name = scrapy.Field() #電影名稱
    score = scrapy.Field() #得分
    people_mun = scrapy.Field() #評價人數
    introduction = scrapy.Field() #電影簡介
  1. 在spiders資料夾下建立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='] #爬取的起始頁

#定義解析函式,用來解析返回的response物件
    def parse(self, response):
        #用xpath選擇器提取資料
        infos = response.xpath("//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("//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返回給解析函式
  1. 最後在所在專案的資料夾下執行power shell,輸入如下
scrapy crawl douban_spider -o douban.csv

scrapy就會自動將提取的資料儲存到CSV檔案當中去。

可是現實往往沒有那麼美好,下面就是我開始填坑的辛苦路程了。。。

  • 首先,返回的是403還是什麼的,弄得我一臉懵逼,什麼鬼,網不好嗎?
    突然間,我靈光一閃,憑著那僅有的一丟丟經驗,headers浮現在了腦海當中。
    headers是放在哪裡的?settings.py!
  • 好了終於有資料了!心裡一陣激動,mmp,怎麼只有前25條電影資料?
    眼尖的我發現了這個
    14645088-d2b5cb57992c74ad.png
    圖2.png

    還好我看過scrapy中文網中的採花大盜教程,跟著在Middleware中設定一遍
 def process_request(self, request, spider):
        referer = request.url
        if referer:
            request.headers['Referer'] = referer

然後再在settings裡面啟動middleware


14645088-329357c84a71817f.png
圖3.png

但是應該開啟的是紅箭頭所示的,而不是綠箭頭的,這又是一個坑,自己沒動腦子就踩上去了。。。

  • 其實除了這些還有很多磕磕絆絆呢,像是我沒有拼接next_url,start_url設定成了‘https://movie.douban.com/top250’,自作聰明的新增了allowed_domains導致爬取出錯。。。都是淚啊~~~

最後貼上第一個scrapy爬到的成果吧


14645088-481bb0fc0cd695cc.png
圖4.png

作為一個全靠自己摸索前進的菜鳥的學習之路,就是一個踩坑填坑的過程,但是當你踩的坑多了,那說明,你浪費的時間也就多了! _ !

相關文章