1. 程式人生 > >scrapy入門實戰練習(一)----爬取豆瓣電影top250

scrapy入門實戰練習(一)----爬取豆瓣電影top250

轉自知乎網

工具和環境

  1. 語言:python 2.7
  2. IDE: Pycharm
  3. 瀏覽器:Chrome
  4. 爬蟲框架:Scrapy 1.2.1

教程正文

觀察頁面結構


通過觀察頁面決定讓我們的爬蟲獲取每一部電影的排名、電影名稱、評分和評分的人數。

宣告Item

Items
爬取的主要目標就是從非結構性的資料來源提取結構性資料,例如網頁。 Scrapy spider可以以python的dict來返回提取的資料.雖然dict很方便,並且用起來也熟悉,但是其缺少結構性,容易打錯欄位的名字或者返回不一致的資料,尤其在具有多個spider的大專案中。
為了定義常用的輸出資料,Scrapy提供了 Item 類。 Item 物件是種簡單的容器,儲存了爬取到得資料。 其提供了 類似於詞典(dictionary-like) 的API以及用於宣告可用欄位的簡單語法。
許多Scrapy元件使用了Item提供的額外資訊: exporter根據Item宣告的欄位來匯出資料、 序列化可以通過Item欄位的元資料(metadata)來定義、 trackref 追蹤Item例項來幫助尋找記憶體洩露 (see 使用 trackref 除錯記憶體洩露) 等等。

Item使用簡單的class定義語法以及Field物件來宣告。我們開啟scrapyspider目錄下的items.py檔案寫入下列程式碼宣告Item:

import scrapy


class DoubanMovieItem(scrapy.Item):
    # 排名
    ranking = scrapy.Field()
    # 電影名稱
    movie_name = scrapy.Field()
    # 評分
    score = scrapy.Field()
    # 評論人數
    score_num = scrapy.Field()

爬蟲程式

在scrapyspider/spiders目錄下建立douban_spider.py檔案,並寫入初步的程式碼:

from scrapy.spiders import Spider
from scrapyspider.items import DoubanMovieItem


class DoubanMovieTop250Spider(Spider):
    name = 'douban_movie_top250'
    start_urls = ['https://movie.douban.com/top250']
    
    def parse(self, response):
        item = DoubanMovieItem()

這個一個基本的scrapy的spider的model,首先我們要匯入Scrapy.spiders中的Spider類,以及scrapyspider.items中我們剛剛定義好的DoubanMovieItem。接著建立我們自己的爬蟲類DoubanMovieTop250Spider並繼承Spider類,scrapy.spiders中有很多不同的爬蟲類可供我們繼承,一般情況下使用Spider類就可以滿足要求。(其他爬蟲類的使用可以去參考

官方文件)。

Spider
class scrapy.spider.Spider
Spider是最簡單的spider。每個其他的spider必須繼承自該類(包括Scrapy自帶的其他spider以及您自己編寫的spider)。 Spider並沒有提供什麼特殊的功能。 其僅僅請求給定的 start_urls/start_requests ,並根據返回的結果(resulting responses)呼叫spider的 parse 方法。
name 定義spider名字的字串(string)。spider的名字定義了Scrapy如何定位(並初始化)spider,所以其必須是唯一的。 不過您可以生成多個相同的spider例項(instance),這沒有任何限制。 name是spider最重要的屬性,而且是必須的。
如果該spider爬取單個網站(single domain),一個常見的做法是以該網站(domain)(加或不加 字尾 )來命名spider。 例如,如果spider爬取 mywebsite.com ,該spider通常會被命名為 mywebsite 。
allowed_domains 可選。包含了spider允許爬取的域名(domain)列表(list)。 當 OffsiteMiddleware 啟用時, 域名不在列表中的URL不會被跟進。
start_urls URL列表。當沒有制定特定的URL時,spider將從該列表中開始進行爬取。 因此,第一個被獲取到的頁面的URL將是該列表之一。 後續的URL將會從獲取到的資料中提取。
start_requests() 該方法必須返回一個可迭代物件(iterable)。該物件包含了spider用於爬取的第一個Request。
當spider啟動爬取並且未制定URL時,該方法被呼叫。 當指定了URL時,make_requests_from_url() 將被呼叫來建立Request物件。 該方法僅僅會被Scrapy呼叫一次,因此您可以將其實現為生成器。
該方法的預設實現是使用 start_urls 的url生成Request。
如果您想要修改最初爬取某個網站的Request物件,您可以重寫(override)該方法。 例如,如果您需要在啟動時以POST登入某個網站,你可以這麼寫:
def start_requests(self):
    return [scrapy.FormRequest("http://www.example.com/login",
                               formdata={'user': 'john', 'pass': 'secret'},
                               callback=self.logged_in)]

