前言:
GET 和 POST
目录:
GET请求:抓取百度搜索标题
使用 Urllib 库来模拟浏览器发送GET请求,
这跟 request 模块差不多,
同时用一个例子来学习它。
我们来抓取百度搜索的标题
假设我们搜索 Python
那么在 url 上应该是这样的格式 https://www.baidu.com/s?wd=python
s?wd=
后面跟要搜索的内容
首先模拟 HTTP 请求
import urllib.request
keyword = "python"
url = "https://www.baidu.com/s?wd="+keyword
data = urllib.request.urlopen(url).read().decode("utf-8")
print(data) # 打印内容
这样一个简单的 GET 请求就完成了
接下来就是抓取搜索标题,
也就是这个东西,
我们查看源代码看看有什么规律,然后写正则
搜索 Welcome to Python.org
发现他在 title 里面
查看其他的标题,还是在这个标签里面
那么我们就可以根据这个规律写正则表达式了
import urllib.request
import re
keyword = "python"
url = 'https://www.baidu.com/s?wd='+keyword
data = urllib.request.urlopen(url).read().decode("utf-8")
path = '"title":"(.*?)",' # 正则表达式,括号里面就是要提取的内容
resut = re.compile(path).findall(data)
print(resut)
运行后发现,
抓是抓到了,但是为啥有 Unicode 编码的字符
经过分析,这个编码其实是 广告 标题来的,
接下来我们就要把广告去掉
只要判断是 Unicode 编码的字符串就 pass
import urllib.request
import re
keyword = "python"
url = "https://www.baidu.com/s?wd="+python
data = urllib.request.urlopen(url).read().decode("utf-8")
path = '"title":"(.*?)",'
resut = re.compile(path).findall(data)
for i in resut:
if (i >= u'\u0041' and i <=u'\u005a') or (i >= u'\u0061' and i<=u'\u007a'): # 判断是否Unicode编码
print(i)
else:
pass
运行后就成功提取到正确的内容
这只是提取了一页的内容,
如果要提取多页呢,那还得找规律
发现,当 pn=0
时,就是第一页,
当 pn=10
时,就是第二页
依次加10,那么这个就应该是 (a-1)*10
如果我们要获取5页的内容,那么就应该是 range(1,7)
, 因为 a-1
上代码
import urllib.request
import re
keyword = "python"
for a in range(1,7):
url = "https://www.baidu.com/s?wd="+keyword+"&pn={}".format((a-1)*10)
data = urllib.request.urlopen(url).read().decode("utf-8")
path = '"title":"(.*?)",'
resut = re.compile(path).findall(data)
for i in resut:
if (i >= u'\u0041' and i <=u'\u005a') or (i >= u'\u0061' and i<=u'\u007a'):
print(url+' ----> '+i)
else:
pass
这样我们就成功提取到多页的内容了
POST请求:模拟登录
模拟登录将使用 VAuditDemo 漏洞平台进行演示
虚拟域名为:http://www.vd.com/
POST请求使用 urllib.parse 这个模块
这个也跟 request 差不多,只不过模块不同而已
首先抓个包,然后查看POST参数有那些,还有请求地址
然后就可以开始写脚本了
代码:
import urllib.request
import urllib.parse
url = 'http://www.vd.com/user/logCheck.php'
data = urllib.parse.urlencode({
"user":"admin",
"pass":"123456",
"submit":"login"
}).encode("utf-8")
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"
}
# 进行POST请求,就需要使用 urllib.request 下面的 Request(地址,数据)
req = urllib.request.Request(url,headers=headers,data=data)
resut = urllib.request.urlopen(req).read().decode("utf-8")
print(resut)
这样就可以了,
记住语法就行了。
总结:
模拟请求就先到这里吧,