Scrapy爬虫学习

Scrapy爬虫学习一

  • 1 scrapy框架
    • 1.1 scrapy 是什么
    • 1.2 安装scrapy
  • 2 scrapy的使用
    • 2.1创建scrapy项目
    • 2.2 创建爬虫文件
    • 2.3爬虫文件的介绍
    • 2.4 运行爬虫文件
  • 3 爬取当当网前十页数据
    • 3.1 dang.py:爬虫的主文件
    • 3.2 items.py 定义数据结构
    • 3.3 pipelines.py 管道
    • 3.4 执行命令

1 scrapy框架

1.1 scrapy 是什么

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

1.2 安装scrapy

使用anaconda安装是比较方便的,直接使用命令

pip install scrapy

2 scrapy的使用

2.1创建scrapy项目

在终端输入命令

scrapy startproject dangdang(项目名称)

创建之后的文件如下
在这里插入图片描述
在这里插入图片描述

2.2 创建爬虫文件

首先跳转到项目下的spiders目录下

cd dangdang/dangdang/spiders

创建自定义爬虫文件,使用命令
scrapy genspider 爬虫名字 网页的域名
例如当当网的域名为https://category.dangdang.com/

scrapy genspider dang https://category.dangdang.com/

会在spiders目录下生成dang.py的文件
在这里插入图片描述

2.3爬虫文件的介绍

继承scrapy.Spider类
在这里插入图片描述

class DangSpider(scrapy.Spider):
    name = "dang"   # 运行爬虫文件使用的名字
    allowed_domains = ["category.dangdang.com"]  # 爬虫允许的域名,在爬虫的时候,如果不是此域名之下的url,会被过滤掉
    start_urls = ["https://category.dangdang.com/"]  # 声明了爬虫的起始地址,可以写多个url,一般是一个

    def parse(self, response):   # 解析数据的回调函数
        pass                     # response.text  响应的是字符串
                               	# response.body  响应的是字符串

2.4 运行爬虫文件

使用如下命令运行爬虫文件

scrapy crawl dang(爬虫名称)

3 爬取当当网前十页数据

直接使用上述的项目

