Python爬虫之路(7) |
您所在的位置:网站首页 › 爬虫sign参数 › Python爬虫之路(7) |
requests库的使用以及三种请求参数
一、前言
在前面的文章当中,我们已经讲解了两个案例,这篇文章我将从requests库的使用以及三种请求参数进行一些知识上的补充。 二、requests基本用法requests 库是一个优秀的 Python 第三方库,它简化了 HTTP 请求的发送过程,并提供了丰富的功能。下面让我们详细看看它的用法: import requests url = "https://www.baidu.com/" params={ 'tn': '68018901_16_pg', } _headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0' } resp = requests.get(url,headers=_headers,params=params,timeout=10)参数解析: url:要抓取的 url 地址。headers:用于包装请求头信息(一般情况下推荐全部写入)。params:请求时携带的查询字符串参数。(下文讲解)timeout:超时时间,超过时间会抛出异常。可以是一个浮点数,表示总体超时时间。也可以传递一个元组,第一个值表示连接超时,第二个值表示读取超时。例如 timeout=(5.0, 30.0) 表示连接超时 5 秒,读取超时 30 秒。请求头就是发送请求时,携带的信息 print("这是resp: ",resp) print("这是resp.status_code: ",resp.status_code) print("这是resp.encoding: ",resp.encoding) print("\n\n这是resp.text: ",resp.text) print("\n\n这是resp.content: ",resp.content)print("这是resp: ", resp) 这行代码输出了整个 resp 对象,它是 requests.Response 类的一个实例,包含了请求的所有相关信息。print("这是resp.status_code: ", resp.status_code) resp.status_code 是一个整数,表示 HTTP 请求的状态码。常见的状态码有: 200: 请求成功404: 页面不存在500: 服务器内部错误print("这是resp.encoding: ", resp.encoding) resp.encoding 表示响应内容的编码格式,通常会根据响应头自动检测。你也可以手动设置 resp.encoding 为正确的编码格式,以便正确解码响应内容。一般在页面源代码中,会标注charset=utf-8"表示内容的编码格式,有时候可以是gbk,这个时候用 resp.encoding='utf-8',修改一下就可以正常展示内容。print("\n\n这是resp.text: ", resp.text) resp.text 以字符串的形式返回响应的文本内容。这对于大多数 Web 页面和 API 响应非常有用。print("\n\n这是resp.content: ", resp.content) resp.content 以字节的形式返回响应的二进制内容。这对于处理非文本数据(如图片、视频等)很有用。上面没有提到的一些有用的属性和方法: resp.headers: 以字典形式返回响应头。resp.json(): 如果响应的内容是 JSON 格式,可以使用这个方法直接解析为 Python 对象。resp.cookies: 以 RequestsCookieJar 对象的形式返回响应的 cookies。resp.url: 返回最终的 URL 地址,可能与原始请求的 URL 不同(比如发生了重定向)。resp.history: 返回请求历史,如果有重定向的话。请求头: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } response = requests.get('https://www.example.com', headers=headers)文件上传: files = {'file': open('example.jpg', 'rb')} response = requests.post('https://www.example.com/upload', files=files)Cookie 管理: cookie是网站对你进行身份校验的一个字段,当你访问一些必须登录的页面时,他就不可忽略。 # 发送请求并保存 Cookies response = requests.get('https://www.example.com') cookies = response.cookies # 使用 Cookies 发送后续请求 response = requests.get('https://www.example.com/protected', cookies=cookies)会话管理: 有些URL需要进行身份校验,而session就可以实现登录功能,但是我更推荐的方式是将登录之后的cookie加入到请求头中。 session = requests.Session() session.auth = ('username', 'password') response = session.get('https://www.example.com/protected')异常处理: try: response = requests.get('https://www.example.com', timeout=5) except requests.exceptions.Timeout: print('Request timed out') except requests.exceptions.RequestException as e: print(f'An error occurred: {e}')post请求在上篇文章详细讲过,不在赘述。下面给出一个示例。 import requests #百度翻译 url = 'https://fanyi.baidu.com' #post请求体携带的参数,可通过开发者调试工具查看 #查看步骤:NetWork选项->Headers选项->Form Data data = {'from': 'zh', 'to': 'en', 'query': '你好' } response = requests.post(url, data=data) print(response) 三、请求参数requests 库支持三种类型的请求参数 URL 参数: url参数往往会拼接到url地址后面,在 ? 后面的参数就属于url参数。一般情况下Get请求需要参数的话,大部分都是采用的url参数。 例如百度搜索的界面: 此时的url如上图所示。同时也可以看到请求方式为get请求。 在负载中,我们也可以查看这些url参数信息信息 从上面的字段中,我们不难发现,wd就是我们搜索时候的输入值。 那么如何请求呢,下面就是一个示例。 方法1:直接使用完整的url请求 import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0', } url = 'http://www.baidu.com/s?wd=G.E.M.%E9%82%93%E7%B4%AB%E6%A3%8B&rsv_spt=1&rsv_iqid=0xe5d6b2cc00001bc2&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=68018901_16_pg&rsv_enter=1&rsv_dl=tb&oq=G%2526gt%253BM&rsv_btype=t&inputT=3373&rsv_t=eee1C7sFt%2BmVRpzKgxMwjkisut2upt%2B4YyoV7I2WYhBXX1ZbRnpJ01O5MkUrvCh3yq31b%2FM&rsv_sug3=14&rsv_sug1=9&rsv_sug7=100&rsv_pq=e6cbae7a0014dda1&rsv_sug2=0&rsv_sug4=4450' response = requests.get(url,headers=headers) response.encoding = 'utf-8' print(response.text)方法二:将 URL中?后面的参数拆出来请求 import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0', } params = { 'wd': 'G.E.M.邓紫棋', } response = requests.get(url='http://www.baidu.com/s',params=params,headers=headers) response.encoding = 'utf-8' print(response.text)上文两种方法都可以正常请求。 ps:这里请注意,百度的url是https请求的时候会返回百度验证,这点将URL中的https改为http就可以正常使用了。 表单参数: 在上文Python爬虫之路(6)-- x京新发地获取菜价波动(Post请求) - 掘金 (juejin.cn)具体将结果如何使用,大家可以去参考一下。下面给出一个简单的示例。 data = {'username': 'admin', 'password': 'password'} response = requests.post('https://www.example.com/login', data=data)JSON 参数: json参数大部分我们会使用上面的表单参数形式进行传递。 json_data = {'key1': 'value1', 'key2': 'value2'} response = requests.post('https://www.example.com/api/create', json=json_data)以上就是 requests 库的基本用法和常见场景。三种主要的请求参数类型分别是: URL 参数: 用于在 URL 中传递参数。在后端中也称为Query参数。表单参数: 用于在 POST 请求的请求体中传递参数。JSON 参数: 用于在 POST 请求的请求体中传递 JSON 格式的数据。其他参数:形如http://xxx.com/blog/17的URL格式,那串数字( 17 )往往是一个Path参数,也成为Param参数。 四、结语根据具体的需求,您可以选择合适的参数类型来发送请求。requests 库提供了非常灵活和强大的功能,可以帮助您轻松地完成各种 HTTP 请求操作。 有任何问题欢迎大家的评论和指正。再次声明,本专栏只做技术探讨,严谨商用,恶意攻击等。这是我的 GitHub 主页:Rosyrain (github.com) https://github.com/rosyrain,里面有一些我学习时候的笔记或者代码。本专栏的文档和源码存到spider-course的仓库下。 欢迎大家Follow/Star/Fork三连。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |