Python爬虫学习之scrapy库

news/2024/7/19 11:49:08 标签: python, 爬虫, 学习, 笔记, scrapy

 一、scrapy库安装

pip install scrapy -i https://pypi.douban.com/simple

二、scrapy项目的创建

1、创建爬虫项目    打开cmd  输入scrapy startproject 项目的名字
                  注意:项目的名字不允许使用数字开头  也不能包含中文
2、创建爬虫文件    要在spiders文件夹中去创建爬虫文件
                  cd 项目的名字\项目的名字\spiders
                  cd scrapy_baidu_091\scrapy_baidu_091\spiders

                  创建爬虫文件
                  scrapy genspider 爬虫文件的名字 要爬取网页
                  e.g.scrapy genspider baidu www.baidu.com
                  不需要添加http协议  因为start_urls的值是根据allowed_domains修改的
                  所以添加了http的话,那么start_urls就需要我们手动去修改
3、运行爬虫代码
                  scrapy crawl 爬虫名字
                  e.g.
                  scrapy crawl baidu

三、scrapy项目的基本使用

scrapy项目的结构
    项目名字
        项目名字
            spiders文件夹(存储的是爬虫文件)
                __init__
                自定义的爬虫文件   核心功能文件
            __init__
            items       定义数据结构的地方
            middlewares  中间件 代理
            pipelines   管道  用来处理下载的数据
            settings    配置文件    robots协议    user-agent定义等

四、scrapy文件里的response方法

1、response对象

        response.text 获取响应的字符串

        response.body 获取二进制数据

        response.url    获取请求路径

        response.status   获取状态码

2、response解析

        response.xpath 解析response中的内容,返回一个selector列表对象

        response.css    使用css_selector查询元素,返回一个selector对象

3、处理selector

        response.extract() 提取seletor对象的data属性

        response.extract_first() 提取seletor列表的第一个数据

五、scrapy的架构组成及工作原理

1、引擎

会自动组织所有的请求对象,分发给下载器

2、下载器

从引擎处获取到请求对象后,请求数据

3、spiders

定义爬取动作和解析网页

4、调度器

无需关注

5、pipeline

处理数据的管道,会预留接口用来处理数据

六、scrapy shell的使用

1、什么是scrapy shell?

Scrapy shell是Scrapy框架提供的一个交互式shell工具,用于快速开发和调试爬虫。它允许用户在不启动完整爬虫程序的情况下,以交互的方式加载和请求网页,并使用选择器和Scrapy的API来提取和处理数据。

2、scrapy shell作用
  • 快速检查和测试网页的数据结构和内容;
  • 调试和验证爬虫的选择器和提取规则;
  • 测试和调试Scrapy的请求和响应处理逻辑;
  • 使用Scrapy的内置命令行工具来实验性地进行数据提取和处理。
3、可以安装ipython,显示更智能

在命令行窗口,输入pip install ipython

4、scrapy shell的使用

在命令行窗口输入,scrapy shell www.baidu.com

然后就可以直接在命令行窗口用response方法

七、scrapy.spider的应用

e.g.爬取网站书籍的名称和图片
(1)、spider文件
python">import scrapy
from scrapy_dangdang_096.items import ScrapyDangdang096Item

class DangSpider(scrapy.Spider):
    name = "dang"
    allowed_domains = ["category.dangdang.com"]
    start_urls = ["https://category.dangdang.com/cp01.54.92.01.00.00.html"]


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


    def parse(self, response):
# src = response.xpath('//ul[@id="component_59"]/li//img/@src')
#
# name = response.xpath('//ul[@id="component_59"]/li//img/@alt')
#
# price = response.xpath('//ul[@id="component_59"]/li//p[@class="price"]/span[1]')
        li_list = response.xpath('//ul[@id="component_59"]/li')

        #所有的selector对象都可以再次调用xpath
        for li in li_list:
            src = li.xpath('.//img/@data-original').extract_first()
            #第一张图片和其他图片的标签的属性是不一样的
            #第一张图片可以用src,其他图片的地址标签是data—original
            if src!=None:
                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()

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

            #获取一个book就将book交给pipelines
            yield book

#https://category.dangdang.com/cp01.54.92.01.00.00.html
#https://category.dangdang.com/pg2-cp01.54.92.01.00.00.html
#https://category.dangdang.com/pg3-cp01.54.92.01.00.00.html

        if self.page<100:
            self.page=self.page+1

            url = self.base_url + str(self.page) + '-cp01.54.92.01.00.00.html'
                #怎么去调用parse方法
                #scrapy.Request就是scrapy的get请求
                #url就是请求地址
                #callback是你要执行的那个函数   注意不需要加()

            yield scrapy.Request(url = url,callback = self.parse)
(2)、items.py文件
python"># Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class ScrapyDangdang096Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()

    #图片
    src = scrapy.Field()

    #名字
    name = scrapy.Field()

    #价格
    price = scrapy.Field()
(3)、pipelines.py文件
python">import urllib.request
#如果想使用pipelines,就要先在settings中打开pipelines
class ScrapyDangdang096Pipeline:
    #在爬虫文件开始之前执行
    def open_spider(self,spider):
        self.fp = open('book.json','w',encoding='utf-8')
    # item就是yield后面的对象
    def process_item(self, item, spider):

        self.fp.write(str(item))
        #(1)write 方法必须写字符串
        #(2)a模式是追加写
        # with open('book.json','a',encoding='utf-8') as fp:
        #     fp.write(str(item))
        return item
    def close_spider(self,spider):
        self.fp.close()


