版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目2爬虫入门——网页数据抓取—抓取图片、视频与半结构化数据任务2.1认识网络常见数据类型2.1.1
HTMLHTML是构建网页的基础语言,通过各类标签定义网页中的标题、段落、图片、链接等内容。示例如下:
<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>我的第一个网页</title></head><body><h1>欢迎来到我的网站</h1><p>这是一个简单的HTML示例。</p></body></html>。2.1.2
XML
XML(可扩展标记语言)于1998年确立规范与标准并沿用至今,是当前因特网上保存和传输信息的主要标记语言。
示例如下:
<?xmlversion="1.0"encoding="utf-8"?><student><name>王五</name><age>20</age><major>计算机科学</major><grades><gradesubject="数学">90</grade><gradesubject="英语">85</grade></grades></student>。2.1.3
JSONJSON(JavaScriptObjectNotation)来自JavaScript,是目前广泛应用的网络数据传输格式。其中,JavaScript是一种基于Web的脚本语言,主要用于在HTML页面中添加动作脚本。JSON作为一种轻量级的数据交换技术,在跨平台数据传输与交换中发挥着关键作用。JSON格式数据如下:
{"name":"Michael"}{"name":"Andy","age":30}{"name":"Justin","age":19}。2.1.4
非文本类资源
非文本类资源是网页资源中极具重要性的一类,尤其在数据抓取场景中,图片、视频、音频等非文本资源往往需要特殊处理流程。
图片的常用的格式为JPG、PNG、GIF、SVG及WEBP等,这类图片资源在网页中通常通过<img>标签嵌入呈现,代码如下:<imgsrc="logo.png"alt="网站Logo">
视频的常用的格式为MP4、WebM及OGG等,这类视频资源在网页中通常通过<video>标签嵌入呈现,代码如下:
<videowidth="320"height="240"controls><sourcesrc="movie.mp4"type="video/mp4">
您的浏览器不支持视频播放。</video>
音频与视频类似任务2.2文件操作认识open()函数open()函数是Python中用于打开文件的标准内置函数,可提供灵活的文件读取、写入、追加等操作方式。正确使用open()函数对文件处理至关重要,在数据处理、日志记录、网络爬虫等场景中广泛使用。认识open()函数open()函数的语法如下:
open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=
None)【例2-1】使用Python读取文本内容。(1)新建记事本文档,命名为8.26.txt,并写入内容(2)运行Python3,命名为8.26.py
,编写以下代码withopen('8.26.txt')asfile_object:contents=file_object.read()print(contents)认识open()函数
从图2-3中可以看出,在Windows系统中,可以通过运行Python显示记事本中的文档内容。Python中open()函数的运行模式见表2-2所示。运行模式说
明r读取模式(默认模式),如果文件不存在,则会抛出异常运行模式说
明w写入模式,如果文件存在,则先清空原有内容再写入x写入模式,仅用于创建新文件。如果文件已存在,则会抛出异常a追加模式,不会不覆盖原有内容b二进制模式t文本模式+读写模式任务2.3图片与视频抓取2.3.1图片抓取1.下载本地服务器中的图片【例2-2】直接下载图片。第1步:构建本地服务器(端口号为8080),网址为http://localhost:8080/,并将图片(1.JPG)复制到该服务器的文件夹中,运行结果如图2-4所示。2.3.1图片抓取第2步:编写代码:
importrequests #导入requests模块r3=requests.get("http://localhost:8080/1.jpg") #发送GET请求获取图片资源withopen('img.jpg','wb')asf:#使用
with
安全打开本地文件,以二进制写入模式wb打开f.write(r3.content) #将响应中的二进制内容写入本地文件
该程序运行后会并在当前目录生成一个新文件img.jpg,打开该文件即可查看下载的图片。2.3.1图片抓取【例2-3】采用流式方式下载图片。
importrequestsimportshutil #用于高效复制文件流(适合大文件场景)
#网页地址webpage_url='http://localhost:8080/' #HTML所在的目录,确保以斜杠结尾img_relative_path='1.jpg' #图片的相对路径
#构造图片的完整URLimg_url=webpage_url+img_relative_path
#发送GET请求下载图片response=requests.get(img_url,stream=True)
#检查请求是否成功ifresponse.status_code==200:#将内容写入图片文件withopen('downloaded_image.jpg','wb')asout_file:shutil.copyfileobj(response.raw,out_file)print("图片已成功下载")else:print(f"无法下载图片,HTTP状态码:{response.status_code}")2.3.1图片抓取2.下载远程服务器中的图片【例2-4】下载百度网站的logo。第1步:打开百度网站,找到网址中对应的网页logo地址标签,如图2-6所示。2.3.1图片抓取2.下载远程服务器中的图片第2步:编写代码:
importrequests#导入requests模块r3=requests.get("/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png")withopen('logo.jpg','wb')asf:f.write(r3.content)2.3.1图片抓取运行程序后下载的图片如图2-7所示。2.3.2视频抓取
视频抓取和图片抓取类似,即通过requests.get方法获取视频内容后,以二进制写入模式保存到本地。
无论是图片还是视频,其在网络上传输的本质都是字节流。Python中的requests模块可以获取这些字节流,我们只需将其原样保存为对应文件——核心在于使用正确的文件名和二进制写入模式打开文件。
(1)放置一个视频文件到本地Python服务器中,地址为http://localhost:8080/1.mp4,如图2-8所示。(2)编写代码爬取该视频:
importrequestsr3=requests.get("http://localhost:8080/1.mp4")withopen('01.mp4','wb')asf:f.write(r3.content)运行该程序即可将该视频下载到本地,保存为01.mp4。
读者也可以根据需要修改程序中的保存路径,将视频下载到其他指定位置。需要注意的是,该方法仅适用于下载网页中公开的视频资源,可根据实际场景灵活使用。
【小贴士】URL合法性问题
在抓取视频文件时,需要在确认视频链接有效且服务器正常响应。同时,必须严格遵守目标网站的使用条款与视频版权规定,下载内容仅可用于个人学习等合法用途。
任务2.4XML与JSON数据处理2.4.1
XML数据处理Python提供了多个模块来处理XML,常用的是xml.etree.ElementTree及lxml,其中xml.etree.ElementTree轻量级模块,适合读写小型XML文档;lxml则是第三方库,功能更强大,并且支持XPath。一个XML文档如下:<?xmlversion="1.0"encoding="utf-8"?><bookcategory="fiction"><titlelang="en">HarryPotter</title><author>J.K.Rowling</author><year>2005</year><price>29.99</price></book>
在这里标签名为book、title、author、year、price。属性:category="fiction"位于<book>标签中。文本内容:如"HarryPotter"位于<title>标签中。1.xml.etree.ElementTree【例2-5】使用xml.etree.ElementTree读取XML数据。
importxml.etree.ElementTreeasET#读取XML文件defparse_xml(file_path):tree=ET.parse(file_path)root=tree.getroot()
students=[]forstudentinroot.findall('学生'):student_id=student.attrib['学号']name=student.find('姓名').textgender=student.find('性别').textstudents.append((student_id,name,gender))print(students)if__name__=="__main__":#XML文件路径xml_file_path="result.xml"#解析XML文件students_data=parse_xml(xml_file_path)这里使用的result.xml内容如下:
<?xmlversion="1.0"encoding="utf-8"?><学生表><学生学号="0001"><姓名>张三</姓名><性别>男</性别></学生><学生学号="0002"><姓名>李四</姓名><性别>男</性别></学生></学生表>【例2-6】使用xml.etree.ElementTree生成XML数据。
importxml.etree.ElementTreeasET#创建根节点root=ET.Element("data")#创建子节点item1=ET.SubElement(root,"item",name="apple")item1.text="苹果"item2=ET.SubElement(root,"item",name="banana")item2.text="香蕉"#构建ElementTree对象并将其写入文件tree=ET.ElementTree(root)tree.write("output.xml",encoding="utf-8",xml_declaration=True)运行该示例生成的XML文件内容如下:
<?xmlversion='1.0'encoding='utf-8'?><data><itemname="apple">苹果</item><itemname="banana">香蕉</item></data>
lxml是一个基于libxml2和libxslt的Python库,它支持完整的XPath查询语法及XML和HTML解析,并且提供比标准库xml.etree.ElementTree更强大的功能。lxml模块的导入语句如下:
fromlxmlimportetreeasET#主要用于XML/HTML解析2.lxml【例2-7】解析XML文件或字符串。
fromlxmlimportetreeasET#从字符串解析XMLxml_data='''<bookstore><bookcategory="fiction"><titlelang="en">HarryPotter</title><author>J.K.Rowling</author></book></bookstore>'''root=ET.fromstring(xml_data)#查看根节点名称print(root.tag)【例2-8】利用XPath提取数据。
fromlxmlimportetreeasET#从字符串解析XMLxml_data='''<bookstore><bookcategory="fiction"><titlelang="en">HarryPotter</title><author>J.K.Rowling</author></book></bookstore>'''root=ET.fromstring(xml_data)#提取所有书名titles=root.xpath('//title/text()')print(titles)#['HarryPotter']#提取所有fiction类别的书fiction_books=root.xpath('//book[@category="fiction"]')forbookinfiction_books:print(book.find('author').text)注意①XPath是一个W3C标准。②XPath是XSLT中的主要元素。③XPath使用路径表达式选择XML中的节点。XPath包含7种类型的节点:元素、属性、文本、命名空间、处理指令、注释及文档节点。XML文档被视为由节点组成的树结构,其中树根被称为文档节点或根节点。在XPath的文档节点树中,包含的节点按照一定的顺序进行排列,这就是文档顺序。在读取节点时,节点所排列的顺序从上到下,从左到右。【例2-9】利用XPath提取网页中的HTML数据。
fromlxmlimportetreeasEThtml_data='''<html><body><h1>欢迎来到我的网站</h1><pclass="content">这是一个测试段落。</p></body></html>'''#使用HTML解析器tree=ET.HTML(html_data)paragraph=tree.xpath('//p[@class="content"]/text()')print(paragraph)【例2-10】提取网页中的XML数据。
第1步:准备book1.xml文件,内容如下,并将该文件放在本地服务器中,网址为http:
//localhost:8080/book1.xml。
<?xmlversion="1.0"encoding="UTF-8"?><bookstore><bookcategory="fiction"><titlelang="en">HarryPotter</title><author>J.K.Rowling</author><year>2005</year><price>29.99</price></book><bookcategory="technology"><titlelang="en">LearningXML</title><author>ErikT.Ray</author><year>2003</year><price>39.95</price></book><bookcategory="science"><titlelang="zh">Python编程从入门到实践</title><author>EricMatthes</author><year>2020</year><price>69.00</price></book></bookstore>第2步:编写代码:
importrequestsfromlxmlimportetreeasET
#假设XML文件部署在服务器上(或位于本地路径)url="http://localhost:8080/book1.xml"
#发送请求以获取XML数据response=requests.get(url)response.raise_for_status()#检查是否请求成功
#解析XML内容tree=ET.fromstring(response.content)
#提取所有书名和作者信息forbookintree.findall('book'):title=book.find('title').textauthor=book.find('author').textprint(f"书名:{title},作者:{author}")2.4.2
JSON数据处理【例2-11】从字符串解析JSON数据。
importjsonjson_str='''{"name":"张三","age":25,"is_student":false,"hobbies":["读书","编程","运动"],"address":{"city":"北京","zipcode":"100000"}}'''data=json.loads(json_str)print("姓名:",data["name"])print("城市:",data["address"]["city"])print("爱好:","、".join(data["hobbies"]))1.利用Python处理JSON数据2.4.2
JSON数据处理【例2-12】将Python对象转换为JSON数据。
importjsonbook={"title":"数据分析实战","author":"王五","year":2023,"available":True}json_output=json.dumps(book,ensure_ascii=False,indent=4)print(json_output)
运行结果如图2-17所示。1.利用Python处理JSON数据【例2-13】向测试API地址发送GET请求,并解析返回的JSON数据。
importrequestsimportjsonrequest_url="/get?name=zhengyan&age=20&sex=female&major=bigdata"data=requests.get(request_url)data_args=json.loads(data.text)data_args=data_args['args']print(data_args)
运行结果如图2-18所示。2.利用Python读取网页中的JSON数据【例2-14】使用r.json()方法读取本地服务器中的简单JSON数据。第1步:准备2.json文件,内容如下,并将其放到本地服务器中。
{"name":"TOM","age":"21","sex":"male"}
第2步:编写代码,以读取该JSON数据。
importrequestsr=requests.get('http://localhost:8080/2.json')r.encoding='utf-8'print(r.json()['name'])#使用
r.json()
方法将响应内容解析为Python字典print(r.json()['age'])print(r.json()['sex'])
运行结果如图2-19所示。项目实战
爬取本地服务器中的XML数据【任务描述】利用Python爬取本地服务器中的XML数据。【任务实施】启动本地服务器,如图2-21所示;将books.xml上传到本地服务器目录中,books.xml文件内容如图2-22所示。importrequestsimportxml.etree.ElementTreeasETimportosurl="http://localhost:8080/books.xml"try:#===从网络获取XML内容===response=requests.get(url,timeout=5)response.raise
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 如何在招商引资中实现优势互补和互利共赢
- 幼儿主题班会
- 有机波谱分析总结讲课文档
- VTE物理预防和护理管理
- 烟台市栖霞市观里镇社区工作者招聘考试题目
- (2026年)医疗不良事件报告表
- 滨州市无棣县信阳镇社区工作者招聘考试题目
- 郑和下西洋与哥伦布航海的比较教学设计
- 中小学音乐教师招聘考试试题
- 2026年跨境电商品牌Sponsored Brands策略
- 2026年高考北京卷文科综合真题试卷(+答案)
- 2026年纽扣电池行业分析报告及未来发展趋势报告
- 创建青年安全生产示范岗申报材料
- 中华民族共同体概论 课件 第十四讲 新中国与中华民族新纪元(1949-2012)
- 精神科病区康复工作制度
- 2026年影像技术副高真题(原创题)附答案详解
- 睡眠检测室工作制度
- T-KBTA 001-2024 祁门红茶T-KBTA 001-2024 祁门红茶
- 动火作业监护人员考试卷含答案
- 酒店服务标准与规范手册(标准版)
- ttt培训课件讲义
评论
0/150
提交评论