def logged_in(self, response):
    # here you would extract links to follow and return Requests for
    # each of them, with another callback
    pass
make_requests_from_url(url) 該方法接受一個URL並返回用於爬取的 Request 物件。 該方法在初始化request時被 start_requests() 呼叫,也被用於轉化url為request。
預設未被複寫(overridden)的情況下,該方法返回的Request物件中, parse() 作為回撥函式,dont_filter引數也被設定為開啟。 (詳情參見 Request).
parse(response) 當response沒有指定回撥函式時,該方法是Scrapy處理下載的response的預設方法。
parse 負責處理response並返回處理的資料以及(/或)跟進的URL。 Spider 對其他的Request的回撥函式也有相同的要求。
該方法及其他的Request回撥函式必須返回一個包含 Request 及(或) Item 的可迭代的物件。
引數: response (Response) – 用於分析的response
log(message[, level, component]) 使用 scrapy.log.msg() 方法記錄(log)message。 log中自動帶上該spider的 name 屬性。 更多資料請參見 Logging 。
closed(reason) 當spider關閉時,該函式被呼叫。 該方法提供了一個替代呼叫signals.connect()來監聽 spider_closed 訊號的快捷方式。

提取網頁資訊

我們使用xpath語法來提取我們所需的資訊。 不熟悉xpath語法的可以在W3School網站學習一下,很快就能上手。首先我們在chrome瀏覽器裡進入豆瓣電影TOP250頁面並按F12開啟開發者工具。


點選工具欄左上角的類滑鼠符號圖示或者Ctrl + Shift + c在頁面中點選我們想要的元素即可在工具欄中看到它在網頁HTML原始碼中所處的位置。一般抓取時會以先抓大再抓小的原則來抓取。通過觀察我們看到該頁面所有影片的資訊都位於一個class屬性為grid_view的ol標籤內的li標籤內。

<ol class="grid_view">
        <li>
            <div class="item">
                <div class="pic">
                    <em class="">1</em>
                    <a href="https://movie.douban.com/subject/1292052/">
                        <img alt="肖申克的救贖" src="https://img3.doubanio.com/view/movie_poster_cover/ipst/public/p480747492.jpg" class="">
                    </a>
                </div>
                <div class="info">
                    <div class="hd">
                        <a href="https://movie.douban.com/subject/1292052/" class="">
                            <span class="title">肖申克的救贖</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                                <span class="other">&nbsp;/&nbsp;月黑高飛(港)  /  刺激1995(臺)</span>
                        </a>


                            <span class="playable">[可播放]</span>
                    </div>
                    <div class="bd">
                        <p class="">
                            導演: 弗蘭克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·羅賓斯 Tim Robbins /...<br>
                            1994&nbsp;/&nbsp;美國&nbsp;/&nbsp;犯罪 劇情
                        </p>

                        
                        <div class="star">
                                <span class="rating5-t"></span>
                                <span class="rating_num" property="v:average">9.6</span>
                                <span property="v:best" content="10.0"></span>
                                <span>766719人評價</span>
                        </div>

                            <p class="quote">
                                <span class="inq">希望讓人自由。</span>
                            </p>
                    </div>
                </div>
            </div>
        </li>
        ...
        ...
        ...
</ol>

因此我們根據以上原則對所需資訊進行抓取

from scrapy.spiders import Spider
from scrapyspider.items import DoubanMovieItem


