scrapy爬取豆瓣電影top250榜單

簡介

本人如今是一個學生,平時主要用的是Java,業餘時間學習了Python,在提升本身的同時,想把本身學習過程記錄下來,但願能夠幫到更多入門的同窗們。css

所使用到的工具

  • PyCharmhtml

  • Python3.6python

  • Scrapyweb

建立一個scrapy項目

在你的工做目錄的文件夾下打開命令提示符窗口,輸入:瀏覽器

scrapy startproject demo

若是出現下面的提示,則說明建立成功。app

圖片描述

使用PyCharm打開這個scrapy項目,它的目錄結構是這樣的:框架

圖片描述

  • scrapy.cfg文件中主要包含的是項目的相關設置。scrapy

  • demo文件夾下是用於編寫爬蟲的目錄。ide

  • items.py:定義咱們所要爬取的信息的相關屬性。工具

  • middlewares.py:爬蟲中間件,這裏能夠用過自定義相關的方法,用來處理爬蟲的響應和請求。

  • pipelines.py:當數據被爬蟲爬取下來後,它會被髮送到item pipelines中,每一個item pipelines組件(有時稱爲「項目管道」)是一個實現簡單方法的Python類。他們收到一個項目並對其執行操做,還決定該項目是否應該繼續經過管道或被丟棄而且再也不被處理。

  • settings.py:項目的設置文件。

編寫代碼

在spiders文件夾下建立douban_spider.py文件
圖片描述

這是一個空的.py文件,而後在這編寫爬蟲代碼。

# 爬蟲類須要繼承scrapy下的Spider類。
import scrapy

class douban_movie_spider(scrapy.Spider):
    # 項目的啓動名
    name = "douban_movie"
    # 若是網站設置有防爬措施,須要添加上請求頭信息,否則會爬取不到任何數據
    headler = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 '
                      'Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
    }
    # 開始連接
    start_urls = [
        'https://movie.douban.com/top250'
    ]
    # start_requests方法爲scrapy的方法,咱們對它進行重寫。
    def start_requests(self):
       # 將start_url中的連接經過for循環進行遍歷。
       for url in self.start_urls:
             # 經過yield發送Request請求。
               # 這裏的Reques注意是scrapy下的Request類。注意不到導錯類了。
            # 這裏的有3個參數:
            #        一、url爲遍歷後的連接
            #        二、callback爲發送完請求後經過什麼方法進行處理,這裏經過parse方法進行處理。
            #        三、若是網站設置了防爬措施,須要加上headers假裝瀏覽器發送請求。
            
           yield scrapy.Request(url=url, callback=self.parse, headers=self.headler)

    # 重寫parse對start_request()請求到的數據進行處理
    def parse(self, response):
       pass

頁面分析

打開https://movie.douban.com/top250,點擊f12開發者工具。

圖片描述

使用選取工具選取整個電影的信息,能夠發現,全部的信息都是放在單獨的一個li標籤中的,並且在li下還有一個class爲item的div包裹着全部的信息。

圖片描述

parse方法

def parse(self, response):
    # 這裏使用scrapy的css選擇器,既然數據在class爲item的div下,那麼把選取範圍定位div.item
    for quote in response.css('div.item'):
        # 經過yield對網頁數據進行循環抓取,咱們要抓取的內容有3個,分別以下
        yield {
            "電影名": quote.css('div.info div.hd a span.title::text').extract_first(),
            "評分":quote.css('div.info div.bd div.star span.rating_num::text').extract(),
            "引言": quote.css('div.info div.bd p.quote span.inq::text').extract()
        }

寫完上面的代碼,其實只是抓取一頁的罷了,爲了抓取完整的top250榜單,咱們須要讓爬蟲跳轉到下一頁再進行循環抓取,由於每一個頁面的結構是同樣的,因此不用擔憂會抓取不到。

圖片描述

next_url=response.css('div.paginator span.next a::attr(href)').extract()

而後,須要對next_url進行判斷是否存在,而後再次發送Request請求。這樣爬蟲就會在爬完一個頁面後點擊下一頁再繼續爬去,往復循環,直到爬取完畢。

if next_url:
    next_url="https://movie.douban.com/top250"+next_url[0]
    print(next_url)
    yield scrapy.Request(next_url,headers=self.headler)

那麼到這裏,代碼就寫完了。

而後咱們來運行一下這個爬蟲,scrapy框架是經過命令來啓動爬蟲的,

在項目根目錄下打開命令提示符,輸入:

scrapy crawl douban_movie -o douban_movice.csv

scrapy會把爬取到的結果保存到douban_movice.csv這個文件裏。

爬蟲運行後,就會輸出大量的日誌信息和爬去的網頁的內容。
圖片描述

數據會保存在douban_movice.csv這個文件中。

圖片描述

可是,有個問題,若是爬蟲報錯了怎麼辦?

由於使用命令啓動的爬蟲,因此爬蟲的日誌信息都是顯示在cmd中的,這樣日誌信息閱讀起來很是的不友好。因此咱們須要寫一個啓動爬蟲的python腳本,這樣日誌信息就會輸出在python環境下了

新建一個run.py文件,代碼以下:

from scrapy import cmdline

name='douban_movie -o douban.csv'
cmd = 'scrapy crawl {0}'.format(name)
cmdline.execute(cmd.split())

而後運行這個文件,因此的日誌信息就輸出在Python環境下,便於調試。
圖片描述

運行獲得的結果都是同樣的。

完整的代碼是這樣的:

import scrapy

class douban_movie_spider(scrapy.Spider):
    name = "douban_movie"

    headler = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 '
                      'Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
    }

    start_urls = [
        'https://movie.douban.com/top250'
    ]


    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url=url, callback=self.parse, headers=self.headler)

    def parse(self, response):
        for quote in response.css('div.item'):
            yield {
                "電影名": quote.css('div.info div.hd a span.title::text').extract_first(),
                "評分":quote.css('div.info div.bd div.star span.rating_num::text').extract(),
                "引言": quote.css('div.info div.bd p.quote span.inq::text').extract()
            }
        next_url=response.css('div.paginator span.next a::attr(href)').extract()
        if next_url:
            next_url="https://movie.douban.com/top250"+next_url[0]
            print(next_url)
            yield scrapy.Request(next_url,headers=self.headler)

好了,本教程到此結束。

相關文章
相關標籤/搜索