专栏首页毛利学Python爬虫篇| Requests库详细的用法(四)

爬虫篇| Requests库详细的用法(四)

介绍

对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助。入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取。那么简单介绍一下 requests 库的基本用法。

安装

利用 pip 安装

pip install requests

基本请求

req = requests.get("http://www.baidu.com")
req = requests.post("http://www.baidu.com")
req = requests.put("http://www.baidu.com")
req = requests.delete("http://www.baidu.com")
req = requests.head("http://www.baidu.com")
req = requests.options("http://www.baidu.com")

get请求

参数是字典,我们也可以传递json类型的参数:

import requests

url = "http://www.baidu.com/s"
params = {'wd': '毛利'}
response = requests.get(url, params=params)
print(response.url) # http://www.baidu.com/s?wd=%E6%AF%9B%E5%88%A9
response.encoding = 'utf-8'
html = response.text
# print(html)  

post请求

参数是字典,我们也可以传递json类型的参数:

url = "https://accounts.douban.com/j/mobile/login/basic"
formdata = {
     'ck': '',
    'name':'13717378202',
    'password': '',
    'remember': 'false',
    'ticket': '',
}
response = requests.post(url, data=formdata)
response.encoding = 'utf-8'
html = response.text
# print(html)

传递URL参数也不用再像urllib中那样需要去拼接URL,而是简单的,构造一个字典,并在请求时将其传递给params参数:

此时,查看请求的URL,则可以看到URL已经构造正确了:

并且,有时候我们会遇到相同的url参数名,但有不同的值,而python的字典又不支持键的重名,那么我们可以把键的值用列表表示:

自定义请求头部

伪装请求头部是采集时经常用的,我们可以用这个方法来隐藏:

headers = {'User-Agent': 'python'}
r = requests.get('http://www.baiducom', headers = headers)
print(r.request.headers['User-Agent'])

设置超时时间

可以通过timeout属性设置超时时间,一旦超过这个时间还没获得响应内容,就会提示错误

requests.get('http://github.com', timeout=0.001)

代理访问

采集时为避免被封IP,经常会使用代理。requests也有相应的proxies属性

import requests

proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "https://10.10.1.10:1080",
}

requests.get("http://httpbin.org/get", proxies=proxies)

如果代理需要账户和密码,则需这样

proxies = {
    "http": "http://user:pass@10.10.1.10:3128/",
}

重定向

在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中是默认开启允许重定向的,即遇到重定向时,会自动继续访问。

ssl验证

有时候我们使用了抓包工具,这个时候由于抓包工具提供的证书并不是由受信任的数字证书颁发机构颁发的,所以证书的验证会失败,所以我们就需要关闭证书验证。 在请求的时候把verify参数设置为False就可以关闭证书验证了。

但是关闭验证后,会有一个比较烦人的warning

可以使用以下方法关闭警告

获取响应信息

代码

含义

resp.json()

获取响应内容(以json字符串)

resp.text

获取响应内容 (以字符串)

resp.content

获取响应内容(以字节的方式)

resp.headers

获取响应头内容

resp.url

获取访问地址

resp.encoding

获取网页编码

resp.request.headers

请求头内容

resp.cookie

获取cookie

常用用法

Requests会自动的根据响应的报头来猜测网页的编码是什么,然后根据猜测的编码来解码网页内容,基本上大部分的网页都能够正确的被解码。而如果发现text解码不正确的时候,就需要我们自己手动的去指定解码的编码格式

而如果你需要获得原始的二进制数据,那么使用content属性即可。

如果我们访问之后获得的数据是JSON格式的,那么我们可以使用json()方法,直接获取转换成字典格式的数据。

通过status_code属性获取响应的状态码

通过headers属性获取响应的报头

通过cookies属性获取服务器返回的cookies

session自动保存cookies

在Requests中,实现了Session(会话)功能,当我们使用Session时,能够像浏览器一样,在没有关闭关闭浏览器时,能够保持住访问的状态。