class DoubanMovieTop250Spider(Spider):
    name = 'douban_movie_top250'
    start_urls = ['https://movie.douban.com/top250']
    
    def parse(self, response):
        item = DoubanMovieItem()
        movies = response.xpath('//ol[@class="grid_view"]/li')
        for movie in movies:
            item['ranking'] = movie.xpath(
                './/div[@class="pic"]/em/text()').extract()[0]
            item['movie_name'] = movie.xpath(
                './/div[@class="hd"]/a/span[1]/text()').extract()[0]
            item['score'] = movie.xpath(
                './/div[@class="star"]/span[@class="rating_num"]/text()'
            ).extract()[0]
            item['score_num'] = movie.xpath(
                './/div[@class="star"]/span/text()').re(ur'(\d+)人評價')[0]
            yield item

對於Scrapy提取頁面資訊的內容詳情可以參照官方文件的相應章節

執行爬蟲

在專案資料夾內開啟cmd執行下列命令:

scrapy crawl douban_movie_top250 -o douban.csv

注意此處的douban_movie_top250即為我們剛剛寫的爬蟲的name, 而-o douban.csv是scrapy提供的將item輸出為csv格式的快捷方式

試著執行一下爬蟲怎麼什麼也沒輸出呢?!!!


辛辛苦苦到了這裡難道要失敗了嗎?!!!不要急我們看下一控制檯輸出的資訊,原來是403錯誤了。這是因為豆瓣對爬蟲設了一個小小的門檻,我們只需要更改一下發送請求時的請求頭user-agent即可。

from scrapy import Request
from scrapy.spiders import Spider
from scrapyspider.items import DoubanMovieItem


class DoubanMovieTop250Spider(Spider):
    name = 'douban_movie_top250'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',
    }

    def start_requests(self):
        url = 'https://movie.douban.com/top250'
        yield Request(url, headers=self.headers)

    def parse(self, response):
        item = DoubanMovieItem()
        movies = response.xpath('//ol[@class="grid_view"]/li')
        for movie in movies:
            item['ranking'] = movie.xpath(
                './/div[@class="pic"]/em/text()').extract()[0]
            item['movie_name'] = movie.xpath(
                './/div[@class="hd"]/a/span[1]/text()').extract()[0]
            item['score'] = movie.xpath(
                './/div[@class="star"]/span[@class="rating_num"]/text()'
            ).extract()[0]
            item['score_num'] = movie.xpath(
                './/div[@class="star"]/span/text()').re(ur'(\d+)人評價')[0]
            yield item

更改後的程式碼是不是覺得有些地方不太一樣了?start_urls怎麼不見了?start_requests函式又是幹什麼的?還記得剛才對Spider類的介紹嗎?先回過頭複習一下上面關於start_urls和start_requests函式的介紹。簡單的說就是使用start_requests函式我們對初始URL的處理就有了更多的權利,比如這次給初始URL增加請求頭user_agent。

再次執行爬蟲,我們想要的資訊都被下載到douban.scv資料夾裡了。直接用WPS開啟即可檢視資訊。


自動翻頁

先別急著高興,你難道沒有發現一個問題嗎?這樣的話我們還是隻能爬到當前頁的25個電影的內容。怎麼樣才能把剩下的也一起爬下來呢?實現自動翻頁一般有兩種方法:

  1. 在頁面中找到下一頁的地址;
  2. 自己根據URL的變化規律構造所有頁面地址。

一般情況下我們使用第一種方法,第二種方法適用於頁面的下一頁地址為JS載入的情況。今天我們只說第一種方法。首先利用Chrome瀏覽器的開發者工具找到下一頁的地址


然後在解析該頁面時獲取下一頁的地址並將地址交給排程器(Scheduler)

from scrapy import Request
from scrapy.spiders import Spider
from scrapyspider.items import DoubanMovieItem


