尚硅谷爬虫note14

一、scrapy

scrapy:为爬取网站数据是,提取结构性数据而编写的应用框架

1. 安装

        pip install scrapy

或者,国内源安装

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

2. 报错

        报错1)building ‘twisted.test.raiser’ extension

原因:缺少twisted库

解决:下载twisted库:

        a)cp是python版本

        b)amd是操作系统版本

        安装twisted库:

        使用:pip install 拖入twisted路径

twisted库安装完成后,再安装scrapy库

        报错2)提示python -m pip install --upgrade pid

   解决:运行python -m pip install --upgrade pid

        报错3)win32错误

  解决:pip install pypiwin32

        仍然报错)

        解决:安装Aanacoda工具

二、创建scrapy项目

1)创建scrapy项目

在终端中创建项目:

        scrapy startproject 项目名

2)创建爬虫文件

       在spiders文件夹中创建爬虫文件

a)切入spiders目录下:

        cd  项目名\项目名\spiders

 b) 在spiders文件夹中创建爬虫文件

        scrapy genspider 文件名 要爬取的网页

 一般情况下,要爬取的网页之前:不需要添加http协议

        否则start-urls中的路径不成立

  原因:start_urls的值是根据allowed_domains进行修改的,如果添加了http协议,allowed_domains的值需要用户手动修改

import scrapyclass Demo001Spider(scrapy.Spider):# 爬虫的名字:用于运行爬虫时,使用的值name = "demo001"# 允许访问的域名allowed_domains = ["www.baidu.com"]# 起始url地址:指的是第一次要访问的域名# start_urls是在allowed_domains之前添加1个http://  在allowed_domains之后添加1个/start_urls = ["http://www.baidu.com"]
#执行了 start_urls之后执行的方法    方法中的response就是返回的对象 相当于1)response = urllib.requests.urlopen()    2)response = requests.get()def parse(self, response):pass

 3)运行爬虫文件

scrapy crawl 爬虫的名字

 

做了反扒————

 解决:注释掉君子协议:项目下的setting.py文件中的robots.txt协议

注释掉:ROBOTSTXT_OBEY = True

 

 三、scrapy项目结构

项目名

        项目名

                spider文件夹        (存储爬虫文件)

                        init        

                        自定义的爬虫文件        (核心功能文件)

                init

                items        (定义数据结构的地方)(爬取的数据包含哪些)

                middleware        (中间件)(代理)

                pipelines        (管道)(处理下载的数据)

                settings        (配置文件)

四、response的属性和方法

3)4)5)常用

1)response.text

        获取响应的字符串

2)response.body

        获取响应的二进制数据

3)response.xpath

        直接使用xpath方法解析response中的内容

4)response.extract()

        提取selector对象中的data属性值

5)response.extract_first()        

        提取selector对象的第一个数据

五、scrapy工作原理

1). 引擎向spiders要url

2). 引擎将要爬取的url给调度器

3). 调度器将url生成请求对象,放入指定的队列

4). 从队列中出队一个请求

5). 引擎将请求交给下载器进行处理

6).下载器发送请求,向互联网请求数据

7). 下载器将数据返回给引擎

8). 引擎将数据再次给到spiders

9).spiders通过xpath解析数据

10).  spiders将数据,或者url,给到引擎

11). 引擎判断该数据,是数据,还是url

        a)是数据,交给管道处理

        b)还是url,交给调度器处理

六、scrapy shell

        scrapy终端

测试xpath和css表达式

免去了每次修改后,运行spiders的麻烦

进入scrapy shell终端:

        直接在Windows终端输入:scrapy shell 域名

        使用

                终端中直接执行:

                        scrapy shell 域名

安装ipython(高亮,补全)

        pip install ipython

七、懒加载中的src

有data-original,src用data-original替代

替换前:src = // ul[ @ id = "component_59"] / li // img / @ src
替换后:src = // ul[ @ id = "component_59"] / li // img / @ data-original

当当网练习中的第一张图片是none

        原因:没有data-original

 #有data-original,src用data-original替代src = li.xpath('.//img/@data-original').extract_first()# 第一张图片和其他图片标签不一样,第一张图片的src是可以使用的   其他图片的地址是data-originalif src:src = srcelse:#用srcsrc = li.xpath('.//img/@src').extract_first()

