【Python学习笔记】菜鸟教程Scrapy案例 + B站amazon案例视频

背景前摇(省流可以跳过这部分)

实习的时候厚脸皮请教了一位办公室负责做爬虫这块的老师,给我推荐了Scrapy框架。
我之前学过一些爬虫基础,但是用的是比较常见的BeautifulSoup和Request,于是得到Scrapy这个关键词后,先问了一下Kimi这些爬虫框架的区别和优劣:
以上内容由Kimi生成(非广告)
可以看出,BeautifulSoup适合学校教授课程用的小项目,但遇到大型的爬虫还是需要技术老师推荐的Scrapy。
时间充裕的话可以先从BeautifulSoup入门学起来。可以
以前BeautifulSoup我学的时候B站有个UP讲得挺好的,手把手教实操,结果今天一看都找不到视频了,实在是可惜。所以这次我学习Scrapy就决定把看到的好教程和遇到的问题都记下来。


菜鸟教程

链接:https://www.runoob.com/w3cnote/scrapy-detail.html
点此进入菜鸟教程
这个算是我看过的教程帖子里面比较通俗易懂、简明扼要又流程规范的了,当然也不是十全十美,跟着步骤操作还是会遇到一些小问题。

1.安装库

在这里插入图片描述


这一步没啥问题,正常按着步骤装就是,我电脑环境算是复杂的,都没遇到奇怪的报错。但是有条件的话建议装个Anaconda,然后为Scrapy专门建一个虚拟环境,免得日后跟其他库不兼容的情况发生。
以下步骤展示的是有Anaconda的情况下安装虚拟环境,没有Anaconda的可以跳过这步。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


从创建项目这一步开始,就可以和菜鸟教程介绍的流程第一步接上了。
在这里插入图片描述


菜鸟教程的第二步没什么问题,跟这做就行。
在这里插入图片描述


到了第三步这里,有一个地方需要做一点小改动。在这里插入图片描述


运行到这一步,会发现一直报一个莫名其妙的错误:
在这里插入图片描述
在这里插入图片描述
AI的方法并没有什么卵用,可见这错误多半不是我们该背的锅。
在这里插入图片描述

解决方案也很简单——将写入模式改为 ‘wb+’ 就不会报错了

参考链接:https://zoyi14.smartapps.cn/pages/note/index?origin=share&slug=b53ac2effb85&_swebfr=1&_swebFromHost=baiduboxapp
简书大神的回答
在这里插入图片描述


然后继续往下走菜鸟教程,直到执行完爬虫,这个时候应该文件目录里会存在一个html文件。
在这里插入图片描述
在这里插入图片描述


但是,千万不要双击该html文件直接打开!!否则你会惊喜地发现——什么也没有。
(很奇怪我这次的文件居然打开有内容,之前尝试点开好几次都是白板……不知道触发了什么奇怪的buff)
在这里插入图片描述
如果确实遇到了白板也别害怕,用Pycharm或者VScode这类支持写程序的软件打开看看,你就会发现其实爬取是成功了的。在这里插入图片描述
这一步能看见网页源代码的话,继续跟着菜鸟教程走就是了。


在这里插入图片描述


