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 scrapyfrom dangdang.items import DangdangItemclass 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 = 1def 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-originalif src :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()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.htmlif self.page<10:self.page = self.page +1url = 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 itemdef 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.mzph.cn/news/219378.shtml

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

相关文章

总结了人工智能领域,能源领域,电气领域比较好中的一些sci期刊!!仅供参考

文章目录 前言一、总结了人工智能领域&#xff0c;能源领域&#xff0c;电气领域比较好中的一些sci期刊 总结 前言 期刊查询网站&#xff1a; https://www.letpub.com.cn/index.php?pagejournalapp&viewsearch 链接: 点我跳转期刊查询网站 一、总结了人工智能领域&#…

【Spring】02 Bean 的命名

文章目录 1. 定义2. 使用优势3. 如何命名4. 注解驱动5. 最佳实践1&#xff09;使用明确的业务名词2&#xff09;避免缩写和首字母缩略词2&#xff09;不要过度使用别名 结语 在 Spring 框架中&#xff0c;Bean 是应用程序中的主要组件&#xff0c;负责承载和管理应用的核心功能…

【python-wrf】绘制wrf中的土地利用报错内容及其解决方法

从该代码处绘制wrf中的土地利用报错内容及其解决方法 1.报错内容&#xff1a; 微信公众平台 (qq.com)https://mp.weixin.qq.com/s/Cn0vhvfroVADPnT237LXNw --------------------------------------------------------------------------- AttributeError …

mysql 字符串合并方法以及合并为null问题

concat()不推荐 mysql一般提供了两种一种是concat()函数一种是concat_ws()函数&#xff0c;前者合并字符串有个弊端&#xff0c;合并字段不能有null值&#xff0c; 否则如下图合并后会是null concat_ws()推荐 concat_ws()函数可以解决合并字符串为null问题&#xff0c;conca…

使用Microsoft Dynamics AX 2012 - 8. 财务管理

财务管理的主要职责是控制和分析与货币金额有关的所有交易。这些事务发生在整个组织的业务流程中。 因此&#xff0c;财务管理是企业管理解决方案的核心领域。在Dynamics AX中&#xff0c;支持所有部门业务流程的应用程序的深度集成可立即提供准确的财务数据。 分类账交易的原…

MySQL 中Relay Log打满磁盘问题的排查方案

MySQL 中Relay Log打满磁盘问题的排查方案 引言&#xff1a; MySQL Relay Log&#xff08;中继日志&#xff09;是MySQL复制过程中的一个重要组件&#xff0c;它用于将主数据库的二进制日志事件传递给从数据库。然而&#xff0c;当中继日志不断增长并最终占满磁盘空间时&…

实操Nginx(4层代理+7层代理)+Tomcat多实例部署,实现负载均衡和动静分离

目录 前言 一、tomcat多实例部署 步骤一&#xff1a;先安装jdk&#xff0c;设置jdk的环境变量&#xff0c;验证是否安装完成&#xff08;192.168.20.8&#xff09; 步骤二&#xff1a;安装tomcat&#xff08;192.168.20.18&#xff09; 步骤三&#xff1a;安装tomcat多实例…

快速上手linux | 一文秒懂Linux各种常用目录命令(上)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 一 、命令提示符和命令的基本格式1.1 如何查看主机名称及修改 二、命令基本格式2.1 命令格式示例2.2 参数的作用…

Spring Cloud gateway - CircuitBreaker GatewayFilte

前面学习Spring cloud gateway的时候&#xff0c;做测试的过程中我们发现&#xff0c;Spring Cloud Gateway不需要做多少配置就可以使用Spring Cloud LoadBalance的功能&#xff0c;比如&#xff1a; spring:application:name: spring-gatewaycloud:gateway:routes:- id: path…

ELK简单介绍二

学习目标 能够部署kibana并连接elasticsearch集群能够通过kibana查看elasticsearch索引信息知道用filebeat收集日志相对于logstash的优点能够安装filebeat能够使用filebeat收集日志并传输给logstash kibana kibana介绍 Kibana是一个开源的可视化平台,可以为ElasticSearch集群…

电子取证中Chrome各版本解密Cookies、LoginData账号密码、历史记录

文章目录 1.前置知识点2.对于80.X以前版本的解密拿masterkey的几种方法方法一 直接在目标机器运行Mimikatz提取方法二 转储lsass.exe 进程从内存提取masterkey方法三 导出SAM注册表 提取user hash 解密masterkey文件&#xff08;有点麻烦不太推荐&#xff09;方法四 已知用户密…

插入算法(C语言)

#include<cstdio> #include<iostream> #define N 9 using namespace std; int main() {int arr[N1] { 1,4,7,13,16,19,22,25,280 }; int in,i,j;//要插入的数字//打印要插入数字的数组所有元素printf("插入前的数组: ");for ( i 0; i <N; i){print…

STM32G030C8T6:使用外部晶振配置LED灯闪烁

本专栏记录STM32开发各个功能的详细过程&#xff0c;方便自己后续查看&#xff0c;当然也供正在入门STM32单片机的兄弟们参考&#xff1b; 本小节的目标是&#xff0c;使用STM32G030C8T6单片机&#xff0c;通过STM32CubeMX软件&#xff0c;配置并使用外部8MHz晶振&#xff0c;实…

6. Service详解

6. Service详解 文章目录 6. Service详解6.1 Service介绍6.2 Service类型6.3 Service使用6.3.1 实验环境准备6.3.2 ClusterIP类型的Service6.3.3 HeadLess类型的Service6.3.3.1 deployment和statefulset区别6.3.3.2 statefulset deployment 区别 6.3.4 NodePort类型的Service6.…

扩展操作码指令格式

指令 操作码地址码 \quad \quad 判断几地址指令 开头4位不是全1, 则表示是三地址指令 开头4位全1, 后面4位不是全1, 则为二地址指令 前面12全1, 则为零地址指令 当然啦这只是一种扩展方法, 如果想扩展更多, 可以将1110留作扩展操作码 较短的操作码, 我们对它的译码和分析的时间…

点云几何 之 判断某一点是否在三角形的边上(3)

点云几何 之 判断某一点是否在三角形的边上&#xff08;3&#xff09; 一、算法介绍二、算法实现1.代码2.结果 总结 一、算法介绍 判断某一点是否在三角形的边上 之前已经介绍了点在三角形的内外判断方法&#xff0c;这里增加点恰好在三角形边上的判断方法 &#xff08;本质上…

节流防抖:提升前端性能的秘密武器(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

vue3使用mars3d实现地图轮播高亮,且每个区域颜色不一样

效果图(珙县就是轮播高亮的效果) 思路:初始化一张完整的地图&#xff0c;然后定时器去挨个生成每个县上的地图&#xff0c;并且覆盖在原来的位置&#xff0c;每到一定的时间&#xff0c;就清除之前生成高亮图并且生成下一张高亮图 如何引入地图 上篇文章已详细发过 略 父组…

【JavaWeb学习笔记】7 - Servlet入门开发

零、在线文档 Servlet 3.1 API Documentation - Apache Tomcat 8.0.53 一、Servlet基本介绍 1.为什么出现Servlet 提出需求:请用你现有的html css javascript&#xff0c;开发网站&#xff0c;比如可以让用户留言/购物/支付,你能搞定吗? 不能 这几个不能直接操作数据库 …