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文件
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)

注:scrapy的get请求为scrapy.Request() 

(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
}

八、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)、爬虫文件

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_readbook_097.items import ScrapyReadbook097Itemclass 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文件

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

(3)、pipelines.py文件

from itemadapter import ItemAdapterclass 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 itemdef close_spider(self,spider):self.fp.close()

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

ITEM_PIPELINES就行

九、日志信息和日志等级

1、日志级别(由高到低)

        CRITICAL:严重错误

        ERROR:一般错误

        WARNING:警告

        INFO:一般信息

        DEBUG:调试信息

默认的日志等级是DEBUG

注:只要出现了DEBUG或DEBUG以上等级的日志,那么这些日志将会打印。

2、settings.py文件的设置

(1)、LOG_FILE:将日志全部记录到文件中,该文件的后缀是.log

LOG_FILE = 'practice.log'

(2)、LOG_LEVEL:设置日志显示等级(不常用)

LOG_LEVEL = 'WARNING'

十、scrapy的post请求

由于start_urls和parse不能给post请求提供参数,故start_urls和parse都注释掉。

(1)、重新定义一个方法叫start_requests
    def start_requests(self):url = 'https://fanyi.baidu.com/sug'data = {'kw':'spider'}yield scrapy.FormRequest(url=url,formdata=data,callback=self.parse_second)

以及一个parse_second方法

   def parse_second(self,response):#python 3.10 版本,json。loads里不能用enconding='utf-8'content = response.textobj = json.loads(content.encode('utf-8'))print(obj)
(2)、start_requests的返回值

scrapy.FormRequest(url = url, headers = headers,callback = self.parse_second,formdata = data)

url :要发送的post地址

headers :头文件

callback:回调函数

formdata:post所携带的数据,是字典类型

十一、代理

1、到settings.py中,取消

DOWNLOADER_MIDDLEWARES = {

        'postproject.middleware.Proxy':543

}

的注释。

2、到middlewares.py中写代码

def process_request(self,request,spider):

        request.meta['proxy'] = 'https://111.11.111.11:1111'

        return None

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

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

相关文章

HTML 样式学习手记

HTML 样式学习手记 在探索网页设计的世界时&#xff0c;我发现HTML元素的样式调整真的是个很酷的环节。通过简单的属性设置&#xff0c;就能让文字换上五彩斑斓的颜色、变换各异的字体和大小。特别是那个style属性&#xff0c;感觉就像是一扇通往CSS魔法世界的大门。 代码小试…

【知识图谱+大模型的紧耦合新范式】Think-on-Graph:解决大模型在医疗、法律、金融等垂直领域的幻觉

Think-on-Graph&#xff1a;解决大模型在医疗、法律、金融等垂直领域的幻觉 Think-on-Graph 原理ToG 算法步骤&#xff1a;想想再查&#xff0c;查查再想实验结果 论文&#xff1a;https://arxiv.org/abs/2307.07697 代码&#xff1a;https://github.com/IDEA-FinAI/ToG Think…

Docker搭建MySQL8主从复制

之前文章我们了解了面试官&#xff1a;说一说Binlog是怎么实现的&#xff0c;这里我们用Docker搭建主从复制环境。 docker安装主从MySQL 这里我们使用MySQL8.0.32版本&#xff1a; 主库配置 master.cnf //基础配置 [client] port3306 socket/var/run/mysqld/mysql.sock [m…

如何使用phpStudy搭建网站并结合内网穿透远程访问本地站点

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

88 docker 环境下面 前端A连到后端B + 前端B连到后端A

前言 呵呵 最近出现了这样的一个问题, 我们有多个前端服务, 分别连接了对应的后端服务, 前端A -> 后端A, 前端B -> 后端B 但是 最近的时候 却会出现一种情况就是, 有些时候 前端A 连接到了 后端B, 前端B 连接到了 后端A 我们 前端服务使用 nginx 提供前端 html, js…

