【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 Requestclass 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' + nextyield Request(next_url)

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


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

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

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

相关文章

C++实现简化 QtBase(5):通过IEventLoopHost扩展实现win32消息循环

在上一篇文章《C实现简化版Qt的QObject(4):增加简单实用的事件机制》中,我们实现了普通线程的事件机制。 但是事件机制往往需要和操作系统主线程消息循环一起工作。 因此,今天,我们在之前的CEventLoop的实…

数据结构-循环链表和双向链表

目录 前言一、循环链表1.1 循环链表的介绍1.2 循环链表的实现 二、双向链表2.1 双向链表的介绍2.2 双向链表的实现 三、循环双链表总结 前言 本篇文章介绍数据结构中的循环链表和双向链表 一、循环链表 1.1 循环链表的介绍 将单链表的形式稍作改变,单链表的最后…

swagger路径怎么设置为不曝露

为了确保 Swagger UI 不暴露在外部访问下,可以采取以下几种方法来限制访问: 方法1:通过认证和授权限制访问 为 Swagger UI 页面设置访问控制,确保只有授权用户才能访问。 1.1 Spring Security 如果使用的是 Spring Boot&#…

centos7一键离线安装NFS服务

在内网环境中安装服务器软件包的离线安装指南 在企业级环境中,出于安全和管理的考虑,许多服务器往往无法连接外网。这种情况下,我们只能通过离线安装包的方式来安装和配置软件。本文将详细介绍如何在内网环境中进行软件包的离线安装。 一、…

Consistency Learning 人话理解

Consistency loss pulls together images and their textual descriptions while pushes away unmatched pairs in the feature space. (from Learning to Prompt for Vision-Language Models) 把相似的样本拉的越近越好,不同的样本越远越好! 还可以作为…

c++习题05-斐波那契数列

目录 一,问题 二,思路 三,代码 一,问题 二,思路 根据题目,可以自己列出斐波那契数列(前四个)如下: 通过列出来的值,可以发现,前两个都是1&…

二维码登录的原理

二维码登录的原理: 二维码登录是一种基于移动设备和网络技术的便捷登录方式。其原理主要依赖于以下几个关键要素: 随机生成:服务器端随机生成一个具有唯一性和时效性的二维码。编码信息:这个二维码包含了特定的登录信息,例如用户标识、会话标识、时间戳等。扫描识别:用户…

设置和取消Excel“打开密码”的3种方法

在日常工作中,Excel文件中常常包含敏感数据。为了防止未经授权的访问,给Excel文件设置打开密码是一个非常有效的方法。下面分享3种设置Excel打开密码的方法,以及如何取消这些密码。 先来看看设置Excel打开密码的3种方法。 方法一&#xff1…

hnust 1815: 算法10-6~10-8:快速排序

hnust 1815: 算法10-6~10-8:快速排序 题目描述 快速排序是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排序的记录分割成两个独立的部分,其中一部分记录的关键字均比另一部分的关键字小,在分成两个部分之后则可以分别…

【人工智能】--强化学习(2.0)

个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉强化学习与有监督学习的区别 🍈数据特点 🍈学习目标 🍈反馈机制 🍈策略…

企业级-工具

作者:fyupeng 技术专栏:☞ https://github.com/fyupeng 项目地址:☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 相信大家在工作中都会遇到各种各种繁琐、简单但耗时的问题,那么可能有以下的工具可以解决你…

代理模式和Java中的动态代理【开发实践】

文章目录 一、代理模式基础1.1 代理模式1.2 静态代理1.3 动态代理 二、静态代理的实现三、JDK动态代理3.1 JDK动态代理概述3.2 invoke方法介绍3.3 JDK动态代理的使用 四、CGLIB动态代理3.1 CGLIB动态代理概述3.2 CGLIB动态代理的使用 五、对比5.1 代理实现与使用对比5.2 使用条…

打赢网络免疫升级战!看聚铭铭察高级威胁检测系统如何重塑网络安全防线

在信息洪流的今天,企业如航行于暗礁密布的数字海洋,面对的不仅仅是已知的病毒与漏洞,更有高级威胁这股暗流,悄无声息地侵蚀着网络的肌理。常规的安全措施,犹如常规体检,虽能捕捉表面的异常,却难…

jQuery 入门到精通

jQuery 入门到精通:详尽指南 目录 jQuery 简介jQuery 基础 安装 jQueryjQuery 选择器DOM 操作事件处理 jQuery 进阶 动画效果AJAX插件 项目实践 简单的待办事项列表获取和显示 API 数据 高级技巧 性能优化调试技巧 资源和总结 1. jQuery 简介 jQuery 是一个快速、…

C++ 的常见算法 之一

C 的常见算法 之一 不修改序列算法for_eachcountfind 修改序列算法copymove 不修改序列算法 for_each #include <iostream> // std::cout #include <algorithm> // std::for_each #include <vector> // std::vectorusing namespace std;struc…

Rust:常见 GUI 框架

Rust 语言因其性能、安全性和并发能力而广受欢迎&#xff0c;尽管它在标准库中不包含直接的图形用户界面&#xff08;GUI&#xff09;工具&#xff0c;但社区已经开发了多个高质量的第三方库来帮助开发者创建 GUI 应用程序。以下是一些流行的 Rust GUI 框架和工具&#xff1a; …

【论文速读】|FuzzAug:探索模糊测试作为神经网络测试生成的数据增强

本次分享论文&#xff1a;FuzzAug: Exploring Fuzzing as Data Augmentation for Neural Test Generation 基本信息 原文作者&#xff1a;Yifeng He, Jicheng Wang, Yuyang Rong, Hao Chen 作者单位&#xff1a;University of California, Davis 关键词&#xff1a;软件测试…

【电控笔记6.5】标准二阶系统

标准二阶系统通常用于描述动态系统的行为,特别是在控制系统、振动系统和其他物理系统中。标准二阶系统的传递函数通常表示为: [ H(s) = \frac{\omega_n2}{s2 + 2\zeta\omega_n s + \omega_n^2} ] 其中,(\omega_n) 是系统的自然频率,(\zeta) 是阻尼比。 标准二阶系统的特…

使用随机生成的随机数过程中,保存数据到数组中 出现很多null

如果 randomId 是一个较大的数字&#xff0c;那么会在 temp 数组中留下很多空位。可能会导致很多 null 值。将 temp 从数组改为对象&#xff0c;以避免稀疏数组的问题。 稀疏数组&#xff1a;当一个数组中大部分元素为0&#xff0c;或者为同一值&#xff08;也就是说可以不是0…

【鸿蒙学习笔记】Image迭代完备

Image Image($r(app.media.zhibo)).width(96) // 图片宽度.height(96) // 图片高度.borderRadius(12) // 图片圆曲度.objectFit(ImageFit.Fill) // 不明objectFit Column({ space: 20 }) {Row() {Image($r(app.media.startIcon)).width(66).height(66).borderRadius(12)}.bac…