当当网:

        items.py:

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
from urllib import responseimport scrapyclass DemoDdwItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# pass#图片# src = // ul[ @ id = "component_59"] / li // img / @ srcsrc = scrapy.Field()#名字# alt = // ul[ @ id = "component_59"] / li // img / @ altname = scrapy.Field()#价格# price = //ul[@id = "component_59"]/li//p[@class = "price"]/span[1]/text()price = scrapy.Field()

ddw.py

import scrapyclass NddwSpider(scrapy.Spider):name = "nddw"allowed_domains = ["category.dangdang.com"]start_urls = ["https://category.dangdang.com/cp01.07.30.00.00.00.html"]def parse(self, response):# pass# src、name、price都有共同的li标签# 所有的selector对象,都可以再次调用xpath方法li_list = response.xpath('//ul[@id = "component_59"]/li')for li in li_list:# .extract()提取数据# 有data-original,src用data-original替代src = li.xpath('.//img/@data-original').extract_first()# 第一张图片和其他图片标签不一样,第一张图片的src是可以使用的   其他图片的地址是data-originalif src:src = srcelse:# 用srcsrc = li.xpath('.//img/@src').extract_first()alt = li.xpath('.//img/@alt').extract_first()price = li.xpath('.//p[@class = "price"]/span[1]/text()').extract_first()print(src, name, price)

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

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

相关文章

merge函数

merge函数 今天在刷lc,从灵神题解中学到的 来源:560. 和为 K 的子数组 - 力扣(LeetCode) java8 merge()方法被引入到HashMap类中,用于简化键值对操作,在处理键值对时,提供一个重新映射函数来决…

Notepad++ 8.6.7 安装与配置全攻略(Windows平台)

一、软件定位与核心优势 Notepad 是开源免费的代码/文本编辑器,支持超过80种编程语言的高亮显示,相比系统自带记事本具有以下优势: 轻量高效:启动速度比同类软件快30%插件扩展:支持NppExec、JSON Viewer等200插件跨文…

建筑兔零基础自学python记录39|实战词云可视化项目——章节分布10(上)

