《爬虫与网络编程基础》学习
任务1:计算机网络基础
Step1-2
创建一个list,将其转换成json格式,并进行读写操作
info = [['姓名','年龄','成绩'],['小王',40,50],['小贾',50,23]]
info
import json
filename = 'test1.json'
with open(filename,'w') as f:
json.dump(info,f)
with open(filename,'r') as f:
info2 = json.load(f)
print(info2)
Step 3:关于XML格式的学习
XML文件格式
XML是一种结构化、层级化的数据格式,最适合体现XML的数据结构就是树。
ET提供了两个对象:ElementTree将整个XML文档转化为树,Element则代表着树上的单个节点。对整个XML文档的交互(读取,写入,查找需要的元素),一般是在ElementTree层面进行的。对单个XML元素及其子元素,则是在Element层面进行的。
对XML文件的格式做一些说明:
- Tag: 使用<>包围的部分,如:<表示:start-tag,>表示:end-tags;
- Element:被Tag包围的部分,如:68中的68,可以认为是一个节点,它可以有子节点;
- Attribute:在Tag中可能存在的name/value对,如中的name=”Liechtenstein”,一般表示属性
使用时需要导入的第三方库:
操作参考链接:官方文档
# 导入第三方库
import xml.etree.ElementTree as ET
XML文件的常见操作
1.构建xml格式文件
使用到的函数:
(1)root = ElementTree.Element(‘data’) # 用于创建一个元素root
(2)b = ElementTree.SubElement(root,‘b’) # 用于创建一个子元素b
(3)ElementTree对象的write方法完成XML文档的构建.
使用场景:
(1)先读取一个XML文档,进行修改后,再将修改后的内容写入文档。
(2)从头创建一个XML文档。
root = ET.Element('data')
info = ET.SubElement(root,'info',{'name':'小王'})
age = ET.SubElement(info,'age')
age.text = '40'
score = ET.SubElement(info,'score')
score.text = '50'
info2 = ET.SubElement(root,'info',{'name':'小贾'})
age2 = ET.SubElement(info2,'age')
age2.text = '50'
score2 = ET.SubElement(info2,'score')
score2.text = '23'
tree = ET.ElementTree(root)
tree.write('test1.xml')
2. 保存XML文件
tree=ET.ElementTree(root) # root为修改后的root
tree.write(filePath)
3.读取XML文件 - 只读操作,后续无法进行操作
使用函数:
open(file_name).readlines() # 读入所有行数据
open_file = open('test1.xml')
read_file = open_file.readlines() #读入所有行
print(read_file)
4.解析XML文件 - 读取操作,读入一个xml对象,后续可以进行操作
使用场景:
(1)从文件中读取xml文档
(2)从字符串中读取xml
使用样例:
(1)从文件中读入
# 1.从文件中读取xml,并进行解析操作
import xml.etree.ElementTree as ET
file_xml = 'test1.xml'
tree = ET.parse(file_xml)
root = tree.getroot()
print(root)
# 2.从字符串中读入
sample_as_string = open(file_xml).read()
print(sample_as_string)
root = ET.fromstring(sample_as_string)
print(root)
5.获取XML中的元素
tree和root是ElementTree中两个很重要的类的对象:ElementTree和Element
(1)查看tag和属性attribute:当以解析XML文件的方式读入一个xml文件后,得到的root是一个指向Element的对象,可以通过root.tag和root.attrib来分别查看root的tag和attrib。除此之外,还可以使用Element.get(AttributeName)来代替Element.attrib[AttributeName]来访问。
(2)递归遍历下面的所有子树:Element.iter()
(3)Element.findall():找到当前元素下直接子元素中带有某个标签的元素。
(4)Element.find():找到第一个带有特定标签的子元素。
(5)Element.text:查看Element的值或是访问某个标签的内容。
(6)Element.get():访问标签的属性值
6.修改XML文件
(1)修改Element:可直接访问Element.text进行修改,也可以修改Element.Attribute,也可以新增Element.set(‘AttributeName’,‘Value’)
(2)新增孩子节点:Element.append(childElement)
(3)删除孩子节点:Element.remove(childElement)
Step 4:关于访问某个网站所经历步骤的思考
计网中TCP网络模型
- URL(统一资源定位符) = “https://coggle.club/”
协议部分https,域名coggle.club,其背后有一个对应的IP地址,因此输入URL后,浏览器要进行域名解析(IP寻址)工作。 - IP寻址过程,即DNS解析
(1)如果最近有浏览过coggle.club这个网址,本地浏览器会有DNS缓存,可以直接找到IP地址
(2)如果是首次登陆或很久没有访问过了,首先浏览器会在C盘中hosts文件中查看本地是否有存储DNS信息;若无,从路由器缓存DNS中查找;网络服务商的DNS缓存中查找;如果上述几种方式都没有找到,那么回去根域名DNS服务中查找目标URL对应的IP,根域名服务器会向下级服务器转送请求,层层下发,直到找到。 - 找到目标服务器的IP后发起请求。HTTP报文传输。
- 目标服务器接受到请求后会选择某个模型进行处理,根据业务逻辑处理并返回数据,最后视图会格式化模型返回的数据给客户端浏览器,浏览器呈现网页给用户。
- 浏览器操作:加载,解析,渲染DOM树。
任务2:HTTP协议与requests
-
HTTP请求和响应的过程
1)客户端与Web服务器建立连接
浏览器与web服务器的http端口建立TCP套接字(80端口)
2)发送http请求
通过TCP套接字,客户端向WEB服务器发送一个文本的请求报文。
3)服务器接受请求并返回响应
web服务器解析请求,定位请求资源。
4)释放TCP连接
根据connection模式,close则服务器主动关闭TCP连接,客户端被动关闭连接。
若connection模式为keepalive,则连接会保持一段时间,在此段时间内可以继续接受请求。
5)客户端解析HTML的内容
客户端浏览器首先解析状态行,查看状态码判断请求是否成功。然后解析响应头,分析后续字符集。客户端浏览器读取响应数据HTML, -
http 请求方法
1) get 方法
2)post 方法
向指定资源提交数据,请求服务器进行处理。数据被包含在请求文本中。
3)connect -
HTTP中get和post的区别
1)get提交的数据会放在url的请求行里,以?分割URL和传输数据 ,参数之间以&相连。post方法是把提交的数据放在HTTP包的请求体中。
2)get提交的数据有大小限制,而post方法提交的数据没有限制。
3)get与post请求在服务端获取请求数据方式不同。