赞
踩
经常会遇到需要向第三方发送http请求的场景,python中的requests库可以很好的满足这一要求,Requests模块是一个用于网络请求的模块,主要用来模拟浏览器发请求。其实类似的模块有很多,比如urllib,urllib2,httplib,httplib2,他们基本都提供相似的功能。但是这些模块都复杂而且差不多过时了,requests模块简单强大高效,使得其在众多网络请求模块中脱引而出。
1、文档
官方文档
https://docs.python.org/zh-cn/3.7/
https://requests.readthedocs.io/en/latest/
快速上手
https://requests.readthedocs.io/en/latest/user/quickstart/
https://blog.csdn.net/thmail/article/details/74330626?ops_request_misc=&request_id=&biz_id=102&utm_term=requests%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B%E6%96%87%E6%A1%A3&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-74330626.142^v73^control,201^v4^add_ask,239^v2^insert_chatgpt&spm=1018.2226.3001.4187
2、安装
sudo pip3 install requests
安装结果
3、1个类型和6个属性
代码如下(示例):requests_基本使用.py
# _*_ coding : utf-8 _*_ # @Time : 2023/2/27 1:25 PM # @Author : yanhh # @File : requests_基本使用 # @Project : pythonProject import requests url = 'http://www.baidu.com' response = requests.get(url=url) # 一个类型和六个属性 # 一个类型Response # <class 'requests.models.Response'> # print(type(response)) # 六个属性 # 0、设置响应的编码格式 response.encoding = 'utf-8' # 1、以字符串的形式来返回了网页的源码 # print(response.text) # 2、获取请求的url:http://www.baidu.com/ # print(response.url) # 3、响应的字节类型 b'<!DOCTYPE html>\r... # print(response.content) # 4、返回响应状态码 200 # print(response.status_code) # 5、返回响应头 {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Mon, 27 Feb 2023 07:35:11 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:29 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'} print(response.headers)
代码如下(示例):request_get请求.py
# _*_ coding : utf-8 _*_ # @Time : 2023/2/27 3:39 PM # @Author : yanhh # @File : request_get请求 # @Project : pythonProject import requests url = 'https://www.baidu.com/s' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' } data = { 'wd': '北京' } # url 请求资源路径 # params参数 # kwargs字典 response = requests.get(url=url, params=data, headers=headers) content = response.text print(content) # 总结 # 1、参数使用params传递 # 2、参数无需urlencode编码 # 3、不需要请求对象的定制 # 4、请求路径中的?可以不加
代码如下(示例):requests_post请求.py
# _*_ coding : utf-8 _*_ # @Time : 2023/2/27 3:57 PM # @Author : yanhh # @File : requests_post请求 # @Project : pythonProject # 爬取百度翻译 import requests url = 'https://fanyi.baidu.com/sug' data = { 'kw': 'eye' } headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' } # url 请求地址 # data请求参数 # kwargs 字典 response = requests.post(url=url, data=data, headers=headers) content = response.text import json obj = json.loads(content, encoding='utf-8') print(obj) # 总结 # 1、post请求,不需要编解码 # 2、post的请求参数是data # 3、不需要请求对象的定制
结果
代码如下(示例):requests_代理.py
# _*_ coding : utf-8 _*_ # @Time : 2023/2/27 4:27 PM # @Author : yanhh # @File : requests_代理 # @Project : pythonProject import requests url = 'http://www.baidu.com/s?' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' } data = { 'wd': 'ip' } # 代理 proxy = { 'http': '60.211.218.78:53281' } response = requests.get(url=url, params=data, headers=headers, proxies=proxy) content = response.text # 内容写入 agent.html with open('agent.html', 'w', encoding='utf-8') as fp: fp.write(content)
https://www.kuaidaili.com/free/intr/
# 通过登陆 然后进入到主页面 # 通过找登陆接口我们发现 登陆的时候需要的参数很多 # _VIEWSTATE: /m1O5dxmOo7f1qlmvtnyNyhhaUrWNVTs3TMKIsm1lvpIgs0WWWUCQHl5iMrvLlwnsqLUN6Wh1aNpitc4WnOt0So3k6UYdFyqCPI6jWSvC8yBA1Q39I7uuR4NjGo= # __VIEWSTATEGENERATOR: C93BE1AE # from: http://so.gushiwen.cn/user/collect.aspx # email: xxxx@qq.com # pwd: xxxx # code: PId7 # denglu: 登录 # 我们观察到_VIEWSTATE __VIEWSTATEGENERATOR code是一个可以变化的量 # 难点:(1)_VIEWSTATE __VIEWSTATEGENERATOR 一般情况看不到的数据 都是在页面的源码中 # 我们观察到这两个数据在页面的源码中 所以我们需要获取页面的源码 然后进行解析就可以获取了 # (2)验证码 import requests # 这是登陆页面的url地址 url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36' } # 获取页面的源码 response = requests.get(url = url,headers = headers) content = response.text # 解析页面源码 然后获取_VIEWSTATE __VIEWSTATEGENERATOR from bs4 import BeautifulSoup soup = BeautifulSoup(content,'lxml') # 获取_VIEWSTATE viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value') # 获取__VIEWSTATEGENERATOR viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value') # 获取验证码图片 code = soup.select('#imgCode')[0].attrs.get('src') code_url = 'https://so.gushiwen.cn' + code # 有坑 # import urllib.request # urllib.request.urlretrieve(url=code_url,filename='code.jpg') # requests里面有一个方法 session() 通过session的返回值 就能使用请求变成一个对象 session = requests.session() # 验证码的url的内容 response_code = session.get(code_url) # 注意此时要使用二进制数据 因为我们要使用的是图片的下载 content_code = response_code.content # wb的模式就是将二进制数据写入到文件 with open('code.jpg','wb')as fp: fp.write(content_code) # 获取了验证码的图片之后 下载到本地 然后观察验证码 观察之后 然后在控制台输入这个验证码 就可以将这个值给 # code的参数 就可以登陆 code_name = input('请输入你的验证码') # 点击登陆 url_post = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx' data_post = { '__VIEWSTATE': viewstate, '__VIEWSTATEGENERATOR': viewstategenerator, 'from': 'http://so.gushiwen.cn/user/collect.aspx', 'email': '595165358@qq.com', 'pwd': 'action', 'code': code_name, 'denglu': '登录', } response_post = session.post(url = url, headers = headers, data = data_post) content_post = response_post.text with open('gushiwen.html','w',encoding= ' utf-8')as fp: fp.write(content_post) # 难点 # (1) 隐藏域 # (2) 验证码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。