class DoubanMovieTop250Spider(Spider):
    name = 'douban_movie_top250'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',
    }

    def start_requests(self):
        url = 'https://movie.douban.com/top250'
        yield Request(url, headers=self.headers)

    def parse(self, response):
        item = DoubanMovieItem()
        movies = response.xpath('//ol[@class="grid_view"]/li')
        for movie in movies:
            item['ranking'] = movie.xpath(
                './/div[@class="pic"]/em/text()').extract()[0]
            item['movie_name'] = movie.xpath(
                './/div[@class="hd"]/a/span[1]/text()').extract()[0]
            item['score'] = movie.xpath(
                './/div[@class="star"]/span[@class="rating_num"]/text()'
            ).extract()[0]
            item['score_num'] = movie.xpath(
                './/div[@class="star"]/span/text()').re(ur'(\d+)人評價')[0]
            yield item

        next_url = response.xpath('//span[@class="next"]/a/@href').extract()
        if next_url:
            next_url = 'https://movie.douban.com/top250' + next_url[0]
            yield Request(next_url, headers=self.headers)

最後再執行一下爬蟲,開啟douban.csv。是不是發現所有的影片資訊都獲取到了,250個一個不多一個不少。


最後,利用WPS的篩選功能你可以篩選任意符合你要求的影片。(Ps:外來的和尚有時候不一定好唸經。記得要用WPS開啟這個CVS檔案,用EXCEL開啟會因為有中文而顯示不正常。)


相關推薦

scrapy入門實戰練習----豆瓣電影top250

轉自知乎網工具和環境語言:python 2.7IDE: Pycharm瀏覽器:Chrome爬蟲框架:Scrapy 1.2.1教程正文觀察頁面結構通過觀察頁面決定讓我們的爬蟲獲取每一部電影的排名、電影名稱、評分和評分的人數。宣告ItemItems爬取的主要目標就是從非結構性的資

python爬蟲豆瓣電影Top250

提示:完整程式碼附在文末 一、需要的庫           requests:獲得網頁請求           BeautifulSoup:處理資料,獲得所需要的資料 二、爬取豆瓣電影Top250           爬取內容為:豆瓣評分前二百五位電影的名字、主演、

Python爬蟲入門實戰系列--網路小說並存放至txt檔案

執行平臺: Windows  Python版本: Python3.x  一、庫檔案                      

Python3爬蟲入門實戰系列貓眼電影排行榜

在進行本節實戰之前,希望您對requests庫以及正則表示式有所瞭解。 執行平臺:windows Python版本: Python3.x 一、依賴庫的安裝 在本節實戰之前,請確保已經正確安裝了requests庫 requests庫的安裝 pip3 instal

Python爬蟲入門實戰系列貓眼電影排行榜

在進行本節實戰之前,希望您對requests庫以及正則表示式有所瞭解。 執行平臺:windows **Python版本: Python3.x ** 一、依賴庫的安裝 在本節實戰之前,請確保已經正確安裝了requests庫 requests庫的安裝 pip3 i

python 爬蟲實戰豆瓣圖書top250

import requests from lxml import etree with open('booktop250.txt','w',encoding='utf-8') as f: f

Scrapy爬蟲4豆瓣電影Top250圖片

  在用Python的urllib和BeautifulSoup寫過了很多爬蟲之後,本人決定嘗試著名的Python爬蟲框架——Scrapy.   本次分享將詳細講述如何利用Scrapy來下載豆瓣電影Top250, 主要解決的問題有: 如何利用ImagesPi

python爬蟲實踐——零基礎快速入門豆瓣電影

爬蟲又稱為網頁蜘蛛,是一種程式或指令碼。 但重點在於,它能夠按照一定的規則,自動獲取網頁資訊。 爬蟲的基本原理——通用框架 1.挑選種子URL; 2.講這些URL放入帶抓取的URL列隊; 3.取出帶抓取的URL,下載並存儲進已下載網頁庫中。此外,講這些URL放入帶抓取UR

Python爬蟲學習6:scrapy入門汽車評論並儲存到csv檔案

一、scrapy 安裝:可直接使用Anaconda Navigator安裝, 也可使用pip install scrapy安裝二、建立scrapy 爬蟲專案:語句格式為 scrapy startproject project_name生成的爬蟲專案目錄如下,其中spiders

