鱼C论坛

 找回密码
 立即注册
查看: 2953|回复: 7

[技术交流] [复习笔记]---Requests网络请求基本用法

[复制链接]
发表于 2019-9-17 07:06:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Stubborn 于 2019-9-25 00:00 编辑

Requests入门前篇


Requests的请求方法不只两种,感兴趣的朋友们可以自行百度,其他的请求方法。基本在采集数据中,90%只会用到两种请求方法,即“GET”和“PSOT”


method-->GET

  1. import requests
  2. url = 'https://www.sogou.com/web?query=' + '我爱Fishc'
  3. response = requests.get(url=url)
  4. print(response.text)
复制代码

如上,我们就使用了Requests发送了一个get请求,获取到了响应。并查看了响应的内容,有些网站,你会发现,内容有乱码的情况,出现这样的情况,你需要指定编码,具体编码在html的头部信息都会有注明。
以电影天堂为例:https://www.dytt8.net,你应该指定编码为‘gb2312'
  1. response.encoding = "gb2312"
复制代码


上面非常简单的介绍了一个简单的GET请求,下面介绍另外两种情况,比如目标是二进制流,也就是图片音频,或者响应体是Json数据


1,二进制流(图片,音频,视频)

  1. with open('path.png', 'wb') as f:
  2.     f.write(response.content)
  3. #path表示保存图片的绝对路径或者相对路径,个人建议是用绝对路径,避免问题出现。
复制代码

2,JSON数据
假如目标响应体是json内容,示例:https://github.com/timeline.json
关于json的处理,可以参考字典,大致都一样,或者可以学习jsonpath

  1. print(response.json())
复制代码



method-->POST
这里主要说两种形式。json和form
1,以Form表单提交数据,Content-Type:application/x-www-form-urlencoded
  1. payload = {'key1': 'value1', 'key2': 'value2'}
  2. url = "http://httpbin.org/post"
  3. response = requests.post(url=url, data=payload)
复制代码


2,以JSON形式提交数据,Content-Type:application/json   以下二选一
  1. response = requests.post(url=url, data=json.dumps(payload))
  2. response = requests.post(url=url, json=payload)
复制代码


额外补充headers请求头
  • Accept:浏览器可接受的MIME类型。请求报头域,用于指定客户端可接受那些类型的信息。
  • Accept-Encoding:浏览器可接受的字符集,指定客户端可接受的语言类型。
  • Accept-Language:浏览器能够进行解码的数据编码方式,制动客户端可接受的内容编码      
  • Host:初始URL中的主机和端口。用于指定请求资源的主机IP和端口号,其内容为请求URL的原始服务器或网关位置
  • Cookie:这是最重要的请求头信息之一,也常用复数行书Cookies,这是网站为了辨别用户进行的会话跟踪而储存在用户本地的数据。它的主要功能就是维持当前的访问页面会话。例如你登陆鱼C网站,并记录了登陆状态,下次登陆则不需要再次登陆,服务器就是通过Cookies识别出是我们自己,并查询出当前状态是登陆状态,所以返回结果是登陆之后才         能看到的页面内容。
  • Referer:表示浏览器所访问的前一个页面,可以认为是之前访问页面的链接将浏览器带到了当前页面。此内容用于标识这个请求是从哪个页面发过来的,服务器可以拿到这以信息 并做相应的处理,如做来源统计,防盗链处理等
  • User-Agent:浏览器的身份标识字符串
  • Content-Type:请求体的MIME类型或者叫互联网媒体类型(用于POST和PUT请求中),在HTTP协议消息头中,它用来标识具体请求中的媒体类型信息,如,text/html代表HTML格式,image/gif代表GIF图片,application/json代表JSON类型,更多对应参考一下链接:“http://tool.oschina.net/commons"

因此,请求头是请求的重要组成部分,在写爬虫时,大部分情况下,都需要设定请求头,不过如果是初学的话,记得添加上User-Agent,像这样
  1. headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}
  2. response = requests.get(url=url, headers=headers)
复制代码


[b]Requests高级
维持会话对象[/b]
为什么要用维持会话对象呢,比如像一些需要登录后才能查看的网址,如果没有维持cookie,那么登录后的界面是访问不到的,因为程序两个requests请求之间是没有关系的,这个时候,需要用到session来维持会话,也是维持登录,支持后续的请求。简而言之是帮你自动的维持cookie
下面演示一些简单示例
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/python3
  3. import requests
  4. session = requests.session()
  5. # 在获得一个session对象后,可以用session对象进行请求,维持cookie
  6. response = session.get(url="https://fishc.com.cn/forum.php?mod=guide&view=hot")
复制代码


github模拟登录

  1. import re
  2. import requests

  3. # 实例化会话
  4. session = requests.Session()

  5. # 获取token的值
  6. url_token = 'https://github.com/login'

  7. # 获取的是token的值
  8. r_token = session.get(url_token)
  9. # 选取token
  10. token = re.findall('name="authenticity_token" value="(.*?)" />', r_token.text)[0]
  11. print(token)

  12. # post的网址
  13. url_post = 'https://github.com/session'

  14. data = {
  15.     'commit': 'Sign in',
  16.     'utf8': '✓',
  17.     'authenticity_token': token,
  18.     'login': '你的账号',
  19.     'password': '你的密码'
  20. }
  21. # 发送出去的结果 结果就是重定向的结果
  22. r_post = session.post(url_post, data=data)

  23. # 保存结果
  24. with open('github.html', 'wb') as fp:
  25.     fp.write(r_post.content)
复制代码


代理的使用
有时候很当你请求一个网址太过频繁,ip被限制请求了,这种时候一般可以限制Spider的请求间隔,不过会拖慢速度,对速度上有要求,这时候只能用代理啦,虽然很多网站有很多免费代理,不过代理的质量并不怎么样,建议是购买代理使用
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/python3
  3. import requests
  4. proxy = {
  5.     'http': '119.101.114.244:9999',
  6.     'https': '119.101.114.244:9999'
  7. }
  8. r = requests.get(url = 'http://icanhazip.com/', proxies=proxy)
  9. # 若你的代理需要使用私密代理,可以使用 http://user:password@host/ 语法:
  10. proxies = {
  11. "http": "http://user:pass@10.10.1.10:3128/",
  12. }
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-19 09:39:35 | 显示全部楼层
然而今天电影TT就挂了,想看encoding都难
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-19 16:27:14 | 显示全部楼层
83519489 发表于 2019-9-19 09:39
然而今天电影TT就挂了,想看encoding都难

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-22 17:19:03 | 显示全部楼层
想知道python可以做网站吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-22 19:39:06 | 显示全部楼层
lanhai123 发表于 2019-9-22 17:19
想知道python可以做网站吗

Django,Falsk  两个都可以做网站
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 07:15:17 | 显示全部楼层
讲的很细致
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 11:40:01 From FishC Mobile | 显示全部楼层
应对AJAX异步请求,我在拿分页,以及渲染后的网页内容,都能拿到,唯一就是顺序是乱序的
比如我拿到的第一条数据不是网页中第一个显示的,弄不好都不是第一页数据,这正常吗???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-27 01:02:07 | 显示全部楼层
wp231957 发表于 2020-3-26 11:40
应对AJAX异步请求,我在拿分页,以及渲染后的网页内容,都能拿到,唯一就是顺序是乱序的
比如我拿到的第一 ...

一般来说,在请求中,待会带上数据的请求范围,比如分页的page参数,等,总有一个参数用来控制,后台得知道,我该给那一段,到那一段的数据给网页拿去渲染
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-26 07:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表