Scarpy爬取当当网书籍

目录

1:Scarpy

          (1)  Scrapy是什么:

          (2)安装scrapy:

2.scrapy项目的创建以及运行

        1.创建scrapy项目:

        2.项目组成:

         3.创建爬虫文件

        4.爬虫文件的基本组成:

        5.运行爬虫文件:

3.scrapy工作原理

3.yield

4.爬取当当网案例

        1:项目结构

         2:dang.py文件

        2.items文件

         3.pipelines文件

 5运行截图


1:Scarpy

          (1)  Scrapy是什么:

          Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理 或存储历史数据等一系列的程序中。

          (2)安装scrapy:

            pip install scrapy

2.scrapy项目的创建以及运行

        1.创建scrapy项目:

                终端输入 scrapy startproject 项目名

        2.项目组成:

                spiders
                        __init__.py
                自定义的爬虫文件.py         ‐‐‐》由我们自己创建,是实现爬虫核心功能的文件
                __init__.py
                items.py         ‐‐‐》定义数据结构的地方,是一个继承自scrapy.Item的类
                middlewares.py         ‐‐‐》中间件 代理
                pipelines.py         ‐‐‐》管道文件,里面只有一个类,用于处理下载数据的后续处理
        默认是300优先级,值越小优先级越高(1‐1000
                settings.py         ‐‐‐》配置文件 比如:是否遵守robots协议, User‐Agent 定义等
        

         3.创建爬虫文件

                 a:    跳转到spiders文件夹 cd 目录名字 /目录名字 /spiders
                 b:    scrapy genspider 爬虫名字 网页的域名
        

        4.爬虫文件的基本组成:

                继承scrapy . Spider
                name = 'baidu' ‐‐‐ 》 运行爬虫文件时使用的名字
                allowed_domains ‐‐‐ 》 爬虫允许的域名,在爬取的时候,如果不是此域名之下的 url,会被过滤掉
                start_urls ‐‐‐ 》 声明了爬虫的起始地址,可以写多个 url ,一般是一个
                parse ( self , response ) ‐‐‐ 》解析数据的回调函数
                response . text ‐‐‐ 》响应的是字符串
                response . body ‐‐‐ 》响应的是二进制文件
                response . xpath () xpath 方法的返回值类型是 selector 列表
                extract () ‐‐‐ 》提取的是 selector 对象的是 data
                extract_first () ‐‐‐ 》提取的是 selector 列表中的第一个数据

        5.运行爬虫文件:

                scrapy crawl 爬虫名称
                注意:应在spiders文件夹内执行

3.scrapy工作原理

Scarpy爬取当当网书籍_第1张图片

3.yield

        1. 带有 yield 的函数不再是一个普通函数,而是一个生成器 generator ,可用于迭代
        2. yield 是一个类似 return 的关键字,迭代一次遇到 yield 时就返回 yield 后面 ( 右边 ) 的值。重点是:下一次迭代 时,从上一次迭代遇到的yield 后面的代码 ( 下一行 ) 开始执行

4.爬取当当网案例

        1:项目结构

                Scarpy爬取当当网书籍_第2张图片

         2:dang.py文件

                

import scrapy
from dangdang.items import DangdangItem



class DangSpider(scrapy.Spider):
    name = 'dang'
    allowed_domains = ['category.dangdang.com']
    start_urls = ['http://category.dangdang.com/cp01.01.02.00.00.00.html']

    base_url = 'http://category.dangdang.com/pg'
    page = 1

    def parse(self, response):
        # src = //ul[@id="component_59"]/li//a/img/@src
        # name = //ul[@id="component_59"]/li//a/img/@alt
        # price = //ul[@id="component_59"]/li//p[@class="price"]/span[1]/text()
        print("========================================")
        li_list = response.xpath('//ul[@id="component_59"]/li')
        for li in li_list:
            # 首张图片使用@src,其他图片使用@data-original
            src = li.xpath('.//a/img/@data-original').extract_first()
            if src:
                src = src
            else:
                src = li.xpath('.//a/img/@src').extract_first()
            name = li.xpath('.//a/img/@alt').extract_first()
            price = li.xpath('.//p[@class="price"]/span[1]/text()').extract_first()
            print(src,name,price)

            book = DangdangItem(src=src,name=name,price=price)

            yield book

        if self.page<100:
            self.page =self.page+1
            url =self.base_url + str(self.page) + '-cp01.01.02.00.00.00.html'
            # scrapy的get请求
            yield scrapy.Request(url=url,callback=self.parse)



        2.items文件

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class DangdangItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    src = scrapy.Field()    # 图片
    name = scrapy.Field()   # 名字
    price = scrapy.Field()  # 价格

         3.pipelines文件

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter


class DangdangPipeline:

    # Before
    def open_spider(self,spider):
        self.f = open('book.json','w',encoding='utf-8')

    # After
    def close_spider(self,spider):
        self.f.close()

    # item 就是 yield返回的book
    def process_item(self, item, spider):
        # write必须是字符串
        self.f.write(str(item))

        return item

import urllib.request
# 'dangdang.pipelines.DangdangDownloadPipeline': 301, 需要在setting中开启
class DangdangDownloadPipeline:
    # item 就是 yield返回的book
    def process_item(self, item, spider):
        url = 'http:'+item.get('src')
        # 需提前建立文件夹books
        filename = './books/' + item.get('name') + '.jpg'

        urllib.request.urlretrieve(url=url,filename=filename)

        return item

 5运行截图

Scarpy爬取当当网书籍_第3张图片

 

你可能感兴趣的