新增C++max函数的使用

在 C 中&#xff0c;max函数是标准库中的一个函数&#xff0c;用于返回两个或多个元素中的最大值。max函数的声明如下&#xff1a; cpp #include <algorithm>template<class T> const T& max(const T& a, const T& b);这个函数接受两个同类型的参数a…

代码随想录算法训练营第28天 | 93.复原IP地址 ,78.子集 ,90.子集II

回溯章节理论基础&#xff1a; https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 93.复原IP地址 题目链接&#xff1a;https://leetcode.cn/problems/restore-ip-addresses/ 思路&#xff1a; 这是切割问题&am…

SpringBoot Security安全认证框架初始化流程认证流程之源码分析

SpringBoot Security安全认证框架初始化流程&认证流程之源码分析 以RuoYi-Vue前后端分离版本为例分析SpringBoot Security安全认证框架初始化流程&认证流程的源码分析 目录 SpringBoot Security安全认证框架初始化流程&认证流程之源码分析一、SpringBoot Security安…

Windows 版Oracle 数据库(安装)详细过程

首先到官网上去下载oracle64位的安装程序 第一步&#xff1a;将两个datebase文件夹解压到同一目录中。 当下载完成后,它里面是两个文件夹 win64_11gR2_database_1of2, win64_11gR2_database_2of2,我们需要把其中的一个database文件夹整合在一起(复制一个database文件夹到另一…

U盘显示空间小于实际U盘空间的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

c语言贪食蛇游戏

演示视频 目录 一.概述 二.游戏开始前 修改控制台程序标题和大小 Win32 API GetStdHandle函数 GetConsoleCursorInfo函数和SetConsoleCursorInfo函数 SetConsoleCursorPosition函数 游戏开篇界面处理 创建地图 蛇身节点以及食物节点初始化 蛇身的初始化 整体蛇节点…

有趣的CSS - 多彩变化的按钮

目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面渲染效果 整体效果 这个按钮效果主要使用 :hover 、:active 伪选择器以及 animation 、transition 属性来让背景色循环快速移动形成视觉效果。 核心代码部分&#xff0c;简要说明了写法思路&…

frp新版toml配置

从frp v0.52.0 版本开始&#xff0c;frp 将TOML作为配置文件格式。INI 格式已被弃用&#xff0c;并将在未来的发布中移除。因此&#xff0c;frp v0.52.0 及更高版本的配置文件默认为TOML格式。 项目地址 GitHub&#xff1a;https://github.com/fatedier/frp/releases 服务端…

Django前后端分离之后端实践2

小实践&#xff1a;实现用户登录、注销及ORM管理功能、事务开启小实践 models.py class Books(models.Model):id models.CharField(primary_keyTrue,max_length20,verbose_name"图书ID")name models.CharField(max_length20,verbose_name图书名称)status models…

jsp商场会员卡管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 商场会员卡管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.…

Docker下安装GitLab

极狐GitLab Docker 镜像 | 极狐GitLab 安装所需最小配置 内存至少4G 系统内核至少3.10以上 uname -r 命令可以查看系统内核版本 安装Docker 1.更新 yum源 yum update 2.安装依赖(如果在操作第三步的时候提示yum-config-manager 未找到命令 就安装下面依赖) yum instal…

1Panel面板如何安装并结合内网穿透实现远程访问本地管理界面

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

【数据分享】1929-2023年全球站点的逐年降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 之前我们分享过1929-2023年全球气象站点的逐年平均气温数据、逐年最高气温数据…

Stable Diffusion 模型下载:Disney Pixar Cartoon Type B(迪士尼皮克斯动画片B类)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 这是我之前的模型迪士尼皮克斯卡通类型A与我自己训练的Lora在中途旅程图像上的合并结果。与之前的版本相比&#xff0c;男性和老年人看起来更像真正的皮克斯角色&a…

计算机设计大赛 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…