Scrapy爬取豆瓣

在 movie 的setting中,會有spider這個類,裏面有種子url以及解析

import scrapy
from douban.items import MovieItem


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

    def parse(self, response):
        item = MovieItem()

要想保存數據,就得定義模型

import scrapy


class MovieItem(scrapy.Item):

    title = scrapy.Field()
    score = scrapy.Field()
    motto = scrapy.Field()

現在開始繼續寫我們的spider,裏面的xpath可以打開瀏覽器的開發者工具copy裏面的代碼, 如下圖所示:

response.xpath('//*[@id="content"]/div/div[1]/ol/li')

這時候測試的時候(命令行輸入scrapy shell https://movie.douban.com/top250)會發現出現403錯誤,我們就回到setting裏面設置我們的爬蟲:

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' \
             'Chrome/27.0.1453.94 Safari/537.36'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

運行成功後,我們開始寫爬蟲的結構,要拿到電影的三個屬性,titel,score,motto,如果直接copy,xpath地址爲

//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[2]/p[2]/span
我們只需要後面的那截地址,即:
div/div[2]/div[1]/a/span[1]/text()
class MovieSpider(scrapy.Spider):
    name = 'movie'
    allowed_domains = ['movie.douban.com']
    start_urls = ['https://movie.douban.com/top250']

    def parse(self, response):
        # 解析頁面
        li_list = response.xpath('//*[@id="content"]/div/div[1]/ol/li')
        for li in li_list:

            item = MovieItem()
            # 電影名字,肖申克救贖
            item['title'] = li.xpath('div/div[2]/div[1]/a/span[1]/text()').extract_first()
            # 評分, 9.6
            item['score'] = li.xpath('div/div[2]/div[2]/div/span[2]/text()').extract_first()
            # 說明,'希望讓人自由'
            item['motto'] = li.xpath('div/div[2]/div[2]/p[2]/span/text()').extract_first()
            yield item

現在我們在terminal裏面輸入scrapy crawl movie就可以簡單的開始爬取前25個電影:


現在我們來爬取top250頁全部電影,即除了爬取電影,還要爬取翻頁的超鏈接, 可以看到href都是以‘ ?start’開始的:

所以我們接着寫:

  # 帶href的 a 標籤, ::attr("href")即取出屬性是href--超鏈接
        href_list = response.css('a[href]::attr("href")').re('\?start=.*')
        for href in href_list:
            # 將超鏈接補完整
            url = response.urljoin(href)
            # 返回request 對象,給一個新的url,處理完url還是執行parse方法
            yield scrapy.Request(url=url, callback=self.parse)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章