鱼C论坛

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

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

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

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

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

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

Requests入门前篇


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


method-->GET

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


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


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

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

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

print(response.json())



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

2,以JSON形式提交数据,Content-Type:application/json   以下二选一
response = requests.post(url=url, data=json.dumps(payload))
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,像这样
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"}
response = requests.get(url=url, headers=headers)

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

github模拟登录
import re
import requests

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

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

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

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

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

# 保存结果
with open('github.html', 'wb') as fp:
    fp.write(r_post.content)

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-19 09:39:35 | 显示全部楼层
然而今天电影TT就挂了,想看encoding都难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-22 17:19:03 | 显示全部楼层
想知道python可以做网站吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

Django,Falsk  两个都可以做网站
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 07:15:17 | 显示全部楼层
讲的很细致
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-17 03:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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