为什么要学习requests
,而不是urllib
?
- requests的底层实现就是urllib
- requests在python2 和python3中通用,方法完全一样
- requests简单易用
- Requests能够自动帮助我们解压(gzip压缩的等)网页内容
- 作用:发送网络请求,返回响应数据
- 中文文档 API: http://docs.python-requests.org/zh_CN/latest/index.html
安装方式
利用 pip 安装 或者利用 easy_install 都可以完成安装:
- pip install requests
- easy_install requests
- 安装第三方模块
- pip install 模块名
- 下载源码解码,进入解压后的目录
python setup.py install
-
***.whl
安装方法pip install ***.whl
基本GET请求
- response = requests.get("http://www.baidu.com/")
也可以这么写 - response = requests.request("get", "http://www.baidu.com/")
添加 headers 和 查询参数
如果想添加 headers,可以传入headers参数来增加请求头中的headers信息。如果要将参数放在url中传递,可以利用 params 参数。
kw = {'wd':'长城'} headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"} #params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode() response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)
response的常用方法:
- response.text
- respones.content
- response.status_code
- response.encoding
- response.request.headers
- response.headers
- response.url
response.text 和response.content的区别
- response.text
类型:str
解码类型: 根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
如何修改编码方式:response.encoding=”gbk” - response.content
类型:bytes
解码类型: 没有指定
如何修改编码方式:response.content.deocde(“utf8”) - 使用response.text 时,Requests 会基于 HTTP 响应的文本编码自动解码响应内容,大多数 Unicode 字符集都能被无缝地解码。
- 使用response.content 时,返回的是服务器响应数据的原始二进制字节流,可以用来保存图片等二进制文件。
- 更推荐使用response.content.deocde()的方式获取响应的html页面
为什么请求需要带上header?
- 模拟浏览器,欺骗服务器,获取和浏览器一致的内容
header的形式:字典
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
用法: requests.get(url,headers=headers)
发送带参数的请求
什么叫做请求参数
列1: http://www.webkaka.com/tutorial/server/2015/021013/
例2: https://www.baidu.com/s?wd=python&c=b
参数的形式:字典
kw = {'wd':'长城'}
用法:requests.get(url,params=kw)
基本POST请求
哪些地方我们会用到POST请求:
- 登录注册( POST 比 GET 更安全)
- 需要传输大文本内容的时候( POST 请求对数据长度没有要求)
- 所以同样的,我们的爬虫也需要在这两个地方会去模拟浏览器发送post请求
最基本post方法
- response = requests.post("http://www.baidu.com/", data = data)
传入data数据
对于 POST 请求来说,我们一般需要为它增加一些参数。那么最基本的传参方法可以利用 data 这个参数
import requests formdata = { "type":"AUTO", "i":"i love python", "doctype":"json", "xmlVersion":"1.8", "keyfrom":"fanyi.web", "ue":"UTF-8", "action":"FY_BY_ENTER", "typoResult":"true" } url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null" headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"} response = requests.post(url, data = formdata, headers = headers) print (response.text) # 如果是json文件可以直接显示 print (response.json())
寻找登录的post地址
- 在form表单中寻找action对应的URL地址
-
post的数据是input标签中name的值作为键,真正的用户名密码作为值的字典,post的URL地址就是
action对应的URL地址 -
抓包,寻找登录的url地址
- 勾选perserve log按钮,防止页面跳转找不到URL
- 寻找post数据,确定参数
- 参数不会变,直接用,比如密码不是动态加密的时候
- 参数会变
- 参数在当前的响应中
- 通过js生成
-
定位想要的js
- 选择会触发js事件的按钮,点击event listener 找到js的位置
- 通过chorme中的search all file来搜索url中关键字
网友评论