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)


### 使用 Scrapy 爬取豆瓣音乐数据 Scrapy 是一个功能强大的 Python 爬虫框架,适合用于爬取大规模的网站数据。要使用 Scrapy 爬取豆瓣音乐的数据,可以按照以下内容进行操作。 #### 1. 环境准备 确保已经安装了 Scrapy 框架。可以通过以下命令检查是否安装成功: ```bash scrapy version ``` 如果未安装,可以通过 pip 安装 Scrapy[^3]: ```bash pip install scrapy ``` #### 2. 创建 Scrapy 项目 在命令行中创建一个新的 Scrapy 项目,例如命名为 `doubanMusic`: ```bash scrapy startproject doubanMusic ``` #### 3. 分析目标网站结构 在开始编写爬虫之前,需要分析豆瓣音乐页面的 HTML 结构。通常情况下,豆瓣音乐页面会包含音乐名称、艺术家、专辑信息等内容。可以使用浏览器开发者工具(如 Chrome 的 F12)来查看这些信息,并找到对应的 XPath 或 CSS 选择器[^1]。 #### 4. 编写爬虫代码 进入项目的 spiders 文件夹,创建一个新的爬虫文件 `douban_music.py`,并编写爬虫逻辑。以下是示例代码: ```python import scrapy class DoubanMusicSpider(scrapy.Spider): name = "douban_music" # 爬虫名称 allowed_domains = ["music.douban.com"] # 允许爬取的域名 start_urls = ["https://music.douban.com/top250"] # 起始 URL def parse(self, response): # 提取音乐信息 for music in response.css("div.pl2"): # 根据页面结构调整选择器 title = music.css("a::text").get().strip() # 音乐名称 link = music.css("a::attr(href)").get() # 音乐链接 yield { "title": title, "link": link } # 处理分页 next_page = response.css("span.next a::attr(href)").get() if next_page is not None: yield response.follow(next_page, self.parse) ``` #### 5. 数据存储 可以通过修改 `settings.py` 文件中的配置项来指定数据存储方式。例如,将数据保存为 JSON 文件: ```python FEED_FORMAT = 'json' FEED_URI = 'douban_music_data.json' ``` #### 6. 运行爬虫 在项目根目录下运行以下命令启动爬虫: ```bash scrapy crawl douban_music ``` 这将根据定义的逻辑爬取豆瓣音乐页面的数据,并将其保存为 JSON 文件[^2]。 --- ### 注意事项 - 在爬取过程中需要注意遵守目标网站的 robots.txt 文件规定。 - 如果遇到反爬机制,可以尝试设置 User-Agent 或启用代理 IP[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值