jQuery EasyUI快速入門實戰教程-入門

jquery javascript easyui 1、jQuery EasyUI概述jQuery EasyUI是一組基於jQuery的UI插件集合體,而jQuery EasyUI的目標就是幫助web開發者更輕松的打造出功能豐富並且美觀的UI界面。開發者不需要編寫復雜的javascript,也不需要

Oracle入門SQL練習

inf != 開頭 工作 排序 desc 令行 查詢排序 模糊查詢 以下內容以scott用戶下Oracle自帶實例orcl庫中四張表進行查詢,作為Oracle入門SQL基礎練習筆記,不忘初心,加油! --1).查詢一個用戶下所有的表SELECT * FROM tab; --

Java 由淺入深GUI程式設計實戰練習

專案簡介: 1.實現利用下拉選單的方式選擇傳送快捷語句; 2.實現對留言資訊內容的置頂處理以及至尾處理; 3.實現清屏處理或現實保留部分留言內容; 執行介面: 程式碼展示: import java.awt.BorderLayout; import java.awt.Button; imp

Hive 實戰練習—按照日期將每天的資料匯入Hive表中

需求:         每天會產生很多的日誌檔案資料,有這麼一種需求:需要將每天產生的日誌資料在晚上12點鐘過後定時執行操作,匯入到Hive表中供第二天資料分析使用。要求建立分割槽表,並按照日期分割槽。資料檔案命名是以當天日期命名的,如2015-01-09.txt一、建立分割

Python爬蟲實例百度貼吧帖子中的圖片

選擇 圖片查看 負責 targe mpat wid agent html headers 程序功能說明:爬取百度貼吧帖子中的圖片,用戶輸入貼吧名稱和要爬取的起始和終止頁數即可進行爬取。 思路分析: 一、指定貼吧url的獲取 例如我們進入秦時明月吧,提取並分析其有效url如下

PyQt5與爬蟲——某站動畫每週列表

某站動畫列表PyQt程式截圖,可以點選圖片按鈕,然後會開啟谷歌瀏覽器到你選擇的動漫介面。貼程式碼:main.pyfrom PyQt5.QtWidgets import QWidget,QApplication import sys from MyWidget import W

網易雲音樂全部歌手及歌手id

動聽的音樂,走心的評論。 總會使人不斷的遐想... 本系列將爬取分析網易雲音樂最動聽的音樂,最走心的評論。 本次爬取網易雲音樂的所以歌手及歌手id。 一、網頁分析 1.標籤 通過點選左邊已經分好類的標籤及頂部的ABC等分類標籤,得到網址地址引數。

python爬蟲學習筆記—— 騰訊視訊影評

       前段時間我忽然想起來,以前本科的時候總有一些公眾號,能夠為我們提供成績查詢、課表查詢等服務。我就一直好奇它是怎麼做到的,經過一番學習,原來是運用了爬蟲的原理,自動登陸教務系統爬取的成績等內容。我覺得挺好玩的,於是自己也琢磨了一段時間,今天呢,我為大家分享一個爬蟲

7Python爬蟲——豆瓣電影Top250

利用python爬取豆瓣電影Top250的相關資訊,包括電影詳情連結,圖片連結,影片中文名,影片外國名,評分,評價數,概況,導演,主演,年份,地區,類別這12項內容,然後將爬取的資訊寫入Excel表中。基本上爬取結果還是挺好的。具體程式碼如下: #!/us

爬蟲]利用xpath豆瓣電影top250

今天學習了一下xpath 感覺功能非常的強大,但是如果不太懂前端的小夥伴們可能比較吃力,建議看一下html的一些語法結構,程式碼如下: #!/usr/bin/env python import re import requests import lxml.html url

Python3 爬蟲 -- 豆瓣首頁圖片

序 前面已經完成了簡單網頁以及偽裝瀏覽器的學習。下面,實現對豆瓣首頁所有圖片爬取程式,把圖片儲存到本地一個路徑下。 首先,豆瓣首頁部分圖片展示 這只是擷取的一部分。下面給出,整個爬蟲程式。 爬蟲程式