python脚本简单学习

urllib模块

抓取网络上的url资源。

实例一(访问网址并保存本地)

实例代码 (默认网址使用www.baidu.com)

from urllib.request import urlopen   # 在urllib.request调用urlopen
url = 'http://www.baidu.com'    # 输入网址
res = urlopen(url)     # 如游览器打开网址,并返回响应的结果
a = res.read()        # 读取响应里面的内容
print(res)
with open('a.html',mode='wb') as f:   # 打开a.html这个文件,wb表示写入二进制文件。
    f.write(res.read())     # 将响应的内容写进去

如果没有a.html就会在本地生成。打开a.html就会发现响应的内容被写进来了。

实例二(解析url)

该功能用到模块urllib.parse,实现代码

from urllib.parse import urlparse

res = urlparse('http://www.baidu.com:80/index.html?id=100')  # 对这一个url进行解析
print(type(res))     # 返回res的类型,为class
print(res.scheme)    # scheme为url的协议,在这里是http
print(res.netloc)    # netloc为域名和端口
print(res.path)      # path为路径
print(res.query)     # 查询字符串,指路径后面,id=100

看运行结果为

requests模块

作用和urllib模块差不多,但比urllib模块方便。

实例一(爬取58同城相关python的招聘信息)

示例代码

import re
import requests

# requests模块获取数据
# re模块筛选数据

url = 'https://bj.58.com/job/'

data = {                 # 写要传入的参数,一般用字典的形式
    'key':'python',      # 这样就相当于
    'final':1,           # https://bj.58.com/job/?key=python&final=1&jump=1
    'jump':1             # 哪种形式都可以
}
result = requests.get(url,params=data)   # 添加参数访问
print(result)                            # 获取响应头和状态码200
html = result.content.decode("utf-8")    # 对响应包的内容进行解码
print(html)

pat = '<span class="address">(.*?)</span>  \| <span class="name">(.*?)</span>' # 编写正则表达式,筛选我们需要的信息
what = re.findall(pat,html)        # 对响应的内容进行检索,并提取出来
print(len(what))                   # 打印我们需要信息的长度

for item in what:                  # 遍历输出
    print(item[0]+":"+item[1])

但是在实验过程中行不通,可能不让爬了吧。

例题

速度要快

f12得到提示,找响应包。

 出现了base64加密,拿去解密。

这个需要两次解码得到。密码为200878

但是直接用hackbar进行post传参出不来flag。经过尝试发现flag字段是不断变化的。

很明显了,flag字段的值一直在变化,所以我们要写一个脚本。

import requests
import base64

url = "http://114.67.175.224:13868/" # 创建一个session对象,它能够让我们跨http请求保持某些参数,爬虫和提交参数都需要
res = requests.Session()          # 使用同一个session对象,为了保持flag键值对不发生变化。
header = res.get(url).headers      # 获取响应头
str = base64.b64decode(header['flag'])  # 在响应头里找到键名为flag的键值对,并返回键值
str = str.decode()   # 注意:b64decode处理后的对象是byte类型的字符串,而split需要str类型的字符串,所以要转换一下。
str1 = base64.b64decode(str.split(":")[1])     # 第一次解码后结果为一段文字:base64编码
data = {                                       # 用split函数以:分割为两部分,取第二部分再次进行base64编码
    'margin':str1                              # 编写post数据
}
flag = res.post("http://114.67.175.224:13868/",data = data)    # 发送post数据包
print(flag.text)

秋名山老司机

同样是一个编写脚本的题目。不断刷新页面会出现提示。

 

post传递一个value参数。两秒算出这么大的数根本不可能,用爬虫将网页内容爬取出来。然后用正则表达式提取出算式,用python算,岂不妙哉。

import requests
import re   # 正则标准库

s = requests.Session()     # 创建session对象

r = s.get("http://114.67.175.224:13816/")  # 把网页爬下来
exp = re.search(r'(\d+[+\-*])+(\d+)', r.text) # 正则匹配出算式,数字在div标签里,也可以<div>(.*?)</div>匹配
value = eval(str(exp.group()))    # group()把匹配的数据整合在一起,eval函数执行一个字符串表达式,所以要用str进行转化。
data = {                          # 再用eval执行算数命令
    "value": value                # 编写post数据
}           
r = s.post("http://114.67.175.224:13816/", data = data)   # 获取响应结果
print(r.text)   # 打印

结语

这只是学习python脚本的开始,这次练习仅仅是在实操中认识到了脚本是一个什么东西。想要充分玩好脚本还得继续努力。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiLitter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值