【学习记录】使用Scrapy框架爬取豆瓣图书信息

学习笔记

使用Scrapy框架爬取豆瓣图书信息

首先了解Scrapy框架
Scrapy框架是一套基于Twisted的异步处理框架,是使用python实现的爬虫框架,在使用时只需要更改几个模块就可以实现一个爬虫项目,用来抓取网页内容。

网络上可以搜到很多关于Scrapy框架的介绍,可以参考链接 link 入门教程,有比较通俗的运行流程解释

安装Scrapy框架

通过 pip 安装 Scrapy 框架:

pip install Scrapy

添加镜像源会快一点

pip install Scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple

我这里爬取的内容是豆瓣读书界面的书籍信息
网站链接是:链接 link
因为链接里带有:“名著” 两个中文,所以写成这样
https://book.douban.com/tag/%E5%90%8D%E8%91%97
豆瓣读书

1.新建项目(scrapy startproject)

在开始爬取之前,必须创建一个新的Scrapy项目。

scrapy startproject  douban            # douban 为项目名称

进入自定义的项目目录中,在终端运行下列命令: cd douban

2.生成爬虫(scrapy genspider)

创建一个名为doubanspider的爬虫,并指定爬取域的范围,这里是豆瓣的主网站

scrapy genspider doubanspider "https://book.douban.com"

结构图
结构是这样,douban.txt 是我运行完之后生成的,一开始没有

  1. scrapy.cfg: 项目的配置文件。
  2. items.py: 项目的目标文件。这里写要爬取的内容比如标题title、作者author等等
  3. pipelines.py: 项目的管道文件。这里负责数据处理,存储数据或者连接数据库
  4. settings.py: 项目的设置文件。配置一些重要东西
  5. spiders/: 存储爬虫代码目录。doubanspider是主要写爬虫代码的

在爬虫之前先对网页进行测试,在开发者工具 Network中看是get方法还是post方法。
这里是get
在这里插入图片描述

对豆瓣读书网站进行测试 参考链接 link

import requests
response = requests.get('https://book.douban.com/tag/%E5%90%8D%E8%91%97')
print(response)

输出: <Response [418]> 表示网站拒绝
解决方法:在 Network - Request Headers 里找到 User-Agent:

import requests
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}
response = requests.get('https://book.douban.com/tag/%E5%90%8D%E8%91%97', headers = header)
print(response)
# <Response [200]> 表示能够获取内容

能够请求到之后,将 User-Agent 加入到项目的 sittings.py 文件中

USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
3.开始写代码

将start_urls的值修改为需要爬取的第一个url
查看要爬取内容的位置,使用xpath定位
在这里插入图片描述
网上xpath的教程很多 参考链接 link

(1)doubanspider.py 完整的代码
爬取了标题title、网址url、书籍作者及信息author、内容介绍content(在parse_detail函数中)

import scrapy
from ..items import DoubanItem

class DoubanspiderSpider(scrapy.Spider):
    name = "doubanspider"              # 爬虫名
    allowed_domains = ["book.douban.com"]          # 搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页
    start_urls = ["https://book.douban.com/tag/%E5%90%8D%E8%91%97"]     # 爬虫从这里开始抓取数据

    def parse(self, response):
        for dom in response.xpath('//ul[@class="subject-list"]/li[@class="subject-item"]/div[@class="info"]'):
            title = dom.xpath('.//h2/a/text()').get()    # 在网站中找到相应标题的位置
            url = dom.xpath('.//h2/a/@href').get()
            author = dom.xpath('.//div[@class="pub"]/text()').get()
#           introduce = dom.xpath('.//p/text()').getall()

            item = DoubanItem()
            item['title'] = title
            item['url'] = url
            item['author'] = author
