Python Requests 基本使用及Requests与 urllib 区别
一、简介
Python 内置了 requests 模块,该模块主要用来发送 HTTP 请求,requests 模块比urllib 模块更简洁。
Requests 官方文档、Requests 中文文档
安装
$ pip install requests
附:urllib 入门使用(步骤详细) 用于对比区别。
二、基本使用
# 导入 import requests # 请求地址 url = "https://www.baidu.com" # 获取服务器响应数据 response = requests.get(url=url) # 1 个类型和 6 个属性 # 1、响应数据类型(urllib 的响应数据类型是 http.client.HTTPResponse) print(type(response)) # requests.models.Response # 2、设置响应的编码格式 response.encoding = 'utf-8' # 3、以字符串的形式返回网页的源码 print(response.text) # 4、返回 url 地址 print(response.url) # 5、返回二进制的数据(text 的二进制数据,urllib 的 response.read() 就是二进制数据) print(response.content) # 6、返回响应的状态码 print(response.status_code) # 7、返回响应头信息 print(response.headers)
三、GET 请求与 urllib 区别
# 导入 import requests # 请求地址 # url = "https://www.baidu.com/s?" url = "https://www.baidu.com/s" # 请求头 headers = { 'Accept': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01', # 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Cookie': '填自己的 Cookie,没有会拿不到数据', 'Host': 'www.baidu.com', 'Referer': 'https://www.baidu.com/s?wd=%E5%8C%97%E4%BA%AC&rsv_spt=1&rsv_iqid=0xc4323e2d0000fc1a&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&rsv_dl=tb&oq=%25E5%258C%2597%25E4%25BA%25AC&rsv_btype=t&rsv_t=009fICC65EzpN%2BM16VRnKfYWv8Pm6F%2BO1r55ft99%2BL0OlRVHYYfi5cpRa1wOl%2Bhe0bQO&rsv_pq=f70437990000a294&prefixsug=%25E5%258C%2597%25E4%25BA%25AC&rsp=0', 'sec-ch-ua': '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest' } # 参数 data = { 'wd': '北京' } # 获取服务器响应数据【def get(url, params=None, **kwargs)】 # url: 请求地址 # params: 参数 # kwargs: 字典 response = requests.get(url=url, params=data, headers=headers) # 设置响应数据编码格式 response.encoding = 'utf-8' # 获取页面内容 print(response.text) # 总结: # 1、参数使用 params 传递 # 2、无需像 urllib 使用 urllib.parse.urlencode() 编码,可以直接传入 # 3、不需要请求对象的定制 # 4、请求资源路径中的 ?可以加也可以不加 # url = "https://www.baidu.com/s?" # url = "https://www.baidu.com/s"
四、POST 请求与 urllib 区别
# 导入 import requests # 请求地址 url = "https://fanyi.baidu.com/sug" # 请求头 headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Content-Length': '21', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Cookie': '填自己的 Cookie,没有会拿不到数据', 'Host': 'fanyi.baidu.com', 'Origin': 'https://fanyi.baidu.com', 'Referer': 'https://fanyi.baidu.com/', 'sec-ch-ua': '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest' } # 参数 data = { 'kw': '眼睛' } # 获取服务器响应数据【def post(url, data=None, json=None, **kwargs)】 # url: 请求地址 # data: 参数 # kwargs: 字典 response = requests.post(url=url, data=data, headers=headers) # 设置响应数据编码格式 response.encoding = 'utf-8' # 获取页面内容 print(response.text) # 总结: # 1、post 请求不需要编解码(urllib.parse.urlencode(params).encode('utf-8')) # 2、post 请求的参数是 data,get 请求参数是 params # 3、不需要请求对象的定制
五、IP代理
# 导入 import requests # 请求地址 # url = "https://www.baidu.com/s?" # url = "https://www.baidu.com/s" url = "http://www.baidu.com/s" # 请求头 headers = { 'Accept': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01', # 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Cookie': '填自己的 Cookie,没有会拿不到数据', 'Host': 'www.baidu.com', 'Referer': 'https://www.baidu.com/s?wd=%E5%8C%97%E4%BA%AC&rsv_spt=1&rsv_iqid=0xc4323e2d0000fc1a&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&rsv_dl=tb&oq=%25E5%258C%2597%25E4%25BA%25AC&rsv_btype=t&rsv_t=009fICC65EzpN%2BM16VRnKfYWv8Pm6F%2BO1r55ft99%2BL0OlRVHYYfi5cpRa1wOl%2Bhe0bQO&rsv_pq=f70437990000a294&prefixsug=%25E5%258C%2597%25E4%25BA%25AC&rsp=0', 'sec-ch-ua': '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest' } # 参数 data = { 'wd': 'ip' } # 代理 proxys = { # 前面的 http 协议最好跟 请求地址 的协议保持一致,有时候会出问题 # 'http': '222.74.73.202:42055' } # 获取服务器响应数据【def get(url, params=None, **kwargs)】 # url: 请求地址 # params: 参数 # kwargs: 字典 response = requests.get(url=url, params=data, headers=headers, proxies=proxys) # 设置响应数据编码格式 response.encoding = 'utf-8' # 获取页面内容 # print(response.text) # 存储到文件夹 with open('dali.html', 'w', encoding='utf-8') as f: f.write(response.text)
六、验证码案例
通过 古诗文网 作为测试
# 登录接口需要的参数: # __VIEWSTATE: ySbbXPOgH0tbN+MZqd0YtuJiFM8uIhBDD9pK/q4dqPvGLwWIbW799+Hr7aDPNHZpg27Nxe259UePM3z1Rc2X89uauZJQEkkrcyVULG09iqo38jAnG6zaq5D6a2/ZhOx7HIPakzBHk5K6JRQ2kGMtIfN0Qjs= # __VIEWSTATEGENERATOR: C93BE1AE # from: http://so.gushiwen.cn/user/collect.aspx # email: xxxx # pwd: xxxx # code: TJ83 # denglu: 登录 # 观察到 __VIEWSTATE 与 __VIEWSTATEGENERATOR 不知道如何获取? # 一般情况下,看不到的数据,都是在页面源码中,弄一个不可见的元素赋值,所有可以进入源码中,搜索试试 # 导入 import requests from lxml import etree # 请求地址 url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx' # 请求头 headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36' } # 获取页面数据 response = requests.get(url=url, headers=headers) # 然后可以在内容中搜搜 __VIEWSTATE 与 __VIEWSTATEGENERATOR,以免做了反扒 # print(response.text) # 设置响应数据编码 response.encoding = 'utf-8' # 解析服务器响应数据 tree = etree.HTML(response.text) # 获取 __VIEWSTATE 值 VIEWSTATE = tree.xpath('//input[@id="__VIEWSTATE"]/@value')[0] # 获取 __VIEWSTATEGENERATOR 值 VIEWSTATEGENERATOR = tree.xpath('//input[@id="__VIEWSTATEGENERATOR"]/@value')[0] # 获取验证码 code = tree.xpath('//img[@id="imgCode"]/@src')[0] code_url = 'https://so.gushiwen.cn' + code # 将验证码图片下载到本地,但是不能使用 urllib.request.urlretrieve() 去下载,下载就会导致切换验证码了,保存的也就变成旧的了 # 解决方法:requests 里面有个 session(),能够跨请求地保持某些参数,说白了,就是比如使用 session 成功的登录了某个网站,则再次使用该 session 对象对该网站的其他网页访问时都会默认使用该 session 之前使用的 cookie 等参数 session = requests.session() # 获取验证码内容 response_code = session.get(code_url) # 注意此时要使用二进制数据,因为要下载图片 content_code = response_code.content # 将二进制数据写入到文件(有时候会有延迟,反应没那么快,编辑器没有出现,可以直接进入文件看看) with open('code.jpg', 'wb') as f: f.write(content_code) # 识别验证码的库网上很多,搜搜
关于PythonRequests基本使用(与urllib的区别)的文章就介绍至此,更多相关PythonRequests使用内容请搜索编程宝库以前的文章,希望以后支持编程宝库!
前 言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是在处理一些复杂背景问题的时候,还是容易出现错漏检的问题。此后的系列文章,将重点对YOLOv5 ...