直到有一个步骤的命令有一个奇怪的$符号打头,询问Kimi后发现并没有什么意义,我猜或许是编写教程的人手误?不管这个符号,正常输入命令就行:在这里插入图片描述
在这里插入图片描述
附上我的示例执行效果图:
在这里插入图片描述
最后看到Spider Closed就是OK了(我的代码是最终版,加了一些命令,所以输出比较多,看不见这句话“”传智播客官网-好口碑IT培训机构,一样的教育,不一样的品质”,如果正常走到这一步的话能在黑窗口看见这句话顺利打印出来。
在这里插入图片描述


后面按着教程来,输出json,csv文件啥的步骤都没什么问题。
在这里插入图片描述


(思考题这弱弱问一句,我咋没找到yield函数在哪呢???
不过这个问题不大,上网查查别的教程或者问问Kimi都行,菜鸟这里自带的补充学习链接也可以看看。)
在这里插入图片描述


我会把我照着菜鸟教程写的项目打包上传CSDN存档,有需要的朋友可以自行下载。
(我每次都设置了免费不需要积分,但是好像CSDN会自动调整价格……)

菜鸟教程部分到此结束


下面进入B站视频部分

这个视频也是我自己看了一些后觉得讲的很清楚并且流程很规范的,从零开始建工程目录,而且涉及到翻页爬虫的处理。
链接:https://www.bilibili.com/list/watchlater?oid=30493305&bvid=BV1es411F73F&spm_id_from=333.337.top_right_bar_window_view_later.content.click
B站传送门
3分钟左右的时候在settings.py里加了一行LOG_LEVEL = ‘WARN’,起一个减少日志负担的作用。
在这里插入图片描述
在这里插入图片描述


很不幸的是我和评论区的这位遇到了一模一样的问题,我也还没有找到靠谱的解决方案,但是没关系,重点学视频里翻页爬取的方法,把代码思路写熟手以后,下次复用到其他网页就不一定会遇到503错误了
在这里插入图片描述
在这里插入图片描述
我这搜罗了一些可能的解决办法给大家参考,如果有成功解决的小伙伴可以评论区分享一下。
https://docs.pingcode.com/ask/218781.html
可以试试,不保证结果
在这里插入图片描述


没有源码,特别难打的这句话我手敲了:
print(respomse.xpath(‘//ul[@id=“s-results-list-atf”]/li//h2/text()’).extract())
在这里插入图片描述
关于这部分HTML和XPath我之前学BeautifulSoup的时候有一些基础,所以就没有看该视频之前的内容,可以去这位UP的主页自行寻找,或者遇事不决问Kimi。


我个人感觉BeautifulSoup和Scrapy的思路很相似,都是给url,然后获取html内容,再通过类似正则表达式的思路把需要的文字提取出来,放在变量里,再把同类的变量归类到列表里,排得整整齐齐,就得到了结构化的数据。


这个价格分为了整数和小数两部分,UP的处理方法可以学习和参考,我觉得是个很好的思路,可以积累经验,下次遇到就知道怎么处理了。(还有一些类似的小细节,比如ul下级是li这种HTML知识)
分别获取小数点前和小数点后的数据price1,price2,然后拼起来。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
别忘了设置为float,存进数据库(如果有)的话更容易处理(比如比较大小)。
在这里插入图片描述
后面遇到比较大的数有逗号碍事(比如’1,299’这种),就用replace方法,通过空字符串替代’,',避免组合遇到困难。

在这里插入图片描述

比较难打的代码块:

    def parse(self, response):
        titles = response.xpath('//ul[@id="s-results-list-atf"]/li//h2/text()').extract()
        hrefs = response.xpath('//ul[@id="s-results-list-atf"]/li//h2/../@href').extract()

        prices1 = response.xpath('//ul[@id="s-results-list-atf"]/li//span[@class="sx-price-whole"]/text()').extract()
        prices2 = response.xpath('//ul[@id="s-results-list-atf"]/li//sup[@class="sx-price-fractional"]/text()').extract()

        price = [float(".".join(item)) for item in zip(price1,price2)]

        print(prices1)
        print(prices2)
        print(price)

把获取到的信息通过zip函数整理打包成元组:
在这里插入图片描述
在这里插入图片描述

爬取多页的话就需要获取点击下一页的按钮,这也正是我看中这个教程的地方,前面写到Scrapy本身就更适合大规模数据爬取,那只爬一页也太屈才了。
在这里插入图片描述
检查网页源代码,找到这个“下一页”按钮的源链接和id。
在这里插入图片描述
然后照样的套路,XPath获取到链接,不过这里是个相对地址。在这里插入图片描述
《相对地址也没关系,前面的域名我们自己加就完了》这里确实能解决问题,但我还是想知道这种走捷径的方法如果有应付不了的时候,应该怎么办呢?
在这里插入图片描述


遇到这个NoneType问题,老师判断是取到头了,没有下一页的内容造成的。
在这里插入图片描述
解决办法是在取下一页以前加个判断语句:
在这里插入图片描述

mobile.py完整代码:
在这里插入图片描述

import scrapy
from scrapy import Request

class MobileSpider(scrapy.Spider):
    name = "mobile"
    allowed_domains = ["amazon.com"]
    start_urls = ["https://www.amazon.com/s?k=mobile+phone&__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&crid=266D1NQXSO7K4&sprefix=mobile+phon%2Caps%2C250&ref=nb_sb_noss_2"]

    def parse(self, response):
        print(response.url)
        titles = response.xpath('//ul[@id="s-results-list-atf"]/li//h2/text()').extract()
        hrefs = response.xpath('//ul[@id="s-results-list-atf"]/li//h2/../@href').extract()

        prices1 = response.xpath('//ul[@id="s-results-list-atf"]/li//span[@class="sx-price-whole"]/text()').extract()
        prices2 = response.xpath('//ul[@id="s-results-list-atf"]/li//sup[@class="sx-price-fractional"]/text()').extract()

        prices = [float(".".join(item).replace(',','')) for item in zip(price1,price2)]

        for item in zip(titles, hrefs, prices):
            yield{
                "title": item[0],
                "url": item[1],
                "price": item[2]
            }
        next = response.xpath('//a[@id="pagnNextLink"]/@href').extract_first()

        if next != None:
            next_url = 'https://www.amazon.com' + next
            yield Request(next_url)

结合这两个案例,我找了个大陆能登上去的网站七禾网,自己写了一段Scrapy代码爬取测试,成功获取到了专栏文章标题。
被爬取的七禾网链接:https://www.7hcn.com//category/88-27.html
点击打开,这次爬取测试应该不会503错误了
在这里插入图片描述


成果展示:
在这里插入图片描述
爬取到的HTML:
在这里插入图片描述
爬取到的Json:
在这里插入图片描述
爬取到的XML:
在这里插入图片描述
爬取到的CSV:
在这里插入图片描述
唯一美中不足的是这个网站的翻页只有逐页翻或者直达下一页,没有Next Page这个选项,所以无法测试全部学到的功能,但用来做练习来说已经完全够用了。
我自己写的练习代码也会同步上传到CSDN,欢迎有需要的朋友下载~
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在AvaotaA1全志T527开发板上使用AvaotaOS 部署 LNMP 服务

准备工作 在这之前,确保设备已经联网,可以用 ifconfig 命令查看联网状态。这里使用的是 WIFI 联网,可以看到已经获取了IP地址。 由于安装需要较长时间,建议使用 screen 后台登录,这里看到系统默认已经安装了 screen …

6800和8080单片机读写时序和液晶屏接口

前言: 随着单片机发展,集成度越来越高,因此目前单片机较少使用RD和WR信号操作外设,因此很多时候,变成了6800和8080单片机读写液晶屏了。早期的读写本质上是对一个地址进行即时的操作,现在可能是等数据送到…

vue中自定义设置多语言(包括使用vue-i18n),并且运行js脚本自动生成多语言文件

在项目中需要进行多个国家语言的切换时,可以用到下面方法其中一个 一、自定义设置多语言 方法一: 可以自己编写一个设置多语言文件 在项目新建js文件,命名为:language.js,代码如下 // language.js 文档 let languagePage {CN…

baomidou多数据源切换注解@DS没有效果

baomidou多数据源切换注解DS没有效果 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.1.1</version> </dependency> ##原因 方法上有Transaction…

2024年AI技术深入研究

2024年AI技术持续快速发展,应用领域广泛,产业发展迅速,市场趋势积极,学术研究深入。 AI技术进展大模型发展 2024年,智谱AI正在研发对标OpenAI Sora的高质量文生视频模型,预计最快年内发布。智谱AI的进展显示了国内AI大模型领域的快速发展,以及与国际领先技术的竞争态势…

全网最详细的Appium自动化测试框架(一)环境搭建

一、环境搭建 1、安装python3 2、安装appium-destop 3 、安装python虚拟环境 ,安装依赖库 : pip install Appium-Python-Client pip install pytest 4、安装java brew install java 配置好环境变量 5、安装 android-platform-tools &#xff08;也可以用android sdk 工…

关于多人开发下git pull报错代码冲突问题的解决方案

关于多人开发下git pull报错代码冲突问题的解决方案 问题描述 最近多人开发项目习惯性先 git pull 来更新代码的时候&#xff0c;遇到了下面的问题&#xff1a;error: Your local changes to the following files would be overwritten by merge: Please, commit your change…

Zabbix触发器

目录 触发器基础概念 创建和管理触发器 示例 定义一个触发器 在 Zabbix 中&#xff0c;触发器&#xff08;Trigger&#xff09;用于定义在监控数据满足特定条件时触发警报或动作。触发器是实现监控告警和自动响应的核心组件之一。以下是关于 Zabbix 触发器的详细解释和用法…

Windows 11 安装 安卓子系统 (WSA)

How to Install Windows Subsystem for Android (WSA) on Windows 11 新手教程&#xff1a;如何安装Windows 11 安卓子系统 说明 Windows Subsystem for Android 或 WSA 是由 Hyper-V 提供支持的虚拟机&#xff0c;可在 Windows 11 操作系统上运行 Android 应用程序。虽然它需…

解决问题:使用PageHelper.startPage和PageInfo实现分页,但是得到的total和传入的页面大小pageSize一样

我们需要的是total得到的数值是数据库里所有数据的条数。 1、包别引错 <!--PageHelper开始--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</…

c++:struct和class的区别

C和C中struct的区别 (1)C中不支持成员函数&#xff08;只能通过函数指针成员变量间接支持&#xff09;&#xff0c;而C源生支持。 (2)C中不支持static成员&#xff0c;而C中支持。后面会详细讲&#xff0c;C static class是一个大知识点 (3)访问权限&#xff0c;C中默认public…

2024年【金属非金属矿山(地下矿山)安全管理人员】考试报名及金属非金属矿山(地下矿山)安全管理人员模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员考试报名为正在备考金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员操作证的学员准备的理论考试专题&#xff0c;每个月更新的金属非…

Ratf协议图解、Nacos CP集群源码分析

文章目录 Nacos CP集群说明Raft协议leader选举重新选举leader多个Candidate情况更新操作&#xff0c;日志复制网络分区 源码实现服务注册leader选举leader心跳包 Nacos CP集群 说明 CAP原则 C 一致性 ConsistencyA 可用性 Availability分区容错性 Partition tolerance 分区…

SR-IOV学习笔记

参考&#xff1a;《深入浅出DPDK》&前人的各种博客 SR-IOV全称Single Root IO Virtualization&#xff0c;单根虚拟化(多么高大上的名字>.<)&#xff0c;是 Intel 在 2007年提出的一种基于硬件的虚拟化解决方案。 虚拟化背景 那什么又是虚拟化呢&#xff1f;抽象来…

警惕AI泡沫:巨额投资与回报失衡

尽管高科技巨头们在AI基础设施上投入巨资&#xff0c;但AI带来的收入增长尚未显现&#xff0c;揭示了生态系统末端用户价值的重大缺口。 红杉资本分析师David Cahn认为&#xff0c;AI企业需每年赚取约6000亿美元才能抵消其AI基础设施&#xff08;如数据中心&#xff09;的成本&…

基于Java的网上花店系统

目 录 1 网上花店商品销售网站概述 1.1 课题简介 1.2 设计目的 1.3 系统开发所采用的技术 1.4 系统功能模块 2 数据库设计 2.1 建立的数据库名称 2.2 所使用的表 3 网上花店商品销售网站设计与实现 1. 用户注册模块 2. 用户登录模块 3. 鲜花列表模块 4. 用户购物车…

2024年江苏省研究生数学建模竞赛B题人造革性能优化设计研究论文和代码

经过不懈的努力&#xff0c; 2024年江苏省研究生数学建模竞赛B题人造革性能优化设计研究论文和代码已完成&#xff0c;代码为C题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模…

微服务: Nacos部署安装与properties配置

Nacos 是阿里巴巴开源的一款用于动态服务发现、配置管理和服务管理的基础设施。Nacos 这个名称源自于 “Dynamic Naming and Configuration Service”。它主要是用于解决微服务架构中服务发现和配置管理的问题。 Nacos 单机模式的部署安装 1. 安装(Windows环境) Nacos是Java…

QDockWidget类详解

一.QDockWidget类概述 1.QDockWidget类 QDockWidget类提供了一个特殊的窗口部件&#xff0c;它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。 QDockWidget类提供了dock widget的概念&#xff0c;dock widget也就是我们熟悉的工具面板或者是工具窗口。Do…

批导会计凭证程序报错,通过监控点和消息类来定位触发的位置

ZFIU001 批导会计凭证报错&#xff0c;通过监控点和消息类来定位触发的位置 在使用程序导入会计凭证的时候&#xff0c;发现报错&#xff0c;后面找了很久很久的系统标准程序&#xff0c;打断点才找到这个位置&#xff0c;使用监控点还是可以比较快速找到报错的原因的&#xff…