关于自己初次使用云服务器的经验总结
我是一名来自长沙的准大四学生,学的是计算机科学与技术专业,除了平时的课程学习外,比较喜欢写博客,知识经验,日常随笔,心情日记,都在我的记录范围内。最初用的CSDN,作为最大的程序员社区,上面的文章帖子杂而重复度高,考虑到自己只是写给自己看的,所以在年初换成了Hexo,并给博客系统找了一个好看的主题---yun,一款来自现阿里前端开发者云游君的作品,自己确实被这款主题好看而且可高度自定义的外表给迷住了。暑假,结束了为期20天的恒生训练营后,可能源于对云游君大佬的仰慕,同时也是觉得Hexo终端上传文章的不友好形式太过繁琐和“丑陋”,就决定着手写一个自己的博客系统,从前端到后端,从前台展示到后台管理从文章提取到数据库存储,完完全全的“自主化”。Hexo属于纯静态展示,扔到github Page上就能跑起来,但自己写的博客系统因为具有后端和数据库,只能放到服务器上,贫穷大学生的我,还是时常为了服务器发愁。偶然间在知乎上看到了一篇帖子,介绍了阿里云开发者飞天计划对学生的照顾优惠,以培养学生学习服务器和专业知识为目的,免费赠送服务器试用,于是自己抱着边试用边学习的心态参加了这个活动。第一次拥有属于自己的服务器还是蛮激动的,拿到服务器后,先下载了宝塔可视化工具,由于自己不太熟练,这中间也经历了好多错误操作,但最后也都一一解决了,从中也学会了很多知识。由于自己的博客系统后端使用node的express写的,所以就用PM2承载的后端项目,由于没有使用经验,所以费了好大劲百度了好多篇如何使用PM2的文章才让项目成功跑起来,在此记录下来以防再犯:服务端项目数据库配置修改当把数据库传到服务器上后,数据库名和登陆用户名都可能不再是本地的名称,所以要到项目中把数据库连接配置重新改成服务器上对应的名称。端口号设置一般选择启动文件后PM2会根据项目自动获取到端口号,但有的时候并不能获取正确的端口号或者出现了端口号冲突,这样就算项目启动成功外界依旧无法访问到,所以,记得填写正确的端口号和绑定正确的服务器地址。端口号放行新的服务器只放行特定的几个端口号,所以,如果你项目端口号配置正确但依旧无法访问,那十有八九就是没开这个端口号了。在阿里云控制台中找到自己的服务器安全组,打开自己项目的端口号。这次的云服务器体验,自己也是收获多多,从中学会的不少云服务器的知识,不仅让自己的博客系统成功运行了起来,还对即将步入职场的自己起到了很大的帮助,感谢阿里云的飞天加速计划活动让我以及许许多多的学子有了体验使用云服务器的机会!(附图)
jQuery对于链和捕获的实战研究
jQuery链通过jQuery,可以将操作/方法链接在一起。链接允许我们在一条语句中运行多个jQuery方法(在同一个元素上)。JQuery方法链接到目前为止,我们一次编写一条jQuery语句(一条接一条)。然而,有一种称为链接的技术允许我们在同一个元素上一个接一个地运行多个jQuery命令。提示:这样,浏览器就不必多次查找同一元素。要链接一个动作,只需将该动作附加到上一个动作。下面的示例链接了css()、slideup()和slidedown()。“P1”元素首先变为红色,然后向上滑动,然后向下滑动:$("#p1").css("color","red").slideUp(2000).slideDown(2000);<script>
$(document).ready(function()
{
$("button").click(function(){
$("#p1").css("color","red").slideUp(2000).slideDown(2000);
});
});
</script>如果需要,还可以添加多个方法调用。链接时,代码行变得很长。然而,jQuery语法不是很严格;可以按所需格式写入,包括换行和缩进。以下文字也可以很好地使用:$("#p1").css("color","red")
.slideUp(2000)
.slideDown(2000);jQuery 会抛掉多余的空格,并当成一行长代码来执行上面的代码行。jQuery - 获取内容和属性JQuery具有处理HTML元素和属性的强大方法。JQuery DOM操作jQuery的一个非常重要的部分是操作dom的能力。JQuery提供了一系列与DOM相关的方法,使得访问和操作元素和属性变得容易。获取内容-text()、HTML()和val()用于DOM操作的三种简单实用的jQuery方法:Text()-设置或返回选定元素的文本内容HTML()-设置或返回所选元素的内容(包括HTML标记)Val()-设置或返回表单字段的值$("#btn1").click(function(){
alert("Text: " + $("#test").text());
});
$("#btn2").click(function(){
alert("HTML: " + $("#test").html());
});通过 jQuery val() 方法获得输入字段的值:$("#btn1").click(function(){
alert("值为: " + $("#test").val());
});获取属性-attr()jQuery attr()方法用于获取属性值。以下示例显示了如何获取链接中href属性的值:$("button").click(function(){
alert($("#runoob").attr("href"));
});对于HTML元素的固有属性,在处理过程中使用prop方法。对于我们自己定义的HTML元素的DOM属性,我们在处理时使用attr方法。<a href="https://www.runoob.com" target="_self" class="btn">1111</a>在本例中,<a>元素的DOM属性是:href、target和class。这些属性是<a>元素本身的属性,包含在W3C标准中,或者是可以在IDE中智能提示的属性。这些称为内在属性。处理这些属性时,建议使用prop方法。<a href="#" id="link1" action="delete" rel="nofollow">删除</a>在本例中,<a>元素的DOM属性是:href、ID和action。很明显,前两个是固有属性,而最后一个动作属性是由我们定制的。<a>元素本身没有此属性。这是自定义DOM属性。在处理这些属性时,建议使用attr方法。prop()函数的结果:1.如果有对应的属性,则返回指定的属性值。2.如果没有对应的属性,则返回值为空字符串。attr()函数的结果:1.如果有对应的属性,则返回指定的属性值。2.如果没有对应的属性,则返回值未定义。对于HTML元素的固有属性,在处理过程中使用prop方法。对于我们自己定义的HTML元素的DOM属性,我们在处理时使用attr方法。对于具有true和false属性的特性,如选中、选中或禁用,请使用prop()
舔狗至高境界,学会这个技巧让你从舔狗升华到海王【Python趣味爬虫】
大家好,我是辣条。好久不见,甚是想念。先给大家来一波舔狗日记,哈哈真的太好笑了。1.以后别去狗市找我了,我已经不做舔狗了,如果你想我了就去海鲜市场找我,我在那边当鱼,如果海鲜市场也没找到,去汽修厂看看,有时候我在那里当备胎,如果汽修厂也没有,那就去草原看看,我在那边当牛马。2.我给你发了99条消息 你终于肯回我了 你说“你发你妈 烦不烦” 我一下子就哭了,原来努力真的有用,你已经开始考虑见我的妈妈了,你也挺喜欢我的吧。3.今天晚上有点冷,本来以为街上没人,结果刚刚偷电瓶的时候被抓了,本来想反抗,结果警察说了一句老实点别动,我立刻就放弃了抵抗,因为我记得你说过你喜欢老实人。今天给大家带来的就是把这些舔狗语录,发给你想发给的人,舔一个人是舔狗,舔一群人就是海王了,你连续群发一个月,肯定会脱单。亲测有效【被拉黑】工具准备开发工具:pycharm开发环境:python3.7, Windows11 】使用工具包:requests,smtplib,MIMEText,MIMEMultipart项目思路解析整个项目分为两大步骤:获取舔狗日记的舔狗语句,选取需要发送的数据信息通过QQ邮箱将话述发送到目标邮箱号获取舔狗话述信息目标网址:舔狗日记 - 舔狗人的专用文案日记 (一个神奇的网站)网页的数据加载很简单网页刷新静态加载的数据,直接通过xpath方式提取数据,制作一个非常简单的爬虫功能,对网址发送请求,提取数据,这里就不做过多的介绍,各位看官大佬完成so easy 没有什么特别的地方。简易源码分享url = 'https://www.nihaowua.com/dog.html'response = requests.get(url)text = html.xpath('//article/text()')[0]将数据通过邮箱发送舔一个叫舔狗,舔一群就是海王,大面积撒出我们的舔网,发送的目标方的邮箱我们设置成列表的形式,只专注的舔一个不符合我们高智商舔狗的身份tos = ['
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]']发信的邮箱服务器选择QQ邮箱,在创建发送邮箱对象前需要先配置邮箱服务点击QQ邮箱设置 在点击账户开启pop3/stmp服务 生成授权码。开始通过代码发送邮箱,需要借助几个邮箱发送的工具包:smtplib 封装发信协议MIMEText 发送文本内容MIMEMultipart 创建邮件对象创建邮件对象,添加邮件内容设置标题,设置发信放,选择发信服务器,使用授权码做发信服务,发送邮箱 发送邮箱是要添加上延时操作不然服务器会判定你是做的邮箱轰炸简易源码分享import time?import requestsfrom lxml import etree??smtp封装发信协议import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipart?????发送邮箱?msg_from = '
[email protected]'passwd = 'fdltqccdspvedegj'?tos = ['
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]']?while True:url = 'https://www.nihaowua.com/dog.html'response = requests.get(url)html = etree.HTML(response.text)print(response.text)提取数据 提取数据的方式 xpath bs4 css正则print(html)text = html.xpath('//article/text()')[0]print(text)for to in tos:msg = MIMEMultipart()添加邮箱内容msg.attach(MIMEText(text, 'plain', 'utf-8'))msg['Subject'] = '每天想你一千次'msg['From'] = msg_from?server = smtplib.SMTP_SSL('smtp.qq.com', 465)?server.login(msg_from, passwd)?server.sendmail(msg_from, to, msg.as_string())print('邮件发送成功')time.sleep(3)?time.sleep(7200)\mport requestsfrom lxml import etree??smtp封装发信协议import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipart?????发送邮箱?msg_from = '
[email protected]'passwd = 'fdltqccdspvedegj'?tos = ['
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]']?while True:url = 'https://www.nihaowua.com/dog.html'response = requests.get(url)html = etree.HTML(response.text)print(response.text)提取数据 提取数据的方式 xpath bs4 css正则print(html)text = html.xpath('//article/text()')[0]print(text)for to in tos:msg = MIMEMultipart()添加邮箱内容msg.attach(MIMEText(text, 'plain
舔狗至高境界,学会这个技巧让你从舔狗升华到海王【Python趣味爬虫】
大家好,我是辣条。好久不见,甚是想念。先给大家来一波舔狗日记,哈哈真的太好笑了。1.以后别去狗市找我了,我已经不做舔狗了,如果你想我了就去海鲜市场找我,我在那边当鱼,如果海鲜市场也没找到,去汽修厂看看,有时候我在那里当备胎,如果汽修厂也没有,那就去草原看看,我在那边当牛马。2.我给你发了99条消息 你终于肯回我了 你说“你发你妈 烦不烦” 我一下子就哭了,原来努力真的有用,你已经开始考虑见我的妈妈了,你也挺喜欢我的吧。3.今天晚上有点冷,本来以为街上没人,结果刚刚偷电瓶的时候被抓了,本来想反抗,结果警察说了一句老实点别动,我立刻就放弃了抵抗,因为我记得你说过你喜欢老实人。今天给大家带来的就是把这些舔狗语录,发给你想发给的人,舔一个人是舔狗,舔一群人就是海王了,你连续群发一个月,肯定会脱单。亲测有效【被拉黑】工具准备开发工具:pycharm开发环境:python3.7, Windows11 】使用工具包:requests,smtplib,MIMEText,MIMEMultipart项目思路解析整个项目分为两大步骤:获取舔狗日记的舔狗语句,选取需要发送的数据信息通过QQ邮箱将话述发送到目标邮箱号获取舔狗话述信息目标网址:舔狗日记 - 舔狗人的专用文案日记 (一个神奇的网站)网页的数据加载很简单网页刷新静态加载的数据,直接通过xpath方式提取数据,制作一个非常简单的爬虫功能,对网址发送请求,提取数据,这里就不做过多的介绍,各位看官大佬完成so easy 没有什么特别的地方。简易源码分享url = 'https://www.nihaowua.com/dog.html'response = requests.get(url)text = html.xpath('//article/text()')[0]将数据通过邮箱发送舔一个叫舔狗,舔一群就是海王,大面积撒出我们的舔网,发送的目标方的邮箱我们设置成列表的形式,只专注的舔一个不符合我们高智商舔狗的身份tos = ['
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', '
[email protected]', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com']发信的邮箱服务器选择QQ邮箱,在创建发送邮箱对象前需要先配置邮箱服务点击QQ邮箱设置 在点击账户开启pop3/stmp服务 生成授权码。开始通过代码发送邮箱,需要借助几个邮箱发送的工具包:smtplib 封装发信协议MIMEText 发送文本内容MIMEMultipart 创建邮件对象创建邮件对象,添加邮件内容设置标题,设置发信放,选择发信服务器,使用授权码做发信服务,发送邮箱 发送邮箱是要添加上延时操作不然服务器会判定你是做的邮箱轰炸简易源码分享import time?import requestsfrom lxml import etree??smtp封装发信协议import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipart?????发送邮箱?msg_from = '1641324821@qq.com'passwd = 'fdltqccdspvedegj'?tos = ['xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com', 'xxxxxxxxx@qq.com']?while True:url = 'https://www.nihaowua.com/dog.html'response = requests.get(url)html = etree.HTML(response.text)print(response.text)提取数据 提取数据的方式 xpath bs4 css正则print(html)text = html.xpath('//article/text()')[0]print(text)for to in tos:msg = MIMEMultipart()
# 添加邮箱内容
msg.attach(MIMEText(text, 'plain', 'utf-8'))
msg['Subject'] = '每天想你一千次'
msg['From'] = msg_from?server = smtplib.SMTP_SSL('smtp.qq.com', 465)?server.login(msg_from, passwd)?server.sendmail(msg_from, to, msg.as_string())
print('邮件发送成功')
time.sleep(3)?time.sleep(7200)
10个宝藏级编程资源,让你省下8K学费不香吗
大家好,我是辣条。好像有一段时间没有给大家推荐编程资源了,今天直接安排一波。我敢保证只要你学编程就会对你有帮助。希望大家记得点个收藏哦。目录一、github漫游指南二、python100天三、sql自学网四、动手学深度学习五、leetbook六、被删的前端游乐场七、javaguide八、地鼠文档(go语言九、docker从入门到实践十、在线工具,程序员神器一、github漫游指南GitHub 漫游指南 – GitHub 漫游指南GitHub 上拥有大量的学习资源,从各类的文章到笔记,还有各式各样的电子书。如:只需要搜索:类型 + 笔记,如 操作系统 笔记 就能找到一些操作系统相关的笔记。只需要搜索:书名 就能找到一些和这本书相关的资源,如 重构 改善既有代码的设计。与此同时,GitHub 上还会搜索到各种 未经授权英文书籍的翻译,又或者是各种电子书的 PDF 版。作为多本书的作译者,当然不鼓励 GitHub 上找到一些盗版书。而在 GitHub 上又有一些库,可以提供相应的学习资源,如 free-programming-books-zh_CN,即免费的编程中文书籍索引。二、python100天GitHub - jackfrued/Python-100-Days: Python - 100天从新手到大师说明:从项目上线到获得8w+星标以来,一直收到反馈说基础部分(前15天的内容)对新手来说是比较困难的,建议有配套视频进行讲解。最近把基础部分的内容重新创建了一个名为“Python-Core-50-Courses”的项目,用更为简单通俗的方式重写了这部分内容并附带了视频讲解,初学者可以关注下这个新项目。这个内容太肝了,有Python入门教程,基础、进阶、开发、框架、爬虫、数据分析、人工智能,强烈推荐。三、sql自学网自学SQL网(教程 视频 练习全套)一个适合小白学SQL的网站,由浅入深的介绍所有有关 SQL 的知识, 每一个章节是一组相关的SQL知识点; 并且会配备一组动手练习任务。这个网站特别适合学完某种知识就想马上动手的实践党,如果您在学习其他相关的SQL课程或已经在工作中展开了SQL实践,也可以把它作为巩固SQL知识的小工具。四、动手学深度学习GitHub - d2l-ai/d2l-zh: 《动手学深度学习》:面向中文读者、能运行、可讨论。中英文版被全球200所大学采用教学。?向希望了解深度学习,特别是对实际使?深度学习感兴趣的?学?、?程师和研究?员。并不要求你有任何深度学习或者机器学习的背景知识,将从头开始解释每?个概念。虽然深度学习技术与应?的阐述涉及了数学和编程,但你只需了解基础的数学和编程,例如基础的线性代数、微分和概率,以及基础的 Python 编程。五、leetbook 力扣想学习却总没方向?LeetBook 精选热门技术知识,帮助你节约筛选内容时间,高效学习。按照数据结构、算法、面试等模块渐进学习,由浅入深,轻松规划学习路径。六、被删的前端游乐场被删的前端游乐场前端学习来这里,补齐前端基础知识,掌握开发调试技巧。补齐纯前端的缺失知识,更从容地面对面试官。学习和理解 Vue 基础,学会使用 Vue 快速编写 Web 应用。七、javaguideJavaGuide(Java学习&&面试指南) | JavaGuide对于 Java 初学者来说: 倾向于给你提供一个比较详细的学习路径,让你对于 Java 整体的知识体系有一个初步认识。另外,本文的一些文章也是你学习和复习 Java 知识不错的实践;对于非 Java 初学者来说: 更适合回顾知识,准备面试,搞清面试应该把重心放在那些问题上。要搞清楚这个道理:提前知道那些面试常见,不是为了背下来应付面试,而是为了让你可以更有针对的学习重点。八、地鼠文档(go语言)地鼠文档地鼠文档。go语言是如今在大厂非常流行的后端开发语言,这里有go语言学习资源合集、网站、入门教程、代码、示例、框架、类库、中文文档、算法、面试题、电子书应有尽有,还能在线阅读、免费下载,真的是太方便了。九、docker从入门到实践Docker — 从入门到实践 | Docker 从入门到实践Docker (opens new window)是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,节约有限的生命。十、在线工具,程序员神器在线工具 - 你的工具箱
Python框架篇:结构化的网页抓取框架-Scrapy
前言大家好,我是一身正气的辣条哥今天主要跟大家分享一下Scrapy,Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。 Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试 Scrapy使用了Twisted 异步网络库来处理网络通讯。目录前言一.简介二.组件介绍2.1下载中间件2.2爬虫中间件三.项目命令3.1创建项目:3.2cd 到项目下3.3.运行项目3.4.setting 里配置四.shell 交互式平台4.1目标数据要求:4.2爬虫文件4.3items文件4.4piplines文件4.5settings文件五.项目注意事项六.scrapy shell七.选择器八.items文件九.pipelines 文件十.settings 文件十一.Scrapy shell十二.Scrapy 选择器十三.嵌套选择器十四.scrapy.Spider十五 .logger十六 .from_crawler十七.start_requests() 开始请求十八.parse 默认回调函数方法一.简介Scrapy是纯Python开发的一个高效,结构化的网页抓取框架;另外有没有在学python比较蒙圈的,或者没什么好的思路的可以点击下方点我 点我 点我使用原因:1.为了更利于我们将精力集中在请求与解析上2.企业级的要求安装scrapy支持Python2.7和python3.4以上版本。python包可以用全局安装(也称为系统范围),也可以安装在用户空间中。运行流程spiders网页爬虫items项目engine引擎scheduler调度器downloader下载器item pipelines项目管道middleware中间设备,中间件数据流:上图显示了Scrapy框架的体系结构及其组件,以及系统内部发生的数据流(由红色的箭头显示。)Scrapy中的数据流由执行引擎控制,流程如下:首先从网页爬虫获取初始的请求将请求放入调度模块,然后获取下一个需要爬取的请求调度模块返回下一个需要爬取的请求给引擎引擎将请求发送给下载器,依次穿过所有的下载中间件一旦页面下载完成,下载器会返回一个响应包含了页面数据,然后再依次穿过所有的下载中间件。引擎从下载器接收到响应,然后发送给爬虫进行解析,依次穿过所有的爬虫中间件爬虫处理接收到的响应,然后解析出item和生成新的请求,并发送给引擎引擎将已经处理好的item发送给管道组件,将生成好的新的请求发送给调度模块,并请求下一个请求该过程重复,直到调度程序不再有请求为止。二.组件介绍Scrapy Engine(引擎)引擎负责控制系统所有组件之间的数据流,并在发生某些操作时触发事件。scheduler(调度器)调度程序接收来自引擎的请求,将它们排入队列,以便稍后引擎请求它们。Downloader(下载器)下载程序负责获取web页面并将它们提供给引擎,引擎再将它们提供给spider。spider(爬虫)爬虫是由用户编写的自定义的类,用于解析响应,从中提取数据,或其他要抓取的请求。Item pipeline(管道)管道负责在数据被爬虫提取后进行后续处理。典型的任务包括清理,验证和持久性(如将数据存储在数据库中)2.1下载中间件下载中间件是位于引擎和下载器之间的特定的钩子,它们处理从引擎传递到下载器的请求,以及下载器传递到引擎的响应。如果你要执行以下操作之一,请使用Downloader中间件:在请求发送到下载程序之前处理请求(即在scrapy将请求发送到网站之前)在响应发送给爬虫之前直接发送新的请求,而不是将收到的响应传递给蜘蛛将响应传递给爬行器而不获取web页面;默默的放弃一些请求2.2爬虫中间件爬虫中间件是位于引擎和爬虫之间的特定的钩子,能够处理传入的响应和传递出去的item和请求。如果你需要以下操作请使用爬虫中间件:处理爬虫回调之后的 请求或item处理start_requests处理爬虫异常根据响应内容调用errback而不是回调请简单使用三.项目命令3.1创建项目:scrapy startproject <project_name> [project_dir]ps: “<>”表示必填 ,”[]”表示可选scrapy startproject db都是db3.2cd 到项目下scrapy genspider [options]scrapy genspider example example.com 会创建在项目/spider下 ;其中example 是爬虫文件名, example.com 是 url123.3.运行项目scrapy crawl 爬虫文件名 #注重流程3.4.setting 里配置ROBOTSTXT_OBEY;DEFAULT_REQUEST_HEADERSROBOTSTXT_OBEY = FalseDEFAULT_REQUEST_HEADERS = {‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8’,‘Accept-Language’: ‘en’,“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36”}四.shell 交互式平台scrapy shell url (start_url) 获取我们项目中的response测试 xpath进行匹配4.1目标数据要求:250个电影信息电影信息为:电影名字,导演信息(可以包含演员信息),评分将电影信息直接本地保存将电影信息通过管道进行保存4.2爬虫文件-- coding: utf-8 --import jsonimport scrapyfrom ..items import DbItem #是一个安全的字典class Db250Spider(scrapy.Spider):#继承基础类name = 'db250' #爬虫文件名字 必须存在且唯一
# allowed_domains = ['movie.douban.com'] #允许的域名 可以不存在 不存在 任何域名都可以
start_urls = ['https://movie.dou.com/top250']#初始url 必须要存在
page_num=0
def parse(self, response):#解析函数 处理响应数据
node_list=response.xpath('//div[@class="info"]')
with open("film.txt","w",encoding="utf-8") as f:
for node in node_list:
#电影名字
# extract 新的知识
film_name=node.xpath("./div/a/span/text()").extract()[0]
#导演信息
director_name=node.xpath("./div/p/text()").extract()[0].strip()
#评分
score=node.xpath('./div/div/span[@property="v:average"]/text()').extract()[0]
#非管道存储
item={}
item["item_pipe"]=film_name
item["director_name"]=director_name
item["score"]=score
content=json.dumps(item,ensure_ascii=False)
f.write(content+"\n")
#使用管道存储
item_pipe=DbItem() #创建Dbitem对象 当成字典来使用
item_pipe['film_name']=film_name
item_pipe['director_name']=director_name
item_pipe['score']=score
yield item_pipe
#发送新一页的请求
#构造url
self.page_num += 1
if self.page_num==3:
return
page_url="https://movie.douban.com/top250?start={}&filter=".format(self.page_num*25)
yield scrapy.Request(page_url)
page页规律"https://movie.dou.com/top250?start=25&filter=""https://movie.dou.com/top250?start=50&filter=""https://movie.dou.com/top250?start=75&filter="123456789101112131415161718192021222324252627282930313233343536373839404142434445464748494.3items文件import scrapyclass DbItem(scrapy.Item):# define the fields for your item here like:
# name = scrapy.Field()
film_name=scrapy.Field()
director_name=scrapy.Field()
score=scrapy.Field()123456784.4piplines文件import jsonclass DbPipeline(object):def open_spider(self,spider):
#爬虫文件开启,此方法执行
self.f=open("film_pipe.txt","w",encoding="utf-8")
def process_item(self, item, spider):
json_data=json.dumps(dict(item),ensure_ascii=False)+"\n"
self.f.write(json_data)
return item
def close_spider(self,spider):
# 爬虫文件关闭,此方法执行
self.f.close() #关闭文件1234567891011121314154.5settings文件-- coding: utf-8 --Scrapy settings for db projectFor simplicity, this file contains only settings considered important orcommonly used. You can find more settings consulting the documentation:https://docs.scrapy.org/en/latest/topics/settings.htmlhttps://docs.scrapy.org/en/latest/topics/downloader-middleware.htmlhttps://docs.scrapy.org/en/latest/topics/spider-middleware.htmlBOT_NAME = 'db'SPIDER_MODULES = ['db.spiders']NEWSPIDER_MODULE = 'db.spiders'Crawl responsibly by identifying yourself (and your website) on the user-agentUSER_AGENT = 'db (+http://www.yourdomain.com)'Obey robots.txt rulesROBOTSTXT_OBEY = FalseConfigure maximum concurrent requests performed by Scrapy (default: 16)CONCURRENT_REQUESTS = 32Configure a delay for requests for the same website (default: 0)See https://docs.scrapy.org/en/latest/topics/settings.html#download-delaySee also autothrottle settings and docsDOWNLOAD_DELAY = 3The download delay setting will honor only one of:CONCURRENT_REQUESTS_PER_DOMAIN = 16CONCURRENT_REQUESTS_PER_IP = 16Disable cookies (enabled by default)COOKIES_ENABLED = FalseDisable Telnet Console (enabled by default)TELNETCONSOLE_ENABLED = FalseOverride the default request headers:DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8', 'Accept-Language': 'en',"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}Enable or disable spider middlewaresSee https://docs.scrapy.org/en/latest/topics/spider-middleware.htmlSPIDER_MIDDLEWARES = {'db.middlewares.DbSpiderMiddleware': 543,}Enable or disable downloader middlewaresSee https://docs.scrapy.org/en/latest/topics/downloader-middleware.htmlDOWNLOADER_MIDDLEWARES = {'db.middlewares.DbDownloaderMiddleware': 543,}Enable or disable extensionsSee https://docs.scrapy.org/en/latest/topics/extensions.htmlEXTENSIONS = {'scrapy.extensions.telnet.TelnetConsole': None,}Configure item pipelinesSee https://docs.scrapy.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES = { 'db.pipelines.DbPipeline': 300,}Enable and configure the AutoThrottle extension (disabled by default)See https://docs.scrapy.org/en/latest/topics/autothrottle.htmlAUTOTHROTTLE_ENABLED = TrueThe initial download delayAUTOTHROTTLE_START_DELAY = 5The maximum download delay to be set in case of high latenciesAUTOTHROTTLE_MAX_DELAY = 60The average number of requests Scrapy should be sending in parallel toeach remote serverAUTOTHROTTLE_TARGET_CONCURRENCY = 1.0Enable showing throttling stats for every response received:AUTOTHROTTLE_DEBUG = FalseEnable and configure HTTP caching (disabled by default)See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settingsHTTPCACHE_ENABLED = TrueHTTPCACHE_EXPIRATION_SECS = 0HTTPCACHE_DIR = 'httpcache'HTTPCACHE_IGNORE_HTTP_CODES = []HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293五.项目注意事项settings文件中 项目默认的是 ROBOTSTXT_OBEY = True,即遵循robots协议,则不能爬取到数据则更改为 ROBOTSTXT_OBEY = Falsesettings中,有些网站需要添加User-Agent ,才能获取到数据 (伪装成客户端)settings中,需要将管道打开,才可以将数据传递到pipelines文件中items中需要设置相应的字段,使用Item对象传递数据,(可以理解为mysql先定义字段,才能写入数据一样)六.scrapy shellScrapy shell[s] Available Scrapy objects:[s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc) #scrapy 模块[s] crawler <scrapy.crawler.Crawler object at 0x000002624C415F98> #爬虫对象[s] item {} #item对象[s] request # 请求对象[s] response <200 https://movie.douban.com/top250> #响应对象[s] settings <scrapy.settings.Settings object at 0x000002624C415EB8> #配置文件[s] spider #spider文件[s] Useful shortcuts:[s] fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed) #通过url 获取response[s] fetch(req) Fetch a scrapy.Request and update local objects #通过请求对象 获取response[s] shelp() Shell help (print this help) #列出命令[s] view(response) View response in a browser #response 界面 本地浏览器环境下使用1234567891011121314七.选择器html_str="""
肖申克的救赎
?/?The Shawshank Redemption
?/?月黑高飞(港) / 刺激1995(台)
[可播放]
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.7</span>
<span property="v:best" content="10.0"></span>
<span>1980500人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>"""from scrapy.selector import Selector1.通过text 参数来构造对象selc_text=Selector(text=html_str)print(selc_text.xpath('//div[@class="info"]//div/a/span/text()').extract()[0])print(selc_text.xpath('./body/div[@class="info"]//div/a/span/text()').extract()[0])print(selc_text.xpath('//div[@class="info"]//div/a/span/text()').extract_first())2.通过 response 构造selector对象from scrapy.http import HtmlResponseresponse=HtmlResponse(url="http://www.example.com",body=html_str.encode())Selector(response=response)print(response.selector.xpath('//div[@class="info"]//div/a/span/text()').extract()[0])print(response.xpath('//div[@class="info"]//div/a/span/text()').extract()[0])3.嵌套表达式 selector 可以任意使用 css xpath reprint(response.css("a").xpath('./span[1]/text()').extract()[0])print(response.css("a").xpath('./span[1]/text()').re("的..")[0])print(response.css("a").xpath('./span[1]/text()').re_first("的.."))12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849次级页面抓取及数据传递拼接(电影)1.详情页抓取(次级页面) 的主要方法是get_detail 方法def get_detail(self,response):pass122.参数的传递拼接 的关键参数是 meta参数spider文件-- coding: utf-8 --import jsonimport scrapyfrom ..items import DbItem #是一个安全的字典class Db250Spider(scrapy.Spider):#继承基础类name = 'db250' #爬虫文件名字 必须存在且唯一
# allowed_domains = ['movie.douban.com'] #允许的域名 可以不存在 不存在 任何域名都可以
start_urls = ['https://movie.dou.com/top250']#初始url 必须要存在
page_num=0
def parse(self, response):#解析函数 处理响应数据
node_list=response.xpath('//div[@class="info"]')
for node in node_list:
#电影名字
film_name=node.xpath("./div/a/span/text()").extract()[0]
#导演信息
director_name=node.xpath("./div/p/text()").extract()[0].strip()
#评分
score=node.xpath('./div/div/span[@property="v:average"]/text()').extract()[0]
#使用管道存储
item_pipe=DbItem() #创建Dbitem对象 当成字典来使用
item_pipe['film_name']=film_name
item_pipe['director_name']=director_name
item_pipe['score']=score
# yield item_pipe
# print("电影信息",dict(item_pipe))
# 电影简介
detail_url = node.xpath('./div/a/@href').extract()[0]
yield scrapy.Request(detail_url,callback=self.get_detail,meta={"info":item_pipe})
#发送新一页的请求
#构造url
self.page_num += 1
if self.page_num==4:
return
page_url="https://movie.douban.com/top250?start={}&filter=".format(self.page_num*25)
yield scrapy.Request(page_url)
def get_detail(self,response):
item=DbItem()
#解析详情页的response
#1.meta 会跟随response 一块返回 2.通过response.meta接收 3.通过update 添加到新的item对象中
info = response.meta["info"]
item.update(info)
#简介内容
description=response.xpath('//div[@id="link-report"]//span[@property="v:summary"]/text()').extract()[0].strip()
# print('description',description)
item["description"]=description
#通过管道保存
yield item
目标数据 电影信息+ 获取电影简介数据 次级页面的网页源代码里请求流程 访问一级页面 提取电影信息+次级页面的url 访问次级页面url 从次级的数据中提取电影简介存储的问题 数据没有次序 需要使用 meta传参 保证 同一电影的信息在一起123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657八.items文件import scrapyclass DbItem(scrapy.Item):# define the fields for your item here like:
# name = scrapy.Field()
film_name=scrapy.Field()
director_name=scrapy.Field()
score=scrapy.Field()
description=scrapy.Field()12345678910九.pipelines 文件import jsonclass DbPipeline(object):def open_spider(self,spider):
#爬虫文件开启,此方法执行
self.f=open("film_pipe.txt","w",encoding="utf-8")
def process_item(self, item, spider):
json_data=json.dumps(dict(item),ensure_ascii=False)+"\n"
self.f.write(json_data)
return item
def close_spider(self,spider):
# 爬虫文件关闭,此方法执行
self.f.close() #关闭文件1234567891011121314十.settings 文件此处删除了大部分注释-- coding: utf-8 --Scrapy settings for db projectBOT_NAME = 'db'SPIDER_MODULES = ['db.spiders']NEWSPIDER_MODULE = 'db.spiders'Crawl responsibly by identifying yourself (and your website) on the user-agentUSER_AGENT = 'db (+http://www.yourdomain.com)'Obey robots.txt rulesROBOTSTXT_OBEY = FalseOverride the default request headers:DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8', 'Accept-Language': 'en',"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}Configure item pipelinesSee https://docs.scrapy.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES = { 'db.pipelines.DbPipeline': 300,}123456789101112131415161718192021222324252627十一.Scrapy shellscrapy shell的作用是用于调试,在项目 目录下输入scrapy shell https://movie.dou…com/top250 得到下列信息:scrapy shell 会自动加载settings里的配置,即robots协议,请求头等都可以加载,从而发起请求可以得到正确的响应信息。[s] Available Scrapy objects:[s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc) #scrapy 模块[s] crawler <scrapy.crawler.Crawler object at 0x000002624C415F98> #爬虫对象[s] item {} #item对象[s] request # 请求对象[s] response <200 https://movie.douban.com/top250> #响应对象[s] settings <scrapy.settings.Settings object at 0x000002624C415EB8> #配置文件[s] spider #spider文件[s] Useful shortcuts:[s] fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed) #通过url 获取response[s] fetch(req) Fetch a scrapy.Request and update local objects #通过请求对象 获取response[s] shelp() Shell help (print this help) #列出命令[s] view(response) View response in a browser #response 界面 本地浏览器环境下使用12345678910111213Scrapy shell 本质上就是个普通的python shell只不过提供了一些需要使用的对象,快捷方法便于我们调试。快捷方法:shelp()fetch(url[,redirect=True])fetch(request)view(response)scrapy 对象:crawlerspiderrequestresponsesetting十二.Scrapy 选择器Scrapy提供基于lxml库的解析机制,它们被称为选择器。因为,它们“选择”由XPath或CSS表达式指定的HTML文档的某部分。Scarpy选择器的API非常小,且非常简单。选择器提供2个方法来提取标签xpath() 基于xpath的语法规则css() 基于css选择器的语法规则快捷方式response.xpath()response.css()它们返回的选择器列表提取文本:selector.extract() 返回文本列表selector.extract_first() 返回第一个selector的文本,没有返回None十三.嵌套选择器有时候我们获取标签需要多次调用选择方法(.xpath()或.css())response.css(‘img’).xpath(‘@src’)Selector还有一个.re()方法使用正则表达式提取数据的方法。它返回字符串。它一般使用在xpath(),css()方法之后,用来过滤文本数据。re_first()用来返回第一个匹配的字符串。html_str="""
肖申克的救赎
?/?The Shawshank Redemption
?/?月黑高飞(港) / 刺激1995(台)
[可播放]
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.7</span>
<span property="v:best" content="10.0"></span>
<span>1980500人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>"""from scrapy.selector import Selector1.通过text 参数来构造对象selc_text=Selector(text=html_str)print(selc_text.xpath('//div[@class="info"]//div/a/span/text()').extract()[0])print(selc_text.xpath('./body/div[@class="info"]//div/a/span/text()').extract()[0])print(selc_text.xpath('//div[@class="info"]//div/a/span/text()').extract_first())2.通过 response 构造selector对象from scrapy.http import HtmlResponseresponse=HtmlResponse(url="http://www.example.com",body=html_str.encode())Selector(response=response)print(response.selector.xpath('//div[@class="info"]//div/a/span/text()').extract()[0])print(response.xpath('//div[@class="info"]//div/a/span/text()').extract()[0])3.嵌套表达式 selector 可以任意使用 css xpath reprint(response.css("a").xpath('./span[1]/text()').extract()[0])print(response.css("a").xpath('./span[1]/text()').re("的..")[0])print(response.css("a").xpath('./span[1]/text()').re_first("的.."))123456789101112131415161718192021222324252627282930313233343536373839404142434445464748十四.scrapy.Spiderspider 的名称 name一个字符串,用于定义此蜘蛛的名称。蜘蛛名称是Scrapy如何定位(并实例化)蜘蛛,因此它必须是唯一的。这是最重要的蜘蛛属性,它是必需的。起始urls蜘蛛将开始爬取的URL列表。因此,下载的第一页将是此处列出的页面。后续Request将从起始URL中包含的数据连续生成。自定义设置运行此蜘蛛时将覆盖项目范围的设置。必须将其定义为类属性,因为在实例化之前更新了设置。class Spider(object_ref):"""Base class for scrapy spiders. All spiders must inherit from this
class.
"""
name = None
custom_settings = None
def __init__(self, name=None, **kwargs):
if name is not None:
self.name = name
elif not getattr(self, 'name', None):
raise ValueError("%s must have a name" % type(self).__name__)
self.__dict__.update(kwargs)
if not hasattr(self, 'start_urls'):
self.start_urls = []
12345678910111213141516十五 .logger使用Spider创建的Python日志器。您可以使用它来发送日志消息。@propertydef logger(self):logger = logging.getLogger(self.name)
return logging.LoggerAdapter(logger, {'spider': self})
def log(self, message, level=logging.DEBUG, **kw):"""Log the given message at the given log level
This helper wraps a log call to the logger within the spider, but you
can use it directly (e.g. Spider.logger.info('msg')) or use any other
Python logger too.
"""
self.logger.log(level, message, **kw)12345678910111213十六 .from_crawler这是Scrapy用于创建spider的类方法。一般不用覆盖。@classmethoddef from_crawler(cls, crawler, args, *kwargs):spider = cls(*args, **kwargs)
spider._set_crawler(crawler)
return spider
def _set_crawler(self, crawler):self.crawler = crawler
self.settings = crawler.settings
crawler.signals.connect(self.close, signals.spider_closed)12345678910十七.start_requests() 开始请求此方法必须返回一个iterable,其中包含第一个要爬网的请求。它只会被调用一次def start_requests(self):cls = self.__class__
if not self.start_urls and hasattr(self, 'start_url'):
raise AttributeError(
"Crawling could not start: 'start_urls' not found "
"or empty (but found 'start_url' attribute instead, "
"did you miss an 's'?)")
if method_is_overridden(cls, Spider, 'make_requests_from_url'):
warnings.warn(
"Spider.make_requests_from_url method is deprecated; it "
"won't be called in future Scrapy releases. Please "
"override Spider.start_requests method instead (see %s.%s)." % (
cls.__module__, cls.__name__
),
)
for url in self.start_urls:
yield self.make_requests_from_url(url)
else:
for url in self.start_urls:
yield Request(url, dont_filter=True)
1234567891011121314151617181920十八.parse 默认回调函数方法这是Scrapy在其请求未指定回调时处理下载的响应时使用的默认回调def parse(self, response):raise NotImplementedError('{}.parse callback is not defined'.format(self.__class__.__name__))12close 关闭spiderspider关闭时调用
Python爬虫篇:实现铃声采集
前言大家好,我是辣条哥本篇只是进行知识分享,切勿用作其他用途本篇只是进行知识分享,切勿用作其他用途本篇只是进行知识分享,切勿用作其他用途,重要的事情说三遍目录前言工具准备项目思路解析简易源码分享总结工具准备开发工具:pycharm开发环境:python3.7, Windows10使用工具包:requests,lxml项目思路解析最近在找一些视频的背景音乐,无意中找到了当前这个网址,里面的音频还是很全面的,种类也多,唯一美中不足的是当前这个页面是需要进行收米的,在对这个网页进行一些简单分析之后,发现当前这个网页的加密是没有做的很严格的,只要你稍稍会点技术就可以对其进行数据采集。首先找到当前网页需要的音频页面数据,先获取到准确的数据页面信息当前这个网页的音频数据都是需要进行付费下载的,但是这个网址渲染的页面是静态数据,对外有去暴露了他的MP3的播放地址,可以在当前页面直接抓包获取到,这个网页对鼠标右击进行禁用,可以使用快捷键f12打开当前的页面信息,定位到页面数据可以看到这个就是我们想要的mp3的播放地址我们可以尝试在浏览器页面对这个网址进行访问看看能不能获取到我们想要的音频数据,复制mp3地址在页面进行访问可以看到就是我们想要的网址数据信息,现在需要对当前网址发送请求获取到页面数据,进行数据的筛选。url = 'https://www.tukuppt.com/peiyue/zonghe_0_0_0_0_0_0_8.html'发送请求response = requests.get(url)123发送网之后我们通过xpath进行数据的提取,xpath有自己独立的语法,我们需要对xpath语法进行简单的认识,一些基础定义语法格式。表达式 描述nodename 选取此节点的所有子节点。/ 从根节点选取。// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。. 选取当前节点。… 选取当前节点的父节点。@ 选取属性。通过独立的语法进行提取筛选,要是对语法不是特别熟练的可以通过浏览器上的xpath插件进行练习,能帮助大家更好的去认识xpath语法提取出播放地址,以及音频的标题,因为之后我们是需要把数据保存在本地的,需要用中文来进行命名,在通过xpath语法进行提取就行,在使用xpath语法时需要注意,xpath是不能直接对html数据进行处理的,我们需要使用lxml的库将数据转换成对象数据 html_data = etree.HTML(response.text)1通过xpath所提取的数据为列表,我们可以通过循环的方式取出列表里的每个值,提取之后在次对音频播放地址发送请求,这个网址还需要拼接上https的请求协议,我们在网页上进行提取到的数据是没有请求协议的如果直接请求是会报错的,通过requests库再次发送请求,获取的音频数据是进制数据,将获取到的进制数据保存在本地。注意我们的数据写入时是进制数据,写入的模式为wb,到此大功告成简易源码分享++本篇文章只是进行知识分享,切勿用作其他用途++import requests # 发送网络请求的工具包 库 底上库 模块from lxml import etree # 转换数据的库url = 'https://www.tukuppt.com/peiyue/zonghe_0_0_0_0_0_0_8.html'发送请求response = requests.get(url)print(response.text)筛选数据 html xpath 正则 bs4 css选择器 pyqueryhtml_data = etree.HTML(response.text)print(html_data)mp3_url_list = html_data.xpath('//div[@class="b-box"]/dl/audio/source/@src')title_list = html_data.xpath('//div[@class="b-box"]/dl/dt[@class="info"]/a[@class="title"]/text()')print(mp3_url_list) # 列表 [1,12,34,5]for title, mp3_url in zip(title_list, mp3_url_list):# print(title)
# print(mp3_url)
result = requests.get('https:' + mp3_url)
# print(result.content)
# 保存数据 服务器 数据库 mysql mongodb 文本数据
# 文件操作 读取 read r 写入 w 追加数据 a
with open('lingsheng/' + title + '.mp3', 'wb')as f:
f.write(result.content)
print('正在下载{}'.format(title))
1234567891011121314151617181920212223总结不懂的或者说想要别的源码的,底下留言源码,或者直接找底下名片找我,再次提醒不能用来胡作非为,这是供大家学习参考的,最后祝大家学业有成————————————————版权声明:本文为CSDN博主「五包辣条!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/AI19970205/article/details/124820300
Python实例篇:这样操作PDF文件一点都不枯燥了
前言大家好,我是辣条之前辣条有发布过我们常用的两个技能点,今天第三个技能点(PDF)他来了《Python实例篇:自动操作Excel文件(既简单又特别实用)》《Python技巧篇:如何巧妙运用Python处理Word文档》PDF是Portable Document Format的缩写,这类文件通常使用.pdf作为其扩展名。在日常开发工作中,最容易遇到的就是从PDF中读取文本内容以及用已有的内容生成PDF文档这两个任务。目录前言工具从PDF中提取文本旋转和叠加页面加密PDF文件创建PDF文件总结工具python3.7PycharmPDFPyPDF2reportlab从PDF中提取文本PyPDF2没有办法从PDF文档中提取图像、图表或其他媒体,但它可以提取文本,并将其返回为Python字符串。import PyPDF2reader = PyPDF2.PdfFileReader('test.pdf')page = reader.getPage(0)print(page.extractText())12345旋转和叠加页面? 上面的代码中通过创建PdfFileReader对象的方式来读取PDF文档,该对象的getPage方法可以获得PDF文档的指定页并得到一个PageObject对象,通过PageObject对象的rotateClockwise和rotateCounterClockwise方法可以实现页面的顺时针和逆时针方向旋转,通过PageObject对象的addBlankPage方法可以添加一个新的空白页,代码如下所示。import PyPDF2from PyPDF2.pdf import PageObject创建一个读PDF文件的Reader对象reader = PyPDF2.PdfFileReader('resources/xxx.pdf')创建一个写PDF文件的Writer对象writer = PyPDF2.PdfFileWriter()对PDF文件所有页进行循环遍历for page_num in range(reader.numPages):# 获取指定页码的Page对象
current_page = reader.getPage(page_num) # type: PageObject
if page_num % 2 == 0:
# 奇数页顺时针旋转90度
current_page.rotateClockwise(90)
else:
# 偶数页反时针旋转90度
current_page.rotateCounterClockwise(90)
writer.addPage(current_page)最后添加一个空白页并旋转90度page = writer.addBlankPage() # type: PageObjectpage.rotateClockwise(90)通过Writer对象的write方法将PDF写入文件with open('resources/xxx.pdf', 'wb') as file:writer.write(file)
12345678910111213141516171819202122232425加密PDF文件? 使用PyPDF2中的PdfFileWrite对象可以为PDF文档加密,如果需要给一系列的PDF文档设置统一的访问口令,使用Python程序来处理就会非常的方便。import PyPDF2reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')writer = PyPDF2.PdfFileWriter()for page_num in range(reader.numPages):writer.addPage(reader.getPage(page_num))通过encrypt方法加密PDF文件,方法的参数就是设置的密码writer.encrypt('foobared')with open('resources/XGBoost-encrypted.pdf', 'wb') as file:writer.write(file)12345678910创建PDF文件? 创建PDF文档需要三方库reportlab的支持,使用 pip install reportlab 命令安装from reportlab.lib.pagesizes import A4from reportlab.pdfbase import pdfmetricsfrom reportlab.pdfbase.ttfonts import TTFontfrom reportlab.pdfgen import canvaspdf_canvas = canvas.Canvas('resources/python创建.pdf', pagesize=A4)width, height = A4绘图image = canvas.ImageReader('resources/xxx.jpg')pdf_canvas.drawImage(image, 20, height - 395, 250, 375)显示当前页pdf_canvas.showPage()注册字体文件pdfmetrics.registerFont(TTFont('Font1', 'resources/fonts/Vera.ttf'))pdfmetrics.registerFont(TTFont('Font2', 'resources/fonts/青呱石头体.ttf'))写字pdf_canvas.setFont('Font2', 40)pdf_canvas.setFillColorRGB(0.9, 0.5, 0.3, 1)pdf_canvas.drawString(width // 2 - 120, height // 2, '你好,世界!')pdf_canvas.setFont('Font1', 40)pdf_canvas.setFillColorRGB(0, 1, 0, 0.5)pdf_canvas.rotate(18)pdf_canvas.drawString(250, 250, 'hello, world!')保存pdf_canvas.save()123456789101112131415161718192021222324252627282930总结? 以上就是python对PDF文档的操作了,实际操作还需要大家多多练习。
使用报告-我的ESC初体验
PART1 自我介绍我是一名来自电子信息专业的大学生,在一次跟学长的交流中,得知了阿里云有针对学生的服务器优惠活动。本身我对于搭建网站有一定的兴趣,所以参加了这次的“飞天加速计划·高校学生在家实践”活动。PART2 使用体验对于一个从未使用过云服务器的小白来说,领取学生专享服务器前的引导教程,真的有很大的帮助,让我能更快的上手ECS。领取后,ECS后台的控制面板也非常的简洁直观,还有很多实用的功能。例如我想要换一个系统,发现面板里就有直接切换系统的功能,不需要自己学习怎么装,易用性拉满。同时作为初次建站的小白,有很多东西都是我不会的。譬如配置环境,虽然阿里云市场有一键配置的环境镜像,但我仍然希望自己手动配置一次。恰好阿里云的开发者社区里有很多大神分享的优质教程。我可以跟着大神们的帖子一步步来操作。哪里不会了或者错误了,也可以只搜索帖子,找到相同的问题,看看热心大神的回复,顺利解决问题。同时在ECS下载github上面或者外国的项目,网速也非常快,不存在下不动的情况。PART3 收获总结通过两个星期对ECS的使用和学习,我从一个什么小白,学会了手动安装LNMP环境,使用,安装和配置MAVEN环境,使用MAVEN打包Jar,安装和使用宝塔面板。同时也熟悉了HTML和CSS的使用,我以前学过一段时间,但还从未实践过,这次的活动给了我一个难得的实战机会。在这次阿里云的活动中,我熟悉了ECS的工作流程,对于未来无论是工作还是学习,都有很大的帮助。希望接下来还有机会继续参加活动,学习和使用ECS。