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)


猜你喜欢

转载自blog.csdn.net/caoyu1221/article/details/80580517