前提:
url的组成:url只能由特定的字符组成,字母,数字和下划线,如果出现其他的,比如 $ 空格 中文则要对其进行编码。
代码示例如下:
import urllib.parse
import urllib.request
url = 'https://i.meizitu.net/2013/06/2013061932375wdkimqcyej.jpg'
# ret_url = urllib.parse.quote(url)
# urllib.request.urlretrieve(ret_url, 'chun2.jpg')
#
# print(ret_url)
data={
"name" : "嘿嘿嘿",
"sex" : "nan",
"age" : 20 ,
}
ret_url = urllib.parse.urlencode(data)
ret_url = url.__add__(ret_url)
print(ret_url)
运行结果:
获取表单数据,post请求:
步骤如下:
- 先在浏览器发送post请求。
- 使用抓包工具抓post数据。
- 在请求头的获取url,在post数据包中获取表单数据。
- 通过url,和伪造的UA生成请求对象。
- 处理表单数据,使用urllib库中的urlopen进行处理。
- 最后通过请求对象和处理完的表单数据获取响应信息。
import urllib.request
import urllib.parse
# 获取posturl的地址
post_url = 'https://fanyi.baidu.com/sug'
word = input("请输入您要查询的英文单词:")
# 构建post表单数据
from_data = {
'kw': word,
}
# 发送请求的过程
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/63.0.3239.132 Safari/537.36',
}
# 构建请求对象
request = urllib.request.Request(url=post_url, headers=headers)
# 处理表单数据
from_data = urllib.parse.urlencode(from_data)
# 发送请求
response = urllib.request.urlopen(request, data=from_data.encode())
print(response.read().decode())
伪装UA(User-Agent):
有时候仅仅伪装UA还不能躲过反爬虫机制,这时候我们需要用详细的请求头信息进行更全面的信息伪装。
以下代码就是伪装全面利用请求的信息进行伪装的例子:
import urllib.request
import urllib.parse
post_url = 'https://fanyi.baidu.com/v2transapi'
word = input("请输入您要查询的英文单词:")
from_data = {
'from': 'en',
'to': 'zh',
'query': 'wolf',
'transtype': 'realtime',
'simple_means_flag': '3',
'sign': '275695.55262',
'token': '5eb650ac4d089f39824c985a5be3eddf',
}
# headers = {
# 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
# 'AppleWebKit/537.36 (KHTML, like Gecko)'
# ' Chrome/63.0.3239.132 Safari/537.36',
# }
headers = {
'Host': 'fanyi.baidu.com',
'Connection': 'keep-alive',
# 'Content-Length': '120',
'Accept': '*/*',
'Origin': 'https://fanyi.baidu.com',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer': 'https://fanyi.baidu.com/?aldtype=16047',
# 'Accept-Encoding': 'gzip, deflate, br',
# 这是数据包可接受的压缩方式,一般情况下将其去掉不做压缩
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cookie': 'BAIDUID=68393D21286EBF4A001B4E0FCA70F07F:FG=1; PSTM=1539614412; BIDUPSID=A4E0DC66251C305F80AB5BA6B0624EA5;',
}
request = urllib.request.Request(url=post_url, headers=headers)
from_data = urllib.parse.urlencode(from_data)
response = urllib.request.urlopen(request, data=from_data.encode())
print(response.read().decode())
ajax获取get请求信息:
- 在浏览器上数页使用Url访问内容,发现其中url存在的变换规律。
- 终端获取关键信息,将信息进行编码,装到通用url后面。
- 最后利用组装好的url获得请求和响应。
import urllib.request
import urllib.parse
url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&'
pag = int(input("请输入您要看到的页数:"))
number = 20
# 构建get参数
data = {
'start': (pag - 1) * 20,
'limit': number,
}
# 将gei参数转化为query_string
query_string = urllib.parse.urlencode(data)
print(query_string)
url += query_string
# 伪装UA
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/63.0.3239.132 Safari/537.36',
}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode())
ajax获取post请求信息:
- 利用抓包工具抓取其中的关键变化信息。
- 在终端输入需要的关键信息。
- 后面和普通的post请求的操作是一样的。
import urllib.request
import urllib.parse
post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
city = input("请输入您要查询的城市:")
page = input("请输入您要查询的页数:")
size = input("请输入您要查询的个数: ")
form = {
'cname': '',
'pid': '',
'keyword': city,
'pageIndex': page,
'pageSize': size,
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/63.0.3239.132 Safari/537.36',
}
request = urllib.request.Request(post_url, headers=headers)
form = urllib.parse.urlencode(form)
response = urllib.request.urlopen(post_url, data=form.encode())
print(response.read().decode())