马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Stubborn 于 2019-9-25 00:00 编辑
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
method-->POST
这里主要说两种形式。json和form
1,以Form表单提交数据,Content-Type:application/x-www-form-urlencodedpayload = {'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/",
}
|