真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

scrapy爬取豆瓣電影數(shù)據(jù)的方法

小編給大家分享一下scrapy爬取豆瓣電影數(shù)據(jù)的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!

創(chuàng)新互聯(lián)建站是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的十余年時間我們累計服務(wù)了上千家以及全國政企客戶,如成都門簾等企業(yè)單位,完善的項目管理流程,嚴格把控項目進度與質(zhì)量監(jiān)控加上過硬的技術(shù)實力獲得客戶的一致夸獎。

1.建立項目

執(zhí)行如下命令建立scrapy爬蟲項目

scrapy startproject spider_douban

命令執(zhí)行完成后,建立了spider_douban文件夾,目錄結(jié)構(gòu)如下:

.
├── scrapy.cfg
└── spider_douban
   ├── __init__.py
   ├── items.py
   ├── middlewares.py
   ├── pipelines.py
   ├── settings.py
   └── spiders
       ├── douban_spider.py
       └── __init__.py

2.建立爬蟲數(shù)據(jù)模型

打開 ./spider_douban/items.py 文件,編輯內(nèi)容如下:

import scrapy

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

3.新建爬蟲文件

新建 ./spiders/douban_spider.py 文件,編輯內(nèi)容如下:

from scrapy import Request
from scrapy.spiders import Spider
from spider_douban.items import DoubanMovieItem
class DoubanMovieTop250Spider(Spider):
    name = 'douban_movie_top250'
    start_urls = {
        'https://movie.douban.com/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')
        print(movies)
        print('=============================================')
        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(r'(\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)

爬蟲文件各部分功能記錄

douban_spider.py文件主要有幾部分構(gòu)成。

導入模塊

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

Request 類用于請求要爬取的頁面數(shù)據(jù)
Spider 類是爬蟲的基類
DoubanMovieItem 是我們第一步建立的爬取數(shù)據(jù)模型

初始設(shè)置

基于spider類定義的爬蟲類DoubanMovieTop250Spider中,首先定義爬蟲的基本信息:

name:在項目中爬蟲的名稱,可以在項目目錄中執(zhí)行scrapy list獲取已經(jīng)定義的爬蟲列表
start_urls:是爬取的第一個頁面地址
headers:是向web服務(wù)器發(fā)送頁面請求的時候附加的user-agent消息,告訴web服務(wù)器是什么類型的瀏覽器或設(shè)備在請求頁面,對于不具備簡單反爬機制的網(wǎng)站,headers部分可以省略。

為了迷惑web服務(wù)器,一般會在爬蟲發(fā)送web請求的時候定義user-agent信息,這里有兩種寫法。

  • header的第一種定義:    

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)

可以看到,這種寫法中,start_urls定義沒有了,轉(zhuǎn)而定義了start_requests函數(shù),開始的url寫到了函數(shù)里。同時,定義了headers字典,在發(fā)送Request請求的時候,將headers字典一并發(fā)送。這種寫法簡單直觀,缺點是在一個爬蟲項目執(zhí)行期間,所有請求都是一個User-Agent屬性。

  • header的第二種定義:  

start_urls = {
       'https://movie.douban.com/top250'
    }

簡單、直接的定義start_urls屬性,而Request中的header屬性通過其他方法另外定義,容后再說。

parse處理函數(shù)

逐句分解說明

1.基于我們定義的DoubanMovieItem類創(chuàng)建item實例

item = DoubanMovieItem()

2.解析頁面 - 獲取內(nèi)容框架

scrapy爬取豆瓣電影數(shù)據(jù)的方法

scrapy爬取豆瓣電影數(shù)據(jù)的方法