这次我们来制作《红楼梦》各章节的分布情况: 源代码: import pandas as pd import numpy as np import matplotlib.pyplot as pltdf_hlm pd.read_csv("hlm.txt", names["hlm_texts"]).dropna()df_hlm df_hlm[~df_hlm.hlm_texts.s…

C++:#ifndef 头文件保护机制详解

在C开发中,头文件可能会被多个源文件包含,导致编译错误。为了避免这种情况,我们使用了头文件保护机制(防止重复包含)。 头文件保护的原理 通过预处理指令#ifndef(如果没有定义)和#define&…

利用MQ自动取消未支付超时订单最佳实践

一、利用MQ自动取消未支付超时订单最佳实践 1、基于 RocketMQ 延迟消息 1.1:延迟消息 当消息写入到 Broker 后,不会立刻被消费者消费,需要等待指定的时长后才可被消费处理的消息,称为延时消息。 1.2:实现流程 &am…

基于 ChatGPT 创建专属 GPTs

文章目录 基于 ChatGPT 创建专属 GPTs一、效果展示1.1 中文命名专家1.2 行程小助手 二、核心配置2.1 Instructions2.3 Actions 三、Agent 简介3.1 功能框架3.2 工作流程3.3 意图识别 四、数据流程 基于 ChatGPT 创建专属 GPTs ChatGPT 具备定制 GPTs 的能力,能够通…

Spring Boot WebFlux 中 WebSocket 生命周期解析

Spring Boot WebFlux 中的 WebSocket 提供了一种高效、异步的方式来处理客户端与服务器之间的双向通信。WebSocket 连接的生命周期包括连接建立、消息传输、连接关闭以及资源清理等过程。此外,为了确保 WebSocket 连接的稳定性和可靠性,我们可以加入重试…

【数据挖掘】异构图与同构图

在图论(Graph Theory)中,异构图(Heterogeneous Graph)和同构图(Homogeneous Graph)是两种不同的图结构概念,它们的主要区别在于节点和边的类型是否单一。 1. 异构图(Hete…

Golang实践录:go发布版本信息收集

go发布版本信息收集。 背景 本文从官方、网络资料收罗有关go的发布历史概况。主要目的是能快速了解golang不同版本的变更。鉴于官方资料为英文,为方便阅读,使用工具翻译成中文,重要特性参考其它资料补充/修改。由于发布版本内容较多&#xf…

【C++】: STL详解 —— set和map类

目录 关联式容器 键值对 set set的概念 set的构造函数 set的使用 map map的概念 map的构造函数 map的使用 multiset multimap 关联式容器 C标准库提供了多种容器,用于高效管理和操作数据集合。这些容器可分为以下几类: 顺序容器(…

DeepSeek:构筑大数据平台底座的最优解

一、大数据平台底座的重要性 在数字化浪潮席卷全球的当下,数据已成为企业乃至整个社会最具价值的资产之一 。大数据平台底座作为数据处理和业务支撑的核心枢纽,其重要性不言而喻,犹如大厦的基石,关乎整个数据生态系统的稳定与发展。 从数据处理角度来看,随着互联网、物联…

Minix OS的配置 SSH C程序编译

Minix3的下载 官网:https://www.minix3.org/ 安装 平台:VMware 开机后进入系统使用setup命令来配置和安装尽量配置一个DNS服务器,比如8.8.8.8 SSH 安装:pkgin install openssh 修改配置文件,需要: 修…

ubuntu20 安装python2

1. 确保启用了 Universe 仓库 在某些情况下,python2-minimal 包可能位于 Universe 仓库中。你可以通过以下命令启用 Universe 仓库并更新软件包列表: bash复制 sudo add-apt-repository universe sudo apt update 然后尝试安装: bash复制…

STM32---FreeRTOS中断管理试验

一、实验 实验目的:学会使用FreeRTOS的中断管理 创建两个定时器,一个优先级为4,另一个优先级为6;注意:系统所管理的优先级范围 :5~15 现象:两个定时器每1s,打印一段字符串&#x…

docker利用docker-compose-gpu.yml启动RAGFLOW,文档解析出错【亲测已解决】

0.问题说明 想要让RAGFLOW利用GPU资源跑起来,可以选择docker-compose-gpu.yml启动。(但是官网启动案例是86平台的不是NVIDIA GPU的,docker-compose-gpu.yml又是第三方维护,所以稍有问题) 1.问题 docker利用docker-c…

【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进

深度神经网络系列文章 【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践 引言 在当今…

【ThreeJS Basics 06】Camera

文章目录 Camera 相机PerspectiveCamera 透视相机正交相机用鼠标控制相机大幅度转动(可以看到后面) 控制组件FlyControls 飞行组件控制FirstPersonControls 第一人称控制PointerLockControls 指针锁定控制OrbitControls 轨道控制TrackballControls 轨迹球…

Linux | Ubuntu 与 Windows 双系统安装 / 高频故障 / UEFI 安全引导禁用

注:本文为 “buntu 与 Windows 双系统及高频故障解决” 相关文章合辑。 英文引文,机翻未校。 How to install Ubuntu 20.04 and dual boot alongside Windows 10 如何将 Ubuntu 20.04 和双启动与 Windows 10 一起安装 Dave’s RoboShack Published in…

在 C++ 中,通常会使用 `#define` 来定义宏,并通过这种方式发出警告或提示。

在 C++ 中,通常会使用 #define 来定义宏,并通过这种方式发出警告或提示。 如何实现 GBB_DEPRECATED_MSG 宏: 你可以通过以下方式定义一个宏,显示弃用警告: #include <iostream>// 定义一个宏,用来打印弃用警告 #define GBB_DEPRECATED_MSG(msg

el-tree右键节点动态位置展示菜单;el-tree的节点图片动态根据节点属性color改变背景色;加遮罩层(opacity)

一、el-tree右键节点动态位置展示菜单 关键:@node-contextmenu="handleRightClick"与@node-click=“handleNodeClick” <div class="content"><el-tabs class="tabs" @tab-click="handleClick" v-model="Modal"…