#           item['introduce'] = introduce

            yield scrapy.Request(url, meta={'item': item}, callback=self.parse_detail)

        next_page = response.xpath('//div[@class="paginator"]/span[@class="next"]/a/@href').get()   # 下一页按钮
        if next_page is not None:     # 判断是否到最后一页
            next_page = "https://book.douban.com" + next_page
            yield scrapy.Request(next_page, callback=self.parse)
    def parse_detail(self, response):
        content = response.xpath('//div[@id="wrapper"]/div[@id="content"]/div[@class="grid-16-8 clearfix"]/div[@class="article"]/div[@class="related_info"]/div[@class="indent"]/span[@class="short"]/div[@class="intro"]/p/text()').get()
        item = response.meta['item']
        item['content'] = content
        yield item

在这里插入图片描述
url是这本书标题点进去的地址,再爬取详情页的内容介绍
在这里插入图片描述
(2)items.py代码 —添加爬取的内容

import scrapy
class DoubanItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    url = scrapy.Field()
    author = scrapy.Field()
    # introduce = scrapy.Field()
    content = scrapy.Field()

(3)保存爬取的数据
settings.py 中设置激活Item Pipeline组件,数值表示优先级,数值越低优先级越高,习惯上在0-1000范围内定义数字。默认的300

ITEM_PIPELINES = { "douban.pipelines.DoubanPipeline": 300,}

pipelines.py 代码 保存在 douban.txt 文件中

from itemadapter import ItemAdapter
import json
class DoubanPipeline:
    def __init__(self):
        self.file = open('douban.txt', 'w', encoding='utf-8')

    def process_item(self, item, spider):
        content = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(content)
        return item

在终端的douban目录中执行

scrapy crawl doubanspider

正常就能爬到数据了
在这里插入图片描述


以上就是一份简单的爬虫代码,希望对你有所帮助。

  • 17
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用 Scrapy 框架爬取豆瓣的步骤: 1. 创建 Scrapy 项目 在命令行中输入以下命令创建一个新的 Scrapy 项目: ``` scrapy startproject douban ``` 这将会在当前目录下创建一个名为 `douban` 的文件夹,其中包含了 Scrapy 项目的基本结构。 2. 创建爬虫 在 `douban/spiders` 目录下创建一个名为 `douban_spider.py` 的文件,该文件将包含我们编写的爬虫代码。 在 `douban_spider.py` 中,我们需要定义一个类,该类需要继承自 Scrapy 提供的 Spider 类,并实现以下属性和方法: - `name`:爬虫的名称。 - `start_urls`:起始 URL 列表,爬虫将从这些 URL 开始抓取数据。 - `parse`:响应数据的解析函数,用于处理爬虫从页面中获取到的数据。 以下是一个简单的示例代码: ```python import scrapy class DoubanSpider(scrapy.Spider): name = "douban" start_urls = [ 'https://movie.douban.com/top250', ] def parse(self, response): # 处理抓取到的数据 pass ``` 3. 解析页面数据 在 `parse` 方法中,我们需要编写代码来解析页面数据。Scrapy 提供了一些方便的方法来获取页面中的数据,其中最常用的是 `response.xpath` 和 `response.css`。 以下是一个简单的示例代码,用于获取页面中的电影名称和评分: ```python def parse(self, response): for movie in response.xpath('//div[@class="hd"]'): yield { 'title': movie.xpath('.//span[@class="title"]/text()').get(), 'rating': movie.xpath('.//span[@class="rating_num"]/text()').get(), } ``` 4. 运行爬虫程序 在命令行中进入到项目目录下,运行以下命令即可启动爬虫程序: ``` scrapy crawl douban ``` 爬虫程序将会从起始 URL 开始抓取数据,并将抓取到的数据输出到控制台。可以通过一些设置来将数据保存到文件或数据库中。 以上就是使用 Scrapy 框架爬取豆瓣的基本步骤。需要注意的是,爬虫程序需要遵守网站的爬虫协议,不要过度频繁地访问页面,否则可能会被网站封禁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值