Scrapy爬取豆瓣電影

1.在items.py中定義字段,這些字段用來(lái)保存數(shù)據(jù)鲫忍,方便后續(xù)的操作

import scrapy


class MovieItem(scrapy.Item):
    rank = scrapy.Field()  # 排名
    title = scrapy.Field()  # 名稱(chēng)
    score = scrapy.Field()  # 評(píng)分

2.修改settings.py對(duì)項(xiàng)目進(jìn)行配置

  • 設(shè)置用戶(hù)代理,模擬瀏覽器訪問(wèn)頁(yè)面
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' \
             'Chrome/66.0.3359.181 Safari/537.36'
  • 是否遵循robots協(xié)議。
    如果沒(méi)有配置USER_AGENT,需要把ROBOTSTXT_OBEY的值改為False
ROBOTSTXT_OBEY = True
  • 指定請(qǐng)求數(shù)目颠蕴,相當(dāng)于線(xiàn)程數(shù)量,盡可能用較小的數(shù)助析。
CONCURRENT_REQUESTS = 1
  • 配置DOWNLOAD_DELAY
DOWNLOAD_DELAY = 5
  • 緩存頁(yè)面
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0
HTTPCACHE_DIR = 'httpcache'
HTTPCACHE_IGNORE_HTTP_CODES = []
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

如果想要指定代理用戶(hù)犀被,需要做如下操作:

  • 在settings.py中配置DOWNLOADER_MIDDLEWARES
DOWNLOADER_MIDDLEWARES = {
   'douban.middlewares.DoubanDownloaderMiddleware': 543,
}
  • 在middlewears.py中配置
    找到DoubanDownloaderMiddleware類(lèi)的process_request函數(shù),修改函數(shù)為如下內(nèi)容
class DoubanDownloaderMiddleware(object):

    def process_request(self, request, spider):
        # Called for each request that goes through the downloader
        # middleware.

        # Must either:
        # - return None: continue processing this request
        # - or return a Response object
        # - or return a Request object
        # - or raise IgnoreRequest: process_exception() methods of
        #   installed downloader middleware will be called
        request.meta['proxy'] = 'http://ip:port'

3.編寫(xiě)我們的spider

rules中的LinkExtractor方法會(huì)自動(dòng)去頁(yè)面中搜索和rules中規(guī)則相匹配的url外冀,callback指定調(diào)用的函數(shù)寡键。

# -*- coding: utf-8 -*-

import scrapy

from douban2.items import MovieItem


class MovieSpider(scrapy.Spider):
    name = 'movie'
    allowed_domains = ['movie.douban.com']
    start_urls = ['https://movie.douban.com/top250']

    # parse 是回調(diào)函數(shù)
    def parse(self, response):
        # 獲取首頁(yè)最下面的頁(yè)面跳轉(zhuǎn)鏈接
        # 由于需要獲取每個(gè)頁(yè)面中的電影詳情頁(yè)
        # 所以對(duì)于獲取 的url ,需要指定回調(diào)函數(shù) parse() 
        for a in response.xpath('//*[@id="content"]/div/div[1]/div[2]/a'):
            url = response.urljoin(a.xpath('@href').extract_first())
            yield scrapy.Request(url=url, callback=self.parse)

        # 獲取電影詳情頁(yè)面鏈接
        # 由于需要通過(guò)電影詳情頁(yè)獲取每部電影的信息
        # 所以對(duì)于此處獲取的url雪隧,需要指定回調(diào)函數(shù) parse_item()
        for li in response.xpath('//*[@id="content"]/div/div[1]/ol/li'):
            url = li.xpath('div/div[2]/div[1]/a/@href').extract_first()
            yield scrapy.Request(url=url, callback=self.parse_item)

    def parse_item(self, response):
        item = MovieItem()
        item['rank'] = response.xpath('//*[@id="content"]/div[1]/span[1]/text()').extract_first()
        item['title'] = response.xpath('//*[@id="content"]/h1/span[1]/text()').extract_first()
        item['score'] = response.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()').extract_first()
        return item

4.啟動(dòng)shell西轩,看spider是否能成功請(qǐng)求網(wǎng)頁(yè):

scrapy shell "https://movie.douban.com/top250"

注意:網(wǎng)頁(yè)鏈接必須用雙引號(hào),如果用單引號(hào)會(huì)發(fā)生如下錯(cuò)誤:



如果看到下面的結(jié)果膀跌,則表示請(qǐng)求成功遭商。


5.運(yùn)行爬蟲(chóng),抓取數(shù)據(jù)
由于此處還沒(méi)有把抓取到的有效內(nèi)容做持久化處理捅伤,所有可以把內(nèi)容重定向到一個(gè)文件中,便于我們查看巫玻。要實(shí)現(xiàn)這樣的效果丛忆,只需要在命令后面加上 -o <filename>祠汇,此處我把結(jié)果存儲(chǔ)在result.json文件中。

scrapy crawl movie -o result.json

6.執(zhí)行結(jié)果:
項(xiàng)目文件夾中生成了一個(gè)result.json文件熄诡,里面保存了抓取的全部數(shù)據(jù)信息可很。



通過(guò)菜鳥(niǎo)工具JSON在線(xiàn)解析幫助我們更好的查看數(shù)據(jù)。

總共抓取到了246條信息凰浮,網(wǎng)頁(yè)中應(yīng)該是有250個(gè)電影信息我抠,經(jīng)過(guò)建廠,發(fā)現(xiàn)網(wǎng)頁(yè)中存在一些死鏈接袜茧,說(shuō)明我們的spider成功抓取到了我們需要的所有信息菜拓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市笛厦,隨后出現(xiàn)的幾起案子纳鼎,更是在濱河造成了極大的恐慌,老刑警劉巖裳凸,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贱鄙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡姨谷,警方通過(guò)查閱死者的電腦和手機(jī)逗宁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梦湘,“玉大人疙剑,你說(shuō)我怎么就攤上這事〖” “怎么了言缤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我玫鸟,道長(zhǎng)塌计,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任僻孝,我火速辦了婚禮,結(jié)果婚禮上守谓,老公的妹妹穿的比我還像新娘穿铆。我一直安慰自己,他們只是感情好斋荞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布荞雏。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凤优。 梳的紋絲不亂的頭發(fā)上悦陋,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音筑辨,去河邊找鬼俺驶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棍辕,可吹牛的內(nèi)容都是我干的暮现。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼楚昭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼栖袋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起哪替,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤栋荸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后凭舶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體晌块,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年帅霜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匆背。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡身冀,死狀恐怖钝尸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搂根,我是刑警寧澤珍促,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站剩愧,受9級(jí)特大地震影響猪叙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仁卷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一穴翩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锦积,春花似錦芒帕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鉴分。三九已至,卻和暖如春淆储,著一層夾襖步出監(jiān)牢的瞬間冠场,已是汗流浹背家浇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工本砰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钢悲。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓点额,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親莺琳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子还棱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354