#多条管道开启
#(1)定义管道类
#(2)在settings中开启管道
#将'scrapy_dangdang_096.pipelines.DangDangDownloadPipeline':301写入pipelines.py文件
class DangDangDownloadPipeline:
    def process_item(self,item,spider):
        url = 'http:'+item.get('src')

        filename = './books'+item.get('name')+'.jpg'

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



        return item
(4)、settings.py文件

这个文件里取消   ITEM_PIPELINES  的注释,即开启pipeline。

然后在字典中加入

python">#DangDangDownloadPipeline
   'scrapy_dangdang_096.pipelines.DangDangDownloadPipeline':301

,即开启多条pipeline。

总而言之:

python">ITEM_PIPELINES = {
    #pipelines可以有多个,管道是有优先级的,优先级的范围是1到1000,且值越小优先级越高
   "scrapy_dangdang_096.pipelines.ScrapyDangdang096Pipeline": 300,

   #DangDangDownloadPipeline
   'scrapy_dangdang_096.pipelines.DangDangDownloadPipeline':301
}

八、crawl spider的简介

1、创建项目步骤
(1)、创建项目 scrapy startproject readproject
(2)、跳转到spiders路径 cd \readproject\readproject\spiders
(3)、创建爬虫scrapy genspider -t crawl read www.dushu.com
(4)、items
(5)、spiders
(6)、settings
(7)、pipelines
            数据保存到本地.json文件中
            也可以数据保存到MySQL数据库(本文未阐述)
2、提取链接

链接提取器:scrapy.linkextractors.LinkExtractor()里面的

allow = (),     #正则表达式,提取符合正则的链接

deny=(),  #正则表达式,不提取符合正则的链接

allow_domains = (), #允许的域名

deny_domains = (), #不允许的域名

restrict_xpaths = (), #xpath , 提取符合xpath规则的链接

restrict_css = (), #提取符合选择器规则的链接

其中正则表达式用法示例:links1 = LinkExtractor(allow = r'list_10_\d+\.html')

3、运行原理

4、crawl spider的应用

e.g.爬取读书网的书籍信息

(1)、爬虫文件

python">import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_readbook_097.items import ScrapyReadbook097Item

class ReadSpider(CrawlSpider):
    name = "read"
    allowed_domains = ["www.dushu.com"]
    start_urls = ["https://www.dushu.com/book/1175_1.html"]
                                                                                        #True 是继续跟进,往后爬取
    rules = (Rule(LinkExtractor(allow=r"/book/1175_\d+\.html"), callback="parse_item", follow=True),)

    def parse_item(self, response):

        img_list = response.xpath('//div[@class="bookslist"]//a/img')

        for img in img_list:
            name = img.xpath('./@alt').extract_first()
            src = img.xpath('./@data-original').extract_first()

            book = ScrapyReadbook097Item(name = name,src = src)
            yield book

(2)、items.py文件

python">import scrapy


class ScrapyReadbook097Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = scrapy.Field()

    src = scrapy.Field()

(3)、pipelines.py文件

python">from itemadapter import ItemAdapter


class ScrapyReadbook097Pipeline:

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

    def process_item(self, item, spider):
        self.fp.write(str(item))
        return item

    def close_spider(self,spider):
        self.fp.close()

(4)、settings.py文件里打开

ITEM_PIPELINES就行


http://www.niftyadmin.cn/n/5362077.html

相关文章

SpringCloud_学习笔记_3_sentinel

微服务保护 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff…

基于SSM的医院管理系统的设计与实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的医院管理系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过…

Could not load dynamic library ‘libcusolver.so.10‘

详细解决方案参考&#xff1a;pip安装tf-gpu2.4的bug解决方案-CSDN博客 这个错误表明你的程序试图加载名为 libcusolver.so.10 的动态库&#xff0c;但是没有找到。libcusolver 是 NVIDIA CUDA 工具包中的一个库&#xff0c;专门用于解决线性代数方程组。 解决方法&#xff1…

Servlet(未完结~)

文章目录 前言1 Servlet简介2 Servlet初识2.1 Servlet开发流程2.2 配置欢迎页 3 Servlet案例开发!3.1 开发登录页3.2 开发后台Servlet3.3 配置Servlet 4 HttpServletRequest4.1 回顾http请求4.2 自定义servlet流程图4.3 HttpServletRequest4.4获取请求行信息4.5获取请求头信息4…

【c语言】strcpy()和strncpy():字符串复制详解

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&a…

20240202在WIN10下使用fast whisper缺少cudnn_ops_infer64_8.dll

20240202在WIN10下使用fast whisper缺少cudnn_ops_infer64_8.dll 2024/2/2 10:48 https://blog.csdn.net/feinifi/article/details/132548556 Could not locate cudnn_ops_infer64_8.dll. Please make sure it is in your library path!解决办法 安装cuDNN c:\faster-whisper-…

Javaweb之SpringBootWeb案例之yml配置文件的详细解析

4.2 yml配置文件 前面我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置&#xff0c;那其实呢&#xff0c;在springboot项目当中是支持多种配置方式的&#xff0c;除了支持properties配置文件以外&#xff0c;还支持另外一种类型的配置文件&am…

【git指南】git 本地代码版本控制

文章目录 git 本地代码版本控制1 设置全局 Git 用户名和邮箱2 初始化仓库3 提交文件4 文件修改5 版本对比6 版本回退7 版本分支8 版本合并 git 本地代码版本控制 ​ 下面介绍在 vscode 中如何利用 git 对本地代码进行版本控制。可以查看官网介绍来获得更详细的内容。 1 设置全…