ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Scarpy爬取当当网书籍

2021-10-13 09:04:37  阅读:143  来源: 互联网

标签:src name 当当网 爬虫 li 爬取 item scrapy 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工作原理

3.yield

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

4.爬取当当网案例

        1:项目结构

                

         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运行截图

 

标签:src,name,当当网,爬虫,li,爬取,item,scrapy,Scarpy
来源: https://blog.csdn.net/m0_57126456/article/details/120736540

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有