Python爬虫实战+Scrapy框架 爬取当当网图书信息

1、环境准备

  • 1、在python虚拟环境终端使用 pip install scrapy下载scrapy依赖库
  • 2、使用scrapy startproject book创建scrapy心目工程
  • 3、使用scrapy genspider dangdang dangdang.com创建spider爬虫实例

2、代码实操

  • dangdang.py文件内容
import urllib.parse
from copy import deepcopy

import scrapy


class DangdangSpider(scrapy.Spider):
    name = 'dangdang'
    allowed_domains = ['dangdang.com']
    start_urls = ['http://category.dangdang.com/']

    def start_requests(self):
    # 设置响应头 博主测试过没有配置Referer请求会被拦截
        headers = {
            "Referer":"http://book.dangdang.com/",
        }
        yield scrapy.Request(self.start_urls[0], headers=headers, callback=self.parse)

    def parse(self, response):
  		# 根据图书大分类进行分组 如图李1所示
        div_list = response.xpath('//div[@id="floor_1"]/div[@class="classify_kind"]')
        for div in div_list:
            item = {}
            item['b_cate'] = div.xpath('./div/a/text()').get()
            ul_list = div.xpath('./ul/li')
            # 根据图书小分类进行分组 如图例2所示
            for li in ul_list:
                item['s_cate'] = li.xpath('./a/text()').get()
                item['s_href'] = li.xpath('./a/@href').get()
                //deepcopy对数据进行深拷贝  由于scrapy是异步请求模式 使用深拷贝可以防止数据备覆盖
                yield scrapy.Request(item['s_href'], self.parse_book_list, meta={'item': deepcopy(item)})
	# 对图书列表页进行解析
    def parse_book_list(self, response):
        item = response.meta['item']
        book_list = response.xpath('//ul[@class="bigimg"]/li')
        # 对每一本图书进行分组 如图例三所示
        for li in book_list:
            item['book_name'] = li.xpath('./a/@title').get()
            item['book_img'] = li.xpath('./a/img/@src').get()
            if item['book_img'] is not None:
                item['book_img'] = urllib.parse.urljoin(response.url,item['book_img'])
            item['book_url'] = li.xpath('./a/@href').get()
            item['book_price'] = li.xpath('./p[@class="price"]/span[@class="search_now_price"]/text()').get()
            yield scrapy.Request(item['book_url'], self.parse_book_detail, meta={'item': deepcopy(item)})
        # 进行翻页操作
        next_url = response.xpath('//a[text()="下一页"]/@href').get()
        if next_url is not None:
            next_url = urllib.parse.urljoin(response.url,next_url)
            yield scrapy.Request(next_url,self.parse_book_list,meta={'item':item})
	# 对图书详情页进行解析
    def parse_book_detail(self, response):
        item = response.meta['item']
        item['author'] = response.xpath('//div[@class="messbox_info"]/span[1]/a/text()').get()
        item['book_press'] = response.xpath('//div[@class="messbox_info"]/span[2]/a/text()').get()
        item['publish_date'] = response.xpath('//div[@class="messbox_info"]/span[3]/text()').get()
        yield item
  • 图例1(只截取一部分)
    在这里插入图片描述
  • 图例2(只截取一部分)
    在这里插入图片描述
  • 图例3
    +在这里插入图片描述
  • piplines.py文件内容
import re
class BookPipeline:
    def process_item(self, item, spider):
    	# 将数据局转换成字典类型
        item = dict(item)
        # 对数据进一步处理 使数据更加美观
        if item['publish_date'] is not None:
            item['publish_date'] = re.sub(r'\xa0','',item['publish_date']).split(':')[-1]
        item['book_price'] = re.sub(r'¥','',item['book_price'])
        print(item)
  • settings.py文件内容
# 将日志等级设置为WARNING可以使终端打印更加干净
LOG_LEVEL = 'WARNING' 
# 开启pipline
ITEM_PIPELINES = {
   'book.pipelines.BookPipeline': 300,
}
# 其他为默认配置即可

以上就是博主在爬取当当网所有图书的案例 希望可以帮助你们
关注我 分享更多爬虫案例

  • 6
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是爬取图书网的实验步骤: 1. 创建 Scrapy 项目 使用命令行工具创建一个新的 Scrapy 项目,例如: ``` scrapy startproject books_crawler ``` 2. 定义 Item 在 `items.py` 文件中定义我们要爬取数据模型,例如: ```python import scrapy class Book(scrapy.Item): title = scrapy.Field() author = scrapy.Field() price = scrapy.Field() description = scrapy.Field() ``` 3. 定义 Spider 在 `spiders` 目录下创建一个新的 Spider,例如: ```python import scrapy from books_crawler.items import Book class BooksSpider(scrapy.Spider): name = 'books' allowed_domains = ['example.com'] start_urls = ['http://example.com/books/'] def parse(self, response): books = response.css('div.book') for book in books: item = Book() item['title'] = book.css('h2.title::text').get() item['author'] = book.css('p.author::text').get() item['price'] = book.css('p.price::text').get() item['description'] = book.css('p.description::text').get() yield item ``` 在 Spider 中,我们首先定义了 Spider 的名称、允许的域名和起始 URL。然后在 `parse` 方法中,使用 CSS Selector 提取书籍数据,并将其存储为 Item 对象。最后,使用 `yield` 关键字将 Item 对象传递给 Scrapy 引擎。 4. 配置 Pipeline 在 `settings.py` 文件中配置 Scrapy Pipeline,例如: ```python ITEM_PIPELINES = { 'books_crawler.pipelines.BooksCrawlerPipeline': 300, } FEED_FORMAT = 'csv' FEED_URI = 'books.csv' ``` 我们将数据存储在一个 CSV 文件中,因此需要将 `FEED_FORMAT` 设置为 `csv`,并指定 CSV 文件的路径。同时,将 `ITEM_PIPELINES` 设置为一个字典,其中包含我们定义的 Pipeline 类和优先级。 5. 定义 Pipeline 在 `pipelines.py` 文件中定义 Scrapy Pipeline,例如: ```python import csv class BooksCrawlerPipeline: def __init__(self): self.file = open('books.csv', 'w', newline='') self.writer = csv.writer(self.file) self.writer.writerow(['Title', 'Author', 'Price', 'Description']) def process_item(self, item, spider): self.writer.writerow([item['title'], item['author'], item['price'], item['description']]) return item def close_spider(self, spider): self.file.close() ``` 在 Pipeline 中,我们首先定义了一个 CSV 文件,并创建了一个 CSV writer 对象。然后,在 `process_item` 方法中,将每个 Item 对象写入 CSV 文件。最后,在 `close_spider` 方法中,关闭 CSV 文件。 6. 运行 Spider 使用如下命令启动爬虫: ``` scrapy crawl books ``` 如果一切正常,Scrapy 将开始爬取图书网,并将提取的数据存储在 `books.csv` 文件中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专业的小马哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值