这个功能常常被我们用于登陆之后的数据获取,使我们不用再一次又一次的传递cookies。

首先我们需要去生成一个Session对象,然后用这个Session对象来发起访问,发起访问的方法与正常的请求是一摸一样的。

同时,需要注意的是,如果是我们在get()方法中传入headers和cookies等数据,那么这些数据只在当前这一次请求中有效。如果你想要让一个headers在Session的整个生命周期内都有效的话,需要用以下的方式来进行设置:

小试牛刀

登录豆瓣

步骤
  • 找到登录的url,保存cookie
  • 用session保存对话的cookie,再访问网页
# -*- coding:utf-8 -*-
# time :2019/4/3 12:55
# author: 毛利
import requests
class DouBanLogin(object):
    def __init__(self,name,password):
        self.name = name
        self.password = password
    def login(self):
        sesstion = requests.Session()
        sesstion.headers.update({
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
        })
        # 拿到cookie
        #sesstion.get('https://www.douban.com/')
        #print(sesstion.cookies)
        login_url = 'https://accounts.douban.com/j/mobile/login/basic'
        form_data = {
            'ck':'' ,
            'name': self.name,
            'password': self.password,
            'remember': 'false',
            'ticket': ''
        }
        res = sesstion.post(login_url, data=form_data)
        # print(res.text)
        if res.json()["status"] == "success":
            print('登录成功')
            res = sesstion.get('https://www.douban.com/')
            print(res.text)
        else:
            print('登录失败')

if __name__ == '__main__':
    name = input('请输入你的账号')
    password = input('请输入你的密码')
    login = DouBanLogin(name, password)
    login.login()

本文分享自微信公众号 - 毛利学Python(sen13717378202),作者:小sen

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 多层感知器(神经网络)

    原文:https://maoli.blog.csdn.net/article/details/88777955

    润森
  • 原创 | SpringBoot微服务和分布式

    微服务是一种面向服务的架构(SOA)风格(Java开发人员最重要的技能之一),其中,应用程序被构建为多个不同的小型服务的集合而不是单个应用程序。与单个程序不同的...

    润森
  • 用node撸一个简单的爬虫

    一提起爬虫可能大家就会觉得很高大上,就会想起python.呵呵,我们今天偏偏就要颠覆大家的认知,用node不到100行代码擼一个简单的爬虫。天天python,我...

    润森
  • Python爬虫入门(一)获取源码

    举个例子,爬一爬知乎日报的相关数据 http://daily.zhihu.com/ 1、获取源码 import requests url = 'http://d...

    小歪
  • hadoop开发环境安装

    1.Windows环境VMWare WorkStation 12安装步骤 http://www.jianshu.com/p/6b589ecd62c2 2.VMW...

    Albert陈凯
  • Silverlight网络寻奇 at 090417

    Silverlight获取Ie外观的颜色 Silverlight 3 now supports operating system colors. This me...

    用户1172164
  • Spring Security 3 学习

           学习SpringSecurity3之前,我在网上找了很多关于SpringSecurity3的相关博客,写得都很好,刚开始我都看不懂,后来在ITEY...

    用户2398817
  • 推荐几个在线学习的平台

    http://www.jikexueyuan.com/ 极客学院,各种学习资料,但是视频大部分收费的,如果有特别想看的课程可以学习,实在不行看看wiki。 h...

    春哥大魔王
  • wordpress更换域名的操作方法

    最近把博客的域名给换了,之前的域名,我也不知道啥鬼意思。 现在就换了:summertory.cn,夏天的故事。 com后缀被人注册了,就选了个cn。毕竟这是...

    速企云
  • 品牌升级 终端五位数买88368.com

    数字域名因其短小精悍,简短好记,在域名圈内一直备受喜爱,而这类品相好、含义佳的数字域名往往能身价傲视群雄。

    躲在树上的域小名

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动