3.1 dang.py:爬虫的主文件

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//img/@src
        #alt = //ul[@id="component_59"]/li//img/@alt
        # price = //ul[@id="component_59"]/li/p[@class="price"]/span[1]/text()
        # 所有的selector对象 都可以再次调用xpath方法
        li_list = response.xpath('//ul[@id="component_59"]/li')
        for li in li_list:
            src = li.xpath('.//img/@data-original').extract_first()  # extract_first()提取数组第一个selector的data
            # 第一张图片和其他图片的标签属性是不一样的
            # 第一张图片的src是可以使用的  其他的图片地址是data-original
            if src :
                src = src
            else:
                src = li.xpath('.//img/@src').extract_first()
            name = li.xpath('.//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)
            #  获取一个book  交给pipeline管道
            yield book

        # http://category.dangdang.com/pg1-cp01.01.02.00.00.00.html

        if self.page<10:
            self.page = self.page +1
            url = self.base_url+str(self.page) + '-cp01.01.02.00.00.00.html'
            # scrapy.Request就是scrapy就是get请求
            # url就是请求地址  callback就是回调,也就是要执行的函数 再次调用parse函数
            yield scrapy.Request(url=url,callback=self.parse)

yield函数:

  1. 带有yield的函数不再是一个普通函数,而是一个生成器generator,可用于迭代

  2. yield是一个类似return的关键字,迭代一次遇到yield就返回yield右边的值。

3.2 items.py 定义数据结构

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.3 pipelines.py 管道

可定义多个管道。本案例使用双管道爬取,一个下载对应的json,一个爬取下载对应的图片

# 使用管道 在settings 中开启管道
#
class DangdangPipeline:
    # item就是yield后面的book对象
    def open_spider(self,spider):
        print('-----open-----')
        self.fp = open('book.json','w',encoding='utf-8')

    def process_item(self, item, spider):
        #过去频繁 不推荐
        # #保存到文件中  w模式每次写都会打开一次文件 会覆盖之前的文件
        # with open('book.json','a',encoding='utf-8') as fp:
        #     fp.write(str(item))
        self.fp.write(str(item))
        return item

    def close_spider(self,spider):
        print('-----close-----')
        self.fp.close()

# 多条管道开启
# 'scrapy_dangdang.pipelines.DangDangDownloadPipeline': 301,#多条管道
class DangDangDownloadPipeline:
    def process_item(self, item, spider):
        filename = './book/'+item.get('name')+'.jpg'
        urllib.request.urlretrieve(url='http:'+item.get('src'),filename=filename)
        return item

使用前在settings.py设置类中,设置过管道爬取

ITEM_PIPELINES = {
    # 管道是有优先级0-1000   值越小优先级越高
   "dangdang.pipelines.DangdangPipeline": 300,
   'dangdang.pipelines.DangDangDownloadPipeline': 301
}

3.4 执行命令

scrapy crawl dang

管道一DangdangPipeline类爬取的书名、价格、图片地址
在这里插入图片描述
管道二DangDangDownloadPipeline类下载的书的图片
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/252139.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

万兆网络之屏蔽线序接法(中)

在介绍优质网线选购之前&#xff0c;先简单介绍一下水晶头 1毛钱一颗跟1元一颗的水晶头&#xff0c;往往是金手指厚度差别&#xff0c;你可以想象压制的时候可能会有什么情况 另外&#xff0c;一些3元一颗的镀金水晶头会有15U、30U之类的是电镀厚度单位&#xff0c;数值越大镀…

Maui blazor与sqlite开发一个增删改查

在android端增删改不能运行。也看不出来是什么&#xff0c;但运行到windows可以运行。 引入sqlite-net-pcl 开发Model using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.T…

工具在手,创作无忧:一键下载安装Auto CAD工具,让艺术创作更加轻松愉悦!

不要再浪费时间在网上寻找Auto CAD的安装包了&#xff01;因为你所需的一切都可以在这里找到&#xff01;作为全球领先的设计和绘图软件&#xff0c;Auto CAD为艺术家、设计师和工程师们提供了无限的创作潜力。不论是建筑设计、工业设计还是室内装饰&#xff0c;Auto CAD都能助…

HYDRA爆破之王(服务多)(用法简单)

#江南的江 #每日鸡汤&#xff1a;如果你向神求助&#xff0c;说明你相信神的能力。如果神没有帮助你&#xff0c;说明神相信你的能力。 #初心和目标&#xff1a;善用网络安全。。。 HYDRA 1.Hydra的简介 --------------------------------------------------------------------…

写递归函数的一些思考

当编写递归函数时&#xff0c;有几个关键的思考点可以帮助你设计和实现递归算法&#xff1a; 定义递归的基本情况&#xff1a;确定递归函数应该在何时终止&#xff0c;即递归的基本情况。这是一个递归的出口条件&#xff0c;确保递归不会无限进行下去。基本情况应该是可以直接求…

RabbitMq交换机详解

目录 1.交换机类型2.Fanout交换机2.1.声明队列和交换机2.2.消息发送2.3.消息接收2.4.总结 3.Direct交换机3.1.声明队列和交换机3.2.消息接收3.3.消息发送3.4.总结 4.Topic交换机4.1.说明4.2.消息发送4.3.消息接收4.4.总结 5.Headers交换机5.1.说明5.2.消息发送5.3.消息接收5.4.…

Ubuntu 常用命令之 ln 命令用法介绍

ln命令在Ubuntu系统中用于创建硬链接或符号链接。硬链接是指向文件的物理地址&#xff0c;而符号链接&#xff08;也称为软链接&#xff09;是指向文件路径的引用。 命令格式&#xff1a;ln [选项]... [-T] 目标&#xff08;源文件&#xff09; 链接&#xff08;目标文件&…

12.16_黑马数据结构与算法笔记Java

目录 167 B树 remove 168 B树 remove 搭架子 169 B树 remove case1-4 170 B树 remove case5-6分析 171 B树 remove case5 旋转 172 B树 remove case5 合并 173 B树 remove case6 174 B树 remove 演示1 175 B树 remove 演示2 176 哈希表 概述 177 哈希表 hash码映射索…

将html的radio单选框自定义样式为正方形和对号

将html的radio单选框自定义样式为正方形和对号 背景&#xff1a; 如何能把html的<input type"radio" name"option">改成自定义的样式呢&#xff1f;比如想要把他变成正方形&#xff0c;选中的时候是对号。默认的样式太丑了 默认样式&#xff1a; 自…

LCR 146. 螺旋遍历二维数组

解题思路&#xff1a; class Solution {public int[] spiralArray(int[][] array) {if(array.length 0) return new int[0];int l 0, r array[0].length - 1;int t 0, b array.length - 1;int x 0;int[] res new int[(r 1) * (b 1)];while(true) {for(int i l; i <…

Linux(23):Linux 核心编译与管理

编译前的任务&#xff1a;认识核心与取得核心原始码 Linux 其实指的是核心。这个【核心(kernel)】是整个操作系统的最底层&#xff0c;他负责了整个硬件的驱动&#xff0c;以及提供各种系统所需的核心功能&#xff0c;包括防火墙机制、是否支持 LVM 或 Quota 等文件系统等等&a…

C语言入门基础(二)

基本概念 地址 计算机的内存是一块用于存储数据的空间&#xff0c;由一系列连续的存储单元组成&#xff0c;就像下面这样&#xff0c; 每一个单元格都表示1个Bit&#xff0c;一个bit在EE专业的同学看来就是高低电位&#xff0c;而在CS同学看来就是0&#xff0c;1两种状态。 …

cpp_02_函数重载_动态内存分配_左值右值_引用_内联函数

1 函数重载 1.1 定义 要求&#xff1a; 1&#xff09;同一作用域内 2&#xff09;函数名相同 3&#xff09;形参表不同&#xff08;与形参个数及每个形参类型有关&#xff0c;与形参名无关&#xff09; 重载关系的函数调用哪个&#xff1a; 根据实参类型和形参类型进行匹配&…

降采样方法对NCC得分的影响因素评估

定位算法原理 关于不同的定位场景,最适合使用的算法原理,Halcon的原理文档中描述如下: 在图案缩放可用忽略,图案纹理丰富的场景,适合采用基于互相关的匹配。 输入参考图像,搜索图像,参考图像在搜索图像上滑动,得到滑动位置的NCC得分。如下图所示,高于阈值的最亮的地…

基于循环神经网络长短时记忆(RNN-LSTM)的大豆土壤水分预测模型的建立

Development of a Soil Moisture Prediction Model Based on Recurrent Neural Network Long Short-Term Memory in Soybean Cultivation 1、介绍2、方法2.1 数据获取2.2.用于预测土壤湿度的 LSTM 模型2.3.土壤水分预测的RNN-LSTM模型的建立条件2.4.预测土壤水分的RNN-LSTM模型…

后端项目-自定义接口响应结果设计JsonResult

文章接上文&#xff1a;后端接口增删改查 上文中返回的值是string格式&#xff0c;明显是不合适。 一般情况下&#xff0c;我们返回给前台的都是对象格式&#xff0c;结合添加在类上添加RestController注解&#xff0c;标记此类中所以的处理请求的方法都是响应正文的&#xff…

dp中最短编辑距离的笔记(分析dp)

dp分析往往就是看最后一步的变化。 分析&#xff1a; 设a串长度为i&#xff0c;b串长度为j。题目要求为通过三种操作将a字符串转化为b字符串的最少次数。 删除操作&#xff1a; 把a[i]删除后a[1~i]和b[1~j]匹配&#xff0c;所以可以得到f[i - 1][j] 1&#xff0c;在此之前要先…

Crocoddyl: 多接触最优控制的高效多功能框架

系列文章目录 前言 我们介绍了 Crocoddyl&#xff08;Contact RObot COntrol by Differential DYnamic Library&#xff09;&#xff0c;这是一个专为高效多触点优化控制&#xff08;multi-contact optimal control&#xff09;而定制的开源框架。Crocoddyl 可高效计算给定预定…

java minio通过getPresignedObjectUrl设置(自定义)预签名URL下载文件的响应文件名之minio源码改造方案

Minio预签名URL自定义响应文件名之Minio源码改造 需求说明Minio源码改造一、环境准备二、下载Minio源代码三、修改源代码1.修改cmd目录下的api-router.go这个代码文件2.将filename参数值设置到响应头4.修改验证签名时是否需要带入filename参数验证 四、大功告成&#xff0c;编译…

外包干了一个月,技术有明显提升。。。。。

先说一下自己的情况&#xff0c;本科生生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试…
最新文章