通過分析頁面源碼,我們能夠看到,頁面中的電影信息是保存在了

    標簽中,這個
      標簽有一個獨特的樣式表grid_view,而每一個單獨的電影信息保存在了
    1. 標簽中,下面代碼獲取class屬性為grid_view的
        標簽下的所有
      1. 標簽內(nèi)容。

        movies = response.xpath('//ol[@class="grid_view"]/li')

        3.解析頁面 - 獲取分項

        在每一個

      2. 標簽中,還有內(nèi)部結(jié)構(gòu),通過xpath()解析,將每一項內(nèi)容解析出來,賦值給item實例中的各個字段。通過查看movie.douban.com/top250頁面的源碼可以很容易找到這個標簽定義的內(nèi)容。如果我們通過type()函數(shù)查看movies的變量類型,可以發(fā)現(xiàn)他的類型是。
          標簽中的每一個
        1. 標簽都是這個列表中的一項,那么就可以對movies做迭代。

          首先看看

        2. 標簽中的頁面結(jié)構(gòu):

          scrapy爬取豆瓣電影數(shù)據(jù)的方法

          可以看到要提取數(shù)據(jù)的各部分所在標簽位置:

          排名:class屬性為pic的

          回到代碼部分,對之前定義的movies做迭代,逐項獲取要抓取的數(shù)據(jù)。

          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(r '(\d+)人評價')[0]
          yield item

          4.Url跳轉(zhuǎn)(翻頁)

          如果到此為止,我們可以將https://movie.douban.com/top250頁面中的第一頁內(nèi)容爬取到,但只有25項記錄,要爬取全部的250條記錄,就要執(zhí)行下面代碼:

          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)

          首先通過xpath解析了頁面中后頁的鏈接,并賦值給next_url變量,如果我們當前在第一頁,那么解析后頁的鏈接就是?start=25&filter=。將解析的后頁鏈接與完整url連接形成完整的地址,再次執(zhí)行Request(),就實現(xiàn)了對全部250條記錄的爬取。注意:通過xpath解析出的結(jié)果是列表,所以在引用的時候?qū)懗蒼ext_url[0]。

          4.處理隨機Head屬性(隨機User-Agent)

          實現(xiàn)隨機的head屬性發(fā)送。主要改兩個文件:

          settings.py

          USER_AGENT_LIST = [
              'zspider/0.9-dev http://feedback.redkolibri.com/',
              'Xaldon_WebSpider/2.0.b1',
              'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) Speedy Spider (http://www.entireweb.com/about/search_tech/speedy_spider/)',
              'Mozilla/5.0 (compatible; Speedy Spider; http://www.entireweb.com/about/search_tech/speedy_spider/)',
              'Speedy Spider (Entireweb; Beta/1.3; http://www.entireweb.com/about/search_tech/speedyspider/)',
              'Speedy Spider (Entireweb; Beta/1.2; http://www.entireweb.com/about/search_tech/speedyspider/)',
              'Speedy Spider (Entireweb; Beta/1.1; http://www.entireweb.com/about/search_tech/speedyspider/)',
              'Speedy Spider (Entireweb; Beta/1.0; http://www.entireweb.com/about/search_tech/speedyspider/)',
              'Speedy Spider (Beta/1.0; www.entireweb.com)',
              'Speedy Spider (http://www.entireweb.com/about/search_tech/speedy_spider/)',
              'Speedy Spider (http://www.entireweb.com/about/search_tech/speedyspider/)',
              'Speedy Spider (http://www.entireweb.com)',
              'Sosospider+(+http://help.soso.com/webspider.htm)',
              'sogou spider',
              'Nusearch Spider (www.nusearch.com)',
              'nuSearch Spider (compatible; MSIE 4.01; Windows NT)',
              'lmspider (lmspider@scansoft.com)',
              'lmspider lmspider@scansoft.com',
              'ldspider (http://code.google.com/p/ldspider/wiki/Robots)',
              'iaskspider/2.0(+http://iask.com/help/help_index.html)',
              'iaskspider',
              'hl_ftien_spider_v1.1',
              'hl_ftien_spider',
              'FyberSpider (+http://www.fybersearch.com/fyberspider.php)',
              'FyberSpider',
              'everyfeed-spider/2.0 (http://www.everyfeed.com)',
              'envolk[ITS]spider/1.6 (+http://www.envolk.com/envolkspider.html)',
              'envolk[ITS]spider/1.6 ( http://www.envolk.com/envolkspider.html)',
              'Baiduspider+(+http://www.baidu.com/search/spider_jp.html)',
              'Baiduspider+(+http://www.baidu.com/search/spider.htm)',
              'BaiDuSpider',
              'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0) AddSugarSpiderBot www.idealobserver.com',
              ]
          DOWNLOADER_MIDDLEWARES = {
              'spider_douban.middlewares.RandomUserAgentMiddleware': 400,
              'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
          }

          USER_AGENT_LIST定義了一些瀏覽器user-agent屬性,網(wǎng)上有很多,可以找來直接加進去,需要注意的是有些user-agent信息是移動設(shè)備(手機或平板)的,如果不注意的話,可能請求到的數(shù)據(jù)與你看到的數(shù)據(jù)有較大差異;
          DOWNLOADER_MIDDLEWARES定義了下載器中間件,它在發(fā)送頁面請求數(shù)據(jù)的時候被調(diào)用。

          middlewares.py

          from spider_douban.settings import USER_AGENT_LIST
          import random
          
          class RandomUserAgentMiddleware():
              def process_request(self, request, spider):
                  ua  = random.choice(USER_AGENT_LIST)
                  if ua:
                      request.headers.setdefault('User-Agent', ua)

          在RandomUserAgentMiddleware()中,每次發(fā)送請求數(shù)據(jù),會在USER_AGENT_LIST中隨機選擇一條User-Agent記錄。

          5.結(jié)果保存

          編輯pipelines.py文件:

          from scrapy import signals
          from scrapy.contrib.exporter import CsvItemExporter
          
          class SpiderDoubanPipeline(CsvItemExporter):
              def __init__(self):
                  self.files = {}
              @classmethod
              def from_crawler(cls, crawler):
                  print('==========pipeline==========from_crawler==========')
                  pipeline = cls()
                  crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
                  crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
                  return pipeline
              def spider_opened(self, spider):
                  savefile = open('douban_top250_export.csv', 'wb+')
                  self.files[spider] = savefile
                  print('==========pipeline==========spider_opened==========')
                  self.exporter = CsvItemExporter(savefile)
                  self.exporter.start_exporting()
              def spider_closed(self, spider):
                  print('==========pipeline==========spider_closed==========')
                  self.exporter.finish_exporting()
                  savefile = self.files.pop(spider)
                  savefile.close()
              def process_item(self, item, spider):
                  print('==========pipeline==========process_item==========')
                  print(type(item))
                  self.exporter.export_item(item)
                  return item

          SpiderDoubanPipeline類是建立項目的時候自行建立的,為了保存文件,做了修改。

          def from_crawler(cls, crawler):

          在此方法中,定義了一個數(shù)據(jù)收集器(cls)的實例:‘pipeline’。

          signals:Scrapy使用信號來通知事情發(fā)生。您可以在您的Scrapy項目中捕捉一些信號(使用 extension)來完成額外的工作或添加額外的功能,擴展Scrapy。雖然信號提供了一些參數(shù),不過處理函數(shù)不用接收所有的參數(shù) - 信號分發(fā)機制(singal dispatching mechanism)僅僅提供處理器(handler)接受的參數(shù)。您可以通過 信號(Signals) API 來連接(或發(fā)送您自己的)信號。

          connect:鏈接一個接收器函數(shù)(receiver function) 到一個信號(signal)。signal可以是任何對象,雖然Scrapy提供了一些預(yù)先定義好的信號。

          def spider_opened(self, spider):

          此方法中,創(chuàng)建了一個文件對象實例:savefile。

          CsvItemExporter(savefile):輸出 csv 文件格式. 如果添加 fields_to_export 屬性, 它會按順序定義CSV的列名.

          def spider_closed(self, spider):

          def process_item(self, item, spider):

          啟用pipeline

          為了讓我們定義的pipeline生效,要在settings.py文件中,打開ITEM_PIPELINES注釋:

          ITEM_PIPELINES = {
              'spider_douban.pipelines.SpiderDoubanPipeline': 300,
          }

          6.執(zhí)行爬蟲

          scrapy crawl douban_movie_top250

          執(zhí)行爬蟲能夠看到爬取到的數(shù)據(jù)。。。

          如果之前pipeline部分代碼沒有寫,也可以用下面的命令,在爬蟲執(zhí)行的時候直接導出數(shù)據(jù):

          scrapy crawl douban_movie_top250 -o douban.csv

          增加-o參數(shù),可以將爬取到的數(shù)據(jù)保存到douban.csv文件中。。

          7.文件編碼的問題

          我在linux服務(wù)器執(zhí)行爬蟲,生成csv文件后,在win7系統(tǒng)中用excel打開變成亂碼。在網(wǎng)上找了一些文章,有的文章直接改變linux文件默認編碼,但是感覺這么做會對其他項目產(chǎn)生影響。最后選擇一個相對簡單的方式。按這幾步執(zhí)行就可以:

          1. 不要直接用excel打開csv文件。先打開excel,建立空白工作表。

          2. 選擇數(shù)據(jù)選項卡,打開獲取外部數(shù)據(jù)中的自文本。

          3. 在導入文本文件對話框中選擇要導入的csv文件。

          4. 在文本導入向?qū)?- 第1步中,設(shè)置文件原始格式為65001 : Unicode (UTF-8)

          5. 繼續(xù)下一步選擇逗號分隔,就可以導入正常文本了。

          看完了這篇文章,相信你對scrapy爬取豆瓣電影數(shù)據(jù)的方法有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


          網(wǎng)站標題:scrapy爬取豆瓣電影數(shù)據(jù)的方法
          分享地址:
          http://www.weahome.cn/article/iicjio.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部