七层 | 功能 | |
---|---|---|
应用层 | 7 | 提供应用程序间通信 |
表示层 | 6 | 处理数据格式、数据加密等 |
会话层 | 5 | 建立、维护和管理会话 |
传输层 | 4 | 建立主机端到端连接 |
网络层 | 3 | 寻址和路由选择 |
数据链路层 | 2 | 提供介质访问、链路管理等 |
物理层 | 1 | 比特流传输 |
TCP/IP协议栈 | |
---|---|
应用层 | 提供应该程序网络接口 |
传输层 | 建立端到端连接 |
网络层 | 寻址和路由选择 |
数据链路层 | 物理介质访问 |
物理层 | 二进制数据流传输 |
HTTP (HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议,它是基于TCP的应用层协议
客户端和服务端进行通信的一种规则,它的模式非常简单,就是客户端发起请求,服务端响应请求
谷歌浏览器开发者工具 preserve log
在我们开发页面时,点击按钮触发了某个接口并跳转了页面,这时Network中的信息会刷新,不做保留,这个时候我们只需要勾选上谷歌开发者工具的preserve log,就可以保留上一个页面接口调用信息,从而方便我们查看。
GET 从服务器获取指定(请求地址)的资源的信息,它通常只用于读取数据,就像数据库查询一样,不会对资源进行修改。
POST 向指定资源提交数据(比如提交表单,上传文件),请求服务器进行处理。数据被包含在请求正文中,这个请求可能会创建新的资源或更新现有的资源。
PUT 通过指定资源的唯一标识(在服务器上的具体存放位置),请求服务器创建或更新资源。
DELETE 请求服务器删除指定资源。
HEAD 与GET方法类似,从服务器获取资源信息,和GET方法不同的是,HEAD不含有呈现数据,仅仅是HTTP头信息。HEAD 的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获得资源的元信息(或元数据)。
OPTIONS 该方法可使服务器传回资源所支持的所有HTTP请求方法。
1XX 消息–请求已被服务接收,继续处理
2XX 成功–请求已成功被服务器接收、理解、并接受
3XX 重定向–需要后续操作才能完成这一请求
4XX 请求错误–请求含有词法错误或者无法被执行
5XX 服务器错误–服务器在处理某个正确请求时发生错误
列举请求头中常见的字段?
当客户端向Web服务器请求一个资源的时候使用;它被用来访问静态资源,比如HTML文档和图片等
本机ip地址查询:http://httpbin.org/ip
通过requests.get(url, headers=None, params=None)
方法可以发送GET请求,其中url为请求地址,headers为请求头部,params为请求参数。
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
response = requests.get('http://www.example.com', headers=headers)
print(response.text)
# content参数返回HTTP响应的二进制数据源,形式为bytes。
# status_code参数返回HTTP响应的状态码,形式为整数。
import requests
#构造的URL的数据,一定要和Post请求做好区分
data = {'key1':'value1','key2':'value2'}
#使用的是GET请求的方法,params关键字一定要做好区分
response = requests.get('http://httpbin.org/get',params=data)
#查看了是哪个URL给我们返回的数据
print(response.url)
#查看返回头,注意,是headers不是header
print(response.headers)
#查看返回体
print(response.text)
cookies
import requests
url = 'https://www.baidu.com'
#定制请求头,使用了一个标准的浏览器的UA
header = {
'user-agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3610.2 Safari/537.36'
}
response = requests.get(url=url,headers=header)
print(response.headers)
#cookie是一个对象RequestsCookieJar,行为和字典类似
print(response.cookies)
print(response.cookies['BIDUPSID'])
IP池和隧道代理的区别
proxy = {
# http://用户名:密码@代理的接口信息
"http": "http://uesrname:password@代理地址:端口",
"https": "http://uesrname:password@代理地址:端口"
}
cookie和session的区别?
当客户端向Web服务器请求一个资源的一些信息而不是资源的全部信息的时候使用;主要用于确认URL的有效性以及资源更新的日期时间等
当客户端向服务端发送信息或者数据的时候使用;表单提交(向Web服务器发送大量的复杂的数据)
requests.post(url, data=None, json=None, headers=None, timeout=None)
当客户端向Web服务端指定URL发送一个替换的文档或者上传一个新文档的时侯使用
当客户端尝试从Web服务端删除一个由请求URL唯一标识的文档的时候使用
当客户端要求可用的代理服务器或者中间服务更改请求来宣布自己的时候使用
当客户端想要决定其他可用的方法来检索或者处理Web服务端的一个文档时使用
当客户端想要确定一个明确的连接到远程主机的时候使用,通常便于通过Http代理服务器进行SSL加密通信( Https )连接使用
session
import requests
#在requests模块中有session方法
# 为什么没有携带请求头
# 不需要提供定制化的请求头,直接使用python默认的请求头就可以
# 需要提供请求的数据
login_data = {
"email": "[email protected]",
"password": "abcd1234"
}
# 实例化session方法,用于自动化的记录session信息
session = requests.session()
# 发送了一个POST请求,并且提供了login_data数据
# login_response = requests.post(url="http://yushu.talelin.com/login", data=login_data)
# 1.需要把原来的requests替换为实例化好的session
login_response = session.post(url="http://yushu.talelin.com/login", data=login_data)
# print(login_response.text)
# 登录之后,请求个人信息页的时候是失败的
# 可以在请求头中提供cookies就可以访问个人信息页面了
# personal_response = requests.get(url="http://yushu.talelin.com/personal")
# 自动化的带上session,个人的登录凭据信息
personal_response = session.get(url="http://yushu.talelin.com/personal")
print(personal_response.text)
所有Requests显式抛出的异常都继承自requests.exceptions.RequestException。
IP代理有哪些分类,区别是什么?
当请求频率较高时,可能会出现请求失败响应码为429的情况。这是由于目标网站的反爬虫模块对请求频率进行了限制。常见的应对措施包括:
总的来说,爬虫程序要注意遵守网站的规定,遵守一定的爬虫道德准则,避免对网站造成过大的负担。此外,也要避免过度使用爬虫,以免被封禁或被针对。
参考:https://requests.readthedocs.io/en/latest/
Python正则表达式(re模块)
import requests
import re
# 请求图书列表页的链接
# 获取每一条图书信息
# 格式化每一条图书信息
def handle_detail_re(content):
"""
处理列表页返回数据
:param content: response.text
:return: print
"""
# 图书条目正则表达式,re.S可以进行全文匹配
item_search = re.compile('description-font">.*?
Beautiful Soup 是 Python 用于解析 HTML 和 XML 文件的第三方库,可以从 HTML 和 XML 文件中提取数据。
基本元素 | 说明 |
---|---|
Tag | 标签,基本信息组织单元,分别用<>和>标明开头和结尾 |
Name | 标签的名字,p> 的名字是‘p’,格式: .name |
Attributes | 标签的属性,字典形式组织,格式: .attrs |
NavigableString | 标签内非属性字符串,<>…<>中字符串,格式: .string |
Commeent | 标签内字符串的注释部分,一种特殊的 Comment类型 |
# 安装的是beautifulsoup4,但是导包的时候,是通过bs4来导入的,并且导入的是大写的BeautifulSoup
from bs4 import BeautifulSoup
html = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
# lxml提前安装好,pip install lxml,第一个参数是html代码段,第二个参数是解析器
soup = BeautifulSoup(html, 'lxml')
# 查看经过bs4实例化,初始化的代码段
print(soup.prettify())
# 获取到的是数据结构,tag,tag有很多方法,如string
print(type(soup.title))
# 来查看文档中title的属性值
print(soup.title.string)
print(soup.head)
# 当有多个节点的时候,我们当前的这种选择模式,只能匹配到第一个节点,其他节点会被忽略
print(soup.p)
# 获取节点的名称
print(soup.title.name)
# attrs会返回标签的所有属性值,返回的是一个字典
print(soup.p.attrs)
print(soup.p.attrs['name'])
# 返回的节点属性,可能是列表,也可能是字符串,需要进行实际的判断
print(soup.p['name'])
print(soup.p['class'])
### 输出
<html>
<head>
<title>
The Dormouse's story
</title>
</head>
<body>
<p class="title" name="dromouse">
<b>
The Dormouse's story
</b>
</p>
<p class="story">
Once upon a time there were three little sisters; and their names were
<a class="sister" href="http://example.com/elsie" id="link1">
<!-- Elsie -->
</a>
,
<a class="sister" href="http://example.com/lacie" id="link2">
Lacie
</a>
and
<a class="sister" href="http://example.com/tillie" id="link3">
Tillie
</a>
;
and they lived at the bottom of a well.
</p>
<p class="story">
...
</p>
</body>
</html>
<class 'bs4.element.Tag'>
The Dormouse's story
<head><title>The Dormouse's story</title></head>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
title
{'class': ['title'], 'name': 'dromouse'}
dromouse
dromouse
['title']
(注:节点之间的换行符或其他文本会被当成文本节点处理,是bs4.element.NavigableString类的实例,而普通节点是bs4.element.Tag类的实例)
根据节点名、属性、文本内容等选择所有符合要求的节点,该方法属于Tag对象,又由于BeautifulSoup是Tag的子类,所以find_all方法在BeautifulSoup对象上也可以调用(find_all方法以当前Tag对象对应的节点作为根开始继续选取节点,嵌套查询)。
def find_all(self, name=None, attrs= {}, recursive= True, text= None, limit= None, **kwargs):
用于查询满足条件的第一个节点,返回的是bs4.element.Tag对象
#通过属性来进行查询
#通过text文本来获取匹配的文本
import re
from bs4 import BeautifulSoup
html='''
Hello
- Foo
- Bar
- Jay
- Foo2
- Bar2
- Jay2
- Foo
- Bar
'''
soup = BeautifulSoup(html,'lxml')
#attrs,传入的是属性参数,类型是字典,attrs={"id":"list-1"}
# print(soup.find_all(attrs={"id":"list-1"}))
# print(soup.find_all(attrs={"name":"elements"}))
#也可以直接传入ID这个参数
# print(soup.find_all(id="list-1"))
#class在Python中是一个关键字,find_all方法里面要用class的时候,后面加上一个下划线
# print(soup.find_all(class_="list"))
#可以通过text参数来获取文本的值,可以传递正则表达式,返回是一个列表
# print(soup.find_all(text=re.compile("Foo\d")))
#find方法,返回的是一个单个的元素,第一个匹配的元素,而find_all返回的是所有值的列表
# print(soup.find(name="ul"))
"""
find_parents 和 find_parent:前者返回所有祖先节点,后者返回直接父节点。
find_next_siblings 和 find_next_sibling:前者返回后面所有的兄弟节点,后者返回后面第一个兄弟节点。
find_previous_siblings 和 find_previous_sibling:前者返回前面所有的兄弟节点,后者返回前面第一个兄弟节点。
find_all_next 和 find_next:前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点。
find_all_previous 和 find_previous:前者返回节点前所有符合条件的节点,后者返回第一个符合条件的节点。
"""
使用CSS选择器需要使用Tag对象的select方法,该方法接收一个字符串类型的CSS选择器,选择器如:
嵌套选择节点:可以将节点选择器、方法选择器和CSS选择器混合使用
获取属性值与文本:select方法返回Tag对象的集合,可以用Tag对象的方式获取节点属性值和文本内容,获取属性值可以使用attrs,也可以直接使用[…]方式引用节点的属性,获取节点的文本内容可以使用get_text方法,也可以使用string属性。
#使用css选择器,只需要呢,调用select方法,传入css选择器即可
from bs4 import BeautifulSoup
html='''
Hello
- Foo
- Bar
- Jay
- Foo
- Bar
'''
soup = BeautifulSoup(html,'lxml')
#需要调用select方法,传入css选择器
# print(soup.select(".panel .panel-heading"))
#获取ul标签下所有Li标签
# print(soup.select("ul li"))
#获取id为list-2,class为element两个Li标签
# print(type(soup.select("#list-2 .element")[0]))
#支持嵌套选择
#先获取到ul标签,tag类型,for 调用select方法在次传入css选择器
for ul in soup.select("ul"):
for li in ul.select("li"):
#调用tag类型里面的方法,string方法来获取文本内容
# print(li.string)
print(li['class'])
#支持使用属性获取元素
# for ul in soup.select("ul"):
# print(ul['id'])
#建议大家使用find find_all查询匹配单个结果或多个结果
#css选择器非常的熟悉,那么就可以使用css选择器
参考:https://beautifulsoup.cn/
Python读写xml(xml,lxml)
#导入lxml库,etree
from lxml import etree
#准备的html数据,不完整,html,body,li不完整
html_data = '''
'''
#使用etree.HTML
html = etree.HTML(html_data)
#etree.tostring,decode()
#
#
# print(etree.tostring(html).decode())
#返回_Element,就是整个xml树的根节点
# print(type(html))
#使用的是双斜杠,返回是一个列表,每一个元素都是element类型,列表里面的每一个element类型的元素就
#代表我们获取到的标签元素
# result = html.xpath("//li/a/text()")
#获取li标签下面所有的class属性值
# result = html.xpath("//li/@class")
#获取的li标签href值为link1.html这个a标签,使用了单引号,如果外面使用的是
#双引号,内部一定要使用单引号,大家一定要注意
# result = html.xpath("//li/a[@href='link1.html']/text()")
#我们需要获取span标签,一定要注意span他是a标签的子元素,而不是li标签的子元素,使用双斜杠
# result = html.xpath("//li//span")
#我们使用了last()函数,最后一个标签,-1代表倒数第二个标签
result = html.xpath("//li[last()]/a/@href")
print(result)
批量下载图片
import os
import requests
from bs4 import BeautifulSoup
def download_images(url, headers):
"""
:param url:
:param headers:
:return:
"""
# 发送HTTP请求并获取网页内容
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 图片保存路径
for title in soup.find_all('title'):
title = title.contents[0].split(')')[0]
save_folder = os.path.join(".\images", title)
if not os.path.exists(save_folder):
os.makedirs(save_folder)
# 获取所有图片的标签
img_tags = soup.find_all('img')
# 遍历图片标签并下载图片
for img_tag in img_tags:
try:
img_url = img_tag['src']
# 如果图片URL是相对路径,则拼接完整URL
# if img_url.startswith('/'):
# img_url = url + img_url
# 发送HTTP请求并保存图片
img_response = requests.get(img_url)
img_data = img_response.content
# 提取图片文件名
img_filename = img_url.split('/')[-1]
# 拼接保存路径
save_path = os.path.join(save_folder, img_filename)
# 保存图片
with open(save_path, 'wb') as img_file:
img_file.write(img_data)
print(f"已保存图片: {save_path}")
except Exception as error:
print(error)
continue
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/69.0.3497.100 Safari/537.36'}
for i in range(1843443, 1843445, 1):
# 替换为目标网站的URL
url = 'https://dxs.moe.gov.cn/zx/a/hd_sxjm_sxjmlw_2022qgdxssxjmjslwzs_2022ctlw/230613/{}.shtml?source=hd_sxjm_sxjmlw_2022qgdxssxjmjslwzs'.format(
i)
# 调用函数进行图片下载
download_images(url, headers)
for i in range(1820271, 1820297, 2):
# 替换为目标网站的URL
url = 'https://dxs.moe.gov.cn/zx/a/hd_sxjm_sxjmlw_2022qgdxssxjmjslwzs/221106/{}.shtml?source=hd_sxjm_sxjmlw_2022qgdxssxjmjslwzs'.format(
i)
# 调用函数进行图片下载
download_images(url, headers)