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的应用

e.g.爬取网站书籍的名称和图片
(1)、spider文件
import scrapy
from scrapy_dangdang_096.items import ScrapyDangdang096Itemclass 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 = 1def 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对象都可以再次调用xpathfor li in li_list:src = li.xpath('.//img/@data-original').extract_first()#第一张图片和其他图片的标签的属性是不一样的#第一张图片可以用src,其他图片的地址标签是data—originalif src!=None:src = srcelse: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交给pipelinesyield 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.htmlif self.page<100:self.page=self.page+1url = 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文件
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass 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文件
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 itemdef 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。

然后在字典中加入

#DangDangDownloadPipeline'scrapy_dangdang_096.pipelines.DangDangDownloadPipeline':301

,即开启多条pipeline。

总而言之:

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【揭秘SAML协议 — Java安全认证框架的核心基石】 从初识到精通,带你领略Saml协议的奥秘,告别SSO的迷茫与困惑

如何用Java构建安全认证框架的稳固基石 SAML协议简介SAML作用和效果为什么要使用SAML SAML角色组成SAML是怎么工作核心协议详解RelayState标志RelayState在防范CSRF攻击中的具体操作 SAMLRequest请求体元素解释 用户重定向IDP数据信息登录成功之后 注意&#xff1a;特此声明&am…

Android组件化中的Arouter学习

假设现在有两个业务组件登录和问答模块之间需要进行通信&#xff0c;可能会想到用反射的方式&#xff0c;是可以但是会影响性能&#xff0c;而写的代码比较多类名这些要记清楚。 路由可以看做表&#xff0c;每个map对应一张表 我们可以试着这么写&#xff0c;完成MainActivity跳…

20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式

20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式 2024/2/2 14:15 rootrootrootroot-X99-Turbo:~/whisper.cpp$ ./main -l zh -osrt -m models/ggml-medium.bin chs.wav 在纯CPU模式下&#xff0c;使用medium中等模型&#xff0c;7分钟的中文视频需要851829.69 ms&#xf…

实习|基于SSM的实习管理系统设计与实现(源码+数据库+文档)

实习管理系统目录 目录 基于SSM的实习管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能介绍 &#xff08;1&#xff09;管理员登录 &#xff08;2&#xff09;实训方向管理 &#xff08;3&#xff09;公告信息管理 &#xff08;4&#xff0…

Python程序设计 函数基础

简单函数 函数&#xff1a;就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。 函数的使用包含两个步骤&#xff1a; 定义函数 —— 封装 独立的功能 调用函数 —— 享受 封装 的成果 函数的作用&#xff0c;在开发程序时&#xff0c;使用…

交强险投保日期查询接口返回字段说明

API接口是现代互联网应用中重要的组成部分&#xff0c;通过接口的调用可以实现不同系统之间的数据交互和共享。在汽车保险行业中&#xff0c;交强险投保日期查询接口是非常关键的一个接口&#xff0c;本文将详细介绍该接口的返回字段和使用方法。 接口名称&#xff1a;交强险投…

ARP 解析 | 工作原理 | 安全风险及应对策略

介绍 ARP&#xff08;地址解析协议&#xff09;是一种网络协议&#xff0c;用于将IP地址映射到相应的物理硬件地址&#xff0c;如MAC地址。ARP的主要目的是在局域网&#xff08;LAN&#xff09;上解决IP地址和硬件地址之间的映射关系&#xff0c;以便实现数据包的正确传递。 A…

8. 字符串转换整数 (atoi)-LeetCode(Java)

8. 字符串转换整数 (atoi) 题目&#xff1a;8. 字符串转换整数 (atoi) 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入…

1295584-83-6,NOTA 马来酰亚胺,可通过与铁离子结合增强MRI信号

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;1295584-83-6&#xff0c;NOTA Maleimide&#xff0c;NOTA Mal&#xff0c;NOTA马来酰亚胺 一、基本信息 产品简介&#xff1a;NOTA Maleimide has good water solubility and stability, which enables it to main…

【代码随想录】LC 455. 分发饼干

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记&#xff0c;如有侵权&#xff0c;立即删除。 一、题目 1、原题链接 455. 分发饼干 2、题目描述 二、解题报告 1、…

【文件上传WAF绕过】<?绕过、.htaccess木马、.php绕过

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

go语言!! 来学习go吧,让我们一起go!go!go!

获取资源&#xff1a;关注公众号&#xff0c;回复&#xff1a;go 背景介绍 Go语言是谷歌推出的一种全新的编程语言&#xff0c;可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go&#xff0c;是因为过去10多年间软…