马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 591821661 于 2024-5-29 06:13 编辑
起因是在写爬虫的时候还在Urllib库和Requests库之间纠结。于是心血来潮抓包比较一下两个库的区别。
目前使用Urllib库的主要原因是因为它可以全局共享一个Cookie池,优点是属于原生自带的库,但是写法上要比Requests多很多繁琐的步骤。
Connection: keep-alive:保持连接打开,可以提高性能和效率,适合频繁请求的场景。
Connection: close:在每个请求后关闭连接,简化连接管理,适合单次请求的场景。
可以看到库的维护者把这个事情列成了TODO项(待做)
Accept: */* 当客户端对返回的数据类型没有特定要求时,可以使用 Accept: */*。这通常用于浏览器和一些 HTTP 客户端库的默认设置,确保客户端不会因为不支持某种特定类型而无法处理响应。
Accept-Encoding: identity 即告诉服务器希望接收未经压缩的响应数据
大多数现代浏览器和 HTTP 客户端会自动处理各种内容编码方式,并默认支持压缩编码(如 gzip, deflate 等)。因此,显式使用 Accept-Encoding: identity 的场景比较少见,通常用于调试或在特定情况下需要获取未经压缩的响应数据时。import urllib
import urllib.request
import http.cookiejar
import json
import socket
import requests
# Fiddle 抓包软件 Tool -> Fiddler Options -> Connections -> Listening port 7777
proxy = '127.0.0.1:7777'
def cake_init(cookies_filename="cookies.txt", UA='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 HBPC/11.0.6.301', proxy='127.0.0.1:7777'):
socket.setdefaulttimeout(60) # 设置60秒超时
proxy_support = urllib.request.ProxyHandler({'http':proxy,'https':proxy}) if proxy else urllib.request.ProxyHandler({})
cookiejar = http.cookiejar.MozillaCookieJar(cookies_filename) # 加载cookies内容 cookiejar.save()能够保存文件
cookie_support = urllib.request.HTTPCookieProcessor(cookiejar)
opener = urllib.request.build_opener(proxy_support,cookie_support)# urllib钢铁侠组配
opener.addheaders = [
('User-agent', UA),
('Accept', '*/*'),
# ('referer', "https://www.douyin.com/"),
# ('authority', 'www.douyin.com'),
('Accept-Encoding','gzip, deflate'), # 默认是identity即告诉服务器希望接收未经压缩的响应数据
]
urllib.request.install_opener(opener) #urllib钢铁侠开机初始化
return cookiejar
def getjson(url):
response = urllib.request.urlopen(url)
data_json = json.loads(response.read())
return data_json
def getjson_post(url,data):
req = urllib.request.Request(url)
# Post的数据类型选择
# data_coded = urllib.parse.urlencode(data).encode('utf-8')
# req.add_header('Content-Type', 'application/x-www-form-urlencoded')
# 提交Json要改变默认的Content-Type类型
data_coded = json.dumps(data).encode('utf-8')
req.add_header('Content-Type', 'application/json; charset=utf-8')
# 如果需要对单个请求进行进一步客制化 其中的urlopen()还需要生成request实例进行自定义。
response = urllib.request.urlopen(req,data_coded)
data_json = json.loads(response.read())
return data_json
def getjson_header(url,header_dict):
# header_list = [('User-agent', UA),]
req = urllib.request.Request(url)
for key in header_dict:
req.add_header(key, header_dict[key])
response = urllib.request.urlopen(req)
data_json = json.loads(response.read())
return data_json
# 初始化容器,使其能够保存Cookies,
cookiejar = cake_init(proxy=proxy)
# cookiejar.save()
ip_api_url = 'http://ip-api.com/json/?fields=61439'
data = {'a':1,'b':2}
# 对跨站检测有用,防止视频链接被其他网站直接调用,会检测视频来源
header_dict = {'Referer':'https://www.douyin.com/'}
s_get_dict = getjson(ip_api_url)
s_get_dict = getjson_post(ip_api_url,data)
s_get_dict = getjson_header(ip_api_url,header_dict)
response = requests.get(ip_api_url,proxies={'https':proxy})
response = requests.post(ip_api_url,json=data,proxies={'https':proxy})
res_json = response.json()
print('----------------------IP Information Begin--------------------------')
for key in s_get_dict:
print('%s : %s' % (key, s_get_dict[key]))
print('----------------------IP Information End--------------------------\n')
print('----------------------IP Information Begin--------------------------')
for key in res_json:
print('%s : %s' % (key, res_json[key]))
print('----------------------IP Information End--------------------------\n')
分别使用Fiddler的抓包方法
总结: Requests库更加简洁,封装的也更加全面。 |