• 使用requests---实现Cookies、登录验证、代理设置等操作

    处理网页验证和Cookies时,需要写Opener和Handler来处理,为了更方便地实现这些操作,就有了更强大的库requests

    • 例子简单使用requests库

      1. import requests
      2.  
      3. r = requests.get('http://wwww.baidu.com/')
      4. print(type(r), r.status_code, r.text, r.cookies, sep='\n\n')
      5.  
      6. # 输出:
      7. <class 'requests.models.Response'>
      8.  
      9. 200
      10.  
      11. <!DOCTYPE html>
      12. <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible
      13. ......
      14. feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
      15.  
      16. <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
      • GET请求

        • GET请求,返回相应的请求信息
        • requests.get(url, params, **kwargs)
          • url表示要捕获的页面链接,params表示url的额外参数(字典或字节流格式),**kwargs表示12个控制访问的参数

            1. import requests
            2.  
            3. r = requests.get('http://httpbin.org/get')
            4. print(r.text)
            5.  
            6. # 输出:
            7. {
            8. "args": {},
            9. "headers": {
            10. "Accept": "*/*",
            11. "Accept-Encoding": "gzip, deflate",
            12. "Host": "httpbin.org",
            13. "User-Agent": "python-requests/2.21.0"
            14. },
            15. "origin": "120.85.108.192, 120.85.108.192",
            16. "url": "https://httpbin.org/get"
            17. }
            18.  
            19. # 返回结果中包含请求头、URL、IP等信息
            1. import requests
            2.  
            3. data = {
            4. 'name': 'LiYihua',
            5. 'age': ''
            6. }
            7. r = requests.get('http://httpbin.org/get', params=data)
            8. print(r.text)
            9.  
            10. # 输出:
            11. {
            12. "args": {
            13. "age": "",
            14. "name": "LiYihua"
            15. },
            16. "headers": {
            17. "Accept": "*/*",
            18. "Accept-Encoding": "gzip, deflate",
            19. "Host": "httpbin.org",
            20. "User-Agent": "python-requests/2.21.0"
            21. },
            22. "origin": "120.85.108.92, 120.85.108.92",
            23. "url": "https://httpbin.org/get?name=LiYihua&age=21"
            24. }
            1. import requests
            2.  
            3. r = requests.get('http://httpbin.org/get')
            4. print(type(r.text), r.json(), type(r.json()), sep='\n\n')
            5.  
            6. # 输出:
            7. <class 'str'>
            8.  
            9. {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.21.0'}, 'origin': '120.85.108.92, 120.85.108.92', 'url': 'https://httpbin.org/get'}
            10.  
            11. <class 'dict'>
            12.  
            13. # json()方法可以将返回结果是JSON格式的字符串转化为字典

            抓取二进制数据

            1. import requests
            2.  
            3. r = requests.get('https://github.com/favicon.ico')
            4. print(r.text, r.content, sep='\n\n')
            5.  
            6. # response.content返回的是bytes型的数据。
            7. # 如果想取图片,文件,则可以通过r.content
            8.  
            9. # response.text返回的是Unicode型的数据。
            10. # 如果想取文本,可以通过r.text
            11.  
            12. # 输出:
            13. :�������OL��......
            14.  
            15. b'\x00\x00\x01\x00\x02\x00\x10\x10\x00\x00\x0......

            将提取到的图片保存

            1. import requests
            2.  
            3. r = requests.get('https://github.com/favicon.ico')
            4. with open('favicon.ico', 'wb') as f:
            5. f.write(r.content)
            6.  
            7. # 运行结束后生成一个名为favicon.ico的图标

            上一个例子用到的open()方法和with as语句

            1. # open()方法
            2. # def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
            3.  
            4. # 常用参数:
            5. file表示要打开的文件 mode表示打开文件的模式:只读,写入,追加等
            6.  
            7. buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认
            8.  
            9. # 对于mode参数
            10. ========= ===============================================================
            11. 字母的意义
            12. --------- ---------------------------------------------------------------
            13. 'r' 打开阅读(默认)
            14. 'w' 打开进行写入,首先截断文件
            15. 'x' 创建一个新文件并打开它进行写入
            16. 'a' 打开进行写入,如果文件存在,则附加到文件结尾
            17. 'b' 二进制模式
            18. 't' 文本模式(默认)
            19. '+' 打开磁盘文件进行更新(读写)
            20. 'U' 通用换行模式(已弃用)
            21. ========= ===============================================================
            22.  
            23. # with as 语句
            24. 有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Pythonwith语句提供了一种非常方便的处理方式。
            25. with的处理基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。
            26. 代码解释说明:
            27. class Sample:
            28. def __enter__(self):
            29. print "In __enter__()"
            30. return "Foo"
            31.  
            32. def __exit__(self, type, value, trace):
            33. print "In __exit__()"
            34.  
            35. def get_sample():
            36. return Sample()
            37.  
            38. with get_sample() as sample:
            39. print "sample:", sample

            添加headers

            1. import requests
            2.  
            3. r = requests.get('https://www.zhihu.com/explore')
            4. print(r.text)
            5.  
            6. # 输出:
            7. <html>
            8. <head><title>400 Bad Request</title></head>
            9. <body bgcolor="white">
            10. <center><h1>400 Bad Request</h1></center>
            11. <hr><center>openresty</center>
            12. </body>
            13. </html>
            14.  
            15. # 部分网址需要传递headers,如果不传递,就不能正常请求
            16. import requests
            17.  
            18. headers = {
            19. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko '
            20. 'Chrome/52.0.2743.116 Safari/537.36'
            21. }
            22. r = requests.get('https://www.zhihu.com/explore', headers=headers)
            23. print(r.text)
            24.  
            25. # 输出:
            26. <!DOCTYPE html>
            27. <html lang="zh-CN" dropEffect="none" class="no-js no-auth ">
            28. <head>
            29. <meta charset="utf-8" />
            30. ......
            31. <script type="text/zscript" znonce="d78db0c15fa84270ac967503884baf11"></script>
            32.  
            33. <input type="hidden" name="_xsrf" value="cdb6166e0dc5f38afc3ee95053d7ef55"/>
            34. </body>
            35. </html>
      • POST请求

        • 这是一种比较常见的URL请求方式

          1. import requests
          2.  
          3. data = {
          4. 'name': 'LiYihua',
          5. 'age': 21
          6. }
          7. r = requests.post('http://httpbin.org/post', data=data)
          8. print(r.text)
          9.  
          10. # 输出:
          11. {
          12. "args": {},
          13. "data": "",
          14. "files": {},
          15. "form": {
          16. "age": "",
          17. "name": "LiYihua"
          18. },
          19. "headers": {
          20. "Accept": "*/*",
          21. "Accept-Encoding": "gzip, deflate",
          22. "Content-Length": "",
          23. "Content-Type": "application/x-www-form-urlencoded",
          24. "Host": "httpbin.org",
          25. "User-Agent": "python-requests/2.21.0"
          26. },
          27. "json": null,
          28. "origin": "120.85.108.90, 120.85.108.90",
          29. "url": "https://httpbin.org/post"
          30. }
          31.  
          32. # POST请求成功,获得返回结果,form部分为提交的数据
      • 响应

        • text 和 content 获取响应的内容

          status code 属性得到状态码    headers 属性得到响应头    cookies属性得到 Cookies

          url属性得到 URL    history属性得到请求历史

          1. import requests
          2.  
          3. r = requests.get('https://www.cnblogs.com/liyihua/')
          4.  
          5. print(type(r.status_code), r.status_code,
          6. type(r.headers), r.headers,
          7. type(r.cookies), r.cookies,
          8. type(r.url), r.url,
          9. type(r.history), r.history,
          10. sep='\n\n')
          11.  
          12. # 输出:
          13. <class 'int'>
          14.  
          15. 200
          16.  
          17. <class 'requests.structures.CaseInsensitiveDict'>
          18.  
          19. {'Date': 'Thu, 20 Jun 2019 08:18:00 GMT', 'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Vary': 'Accept-Encoding', 'Cache-Control': 'private, max-age=10', 'Expires': 'Thu, 20 Jun 2019 08:18:10 GMT', 'Last-Modified': 'Thu, 20 Jun 2019 08:18:00 GMT', 'X-UA-Compatible': 'IE=10', 'X-Frame-Options': 'SAMEORIGIN', 'Content-Encoding': 'gzip'}
          20.  
          21. <class 'requests.cookies.RequestsCookieJar'>
          22.  
          23. <RequestsCookieJar[]>
          24.  
          25. <class 'str'>
          26.  
          27. https://www.cnblogs.com/liyihua/
          28.  
          29. <class 'list'>
          30.  
          31. []

          状态码通常用来判断请求是否成功

          1. import requests
          2.  
          3. r = requests.get('http://www.baidu.com')
          4. exit() if not r.status_code == requests.codes.ok else print('Request Successfully')
          5.  
          6. # 输出:
          7. Request Successfully
          8.  
          9. # request.codes.ok 返回成功的状态码200

          返回码和相应的查询条件

    • 高级用法

      • 文件上传

        1. import requests
        2.  
        3. files = {
        4. 'file': open('favicon.ico', 'rb')
        5. }
        6. r = requests.post('http://httpbin.org/post', files=files)
        7. print(r.text)
        8.  
        9. # 输出:
        10. {
        11. "args": {},
        12. "data": "",
        13. "files": {
        14. "file": "data:application/octetstream;base64,AAABAAIAEBAAAAEAIAAoBQAAJgAAACAgAAABACAAKBQAAE4FAAAoAAAAEAAAACAAAAABACAAAAAAAAAFAAA...
        15. },
        16. "form": {},
        17. "headers": {
        18. "Accept": "*/*",
        19. "Accept-Encoding": "gzip, deflate",
        20. "Content-Length": "",
        21. "Content-Type": "multipart/form-data; boundary=c1b665273fc73e67e57ac97e78f49110",
        22. "Host": "httpbin.org",
        23. "User-Agent": "python-requests/2.21.0"
        24. },
        25. "json": null,
        26. "origin": "120.85.108.71, 120.85.108.71",
        27. "url": "https://httpbin.org/post"
        28. }
      • Cookies

        1. import requests
        2.  
        3. headers = {
        4. 'Cookie': 'tgw_l7_route=66cb16bc7......ECLNu3tQ',
        5. 'Host': 'www.zhihu.com',
        6. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
        7. }
        8. r = requests.get('https://www.zhihu.com', headers=headers)
        9. print(r.text)
        10.  
        11. # 输出:
        12. <!doctype html>
        13. <html lang="zh" data-hairline="true" data-theme="light"><head><meta charSet="utf-8"/><title data-react-helmet="true">首页 - 知乎</title><meta name="viewport" ......
        14. # 说明登录成功
        15.  
        16. # Cookie维持登录状态,首先登录知乎,复制headers中的Cookie,然后将其设置到Headers里面,然后发送请求
        1. from requests.cookies import RequestsCookieJar
        2. import requests
        3.  
        4. cookies = 'tgw_l7_route=66cb16bc7f45da64562a07.......ALNI_MbNds66nlodoTCxp8EVE6ECLNu3tQ'
        5. jar = requests.cookies.RequestsCookieJar()
        6.  
        7. headers = {
        8. 'Host': 'www.zhihu.com',
        9. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
        10. }
        11.  
        12. for cookies in cookies.split(';'):
        13. key, value = cookies.split('=', 1)
        14. jar.set(key, value)
        15.  
        16. r = requests.get('https://www.zhihu.com', cookies=jar, headers=headers)
        17. print(r.text)
        18.  
        19. # 输出同上面一样
        20. # 将复制下来的cookies利用split()方法处理分割
        21. # 创建RequestsCookieJar对象,利用set()方法设置好每个Cookie的key和value

      • 会话维持

        • Session对象,可以方便的维护一个会话

          1. import requests
          2.  
          3. requests.get('http://httpbin.org/cookies/set/number/123456789')
          4. r = requests.get('http://httpbin.org/cookies')
          5. print(r.text)
          6.  
          7. # 输出:
          8. {
          9. "cookies": {}
          10. }
          11.  
          12. import requests
          13.  
          14. s = requests.Session()
          15. s.get('http://httpbin.org/cookies/set/number/123456789')
          16. r = s.get('http://httpbin.org/cookies')
          17. print(r.text)
          18.  
          19. # 输出:
          20. {
          21. "cookies": {
          22. "number": ""
          23. }
          24. }
        • SSL证书验证

          1. import requests
          2.  
          3. r = requests.get('https://www.12306.cn')
          4. print(r.status_code)
          5.  
          6. # 没有出错会输出:200
          7. # 如果请求一个HTTPS站点,但是证书验证错误的页面时,就会错误。
          8.  
          9. # 为了避免错误,可以将改例子稍作修改
          10. import requests
          11. from requests.packages import urllib3
          12.  
          13. urllib3.disable_warnings()
          14. r = requests.get('https://www.12306.cn', verify=False)
          15. print(r.status_code)
        • 代理设置

          1. import requests
          2.  
          3. proxies = {
          4. 'http': 'socks5://user:password@10.10.1.10:3128',
          5. 'https': 'socks5://user:password@10.10.1.10:1080'
          6. }
          7.  
          8. requests.get('https://www.taobao.com', proxies=proxies)
          9.  
          10. # 使用SOCKS协议代理
        • 超时设置

          1. import requests
          2.  
          3. r = requests.get('https://taobao.com', timeout=(0.1, 1))
          4. print(r.status_code)
          5.  
          6. # 输出:200
        • 身份验证
          1. import requests
          2. from requests.auth import HTTPBasicAuth
          3.  
          4. r = requests.get('http://localhost', auth=HTTPBasicAuth('liyihua', 'woshiyihua134'))
          5. print(r.status_code)
          6.  
          7. # 输出:200
          8.  
          9. # 也可以使用OAuth1方法
          10. import requests
          11. from requests_oauthlib import OAuth1
          12.  
          13. url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
          14. auth = OAuth1('YOUR_APP_KEY', 'YOUR_APP_SECRET'
          15. 'USER_OAUTH_TOKEN', 'USER_OAUTH_TOKEN_SECRET')
          16. requests.get(url, auth=auth)
        • Prepared Request(准备请求)

          1. 要获取一个带有状态的 Prepared Request 需要用Session.prepare_request()
          1. from requests import Request, Session
          2.  
          3. url = 'http://httpbin.org/post'
          4. data = {
          5. 'name': 'LiYihua'
          6. } # 参数
          7. header = {
          8. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537 (KHTML, like Gecko Chrome/53.0.2785.116 Safari/537.36'
          9. } # 伪装浏览器
          10. s = Session() # 会话维持
          11. req = Request('POST', url, data=data, headers=header)
          12.  
          13. prepped = s.prepare_request(req) # Session的prepare_request()方法将req转化为一个 Prepared Request对象
          14. r = s.send(prepped) # send() 发送请求
          15. print(r.text)
          16.  
          17. # 输出:
          18. {
          19. "args": {},
          20. "data": "",
          21. "files": {},
          22. "form": {
          23. "name": "LiYihua"
          24. },
          25. "headers": {
          26. "Accept": "*/*",
          27. "Accept-Encoding": "gzip, deflate",
          28. "Content-Length": "",
          29. "Content-Type": "application/x-www-form-urlencoded",
          30. "Host": "httpbin.org",
          31. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537 (KHTML, like Gecko Chrome/53.0.2785.116 Safari/537.36"
          32. },
          33. "json": null,
          34. "origin": "120.85.108.184, 120.85.108.184",
          35. "url": "https://httpbin.org/post"
          36. }

爬虫基本库的使用---requests库的更多相关文章

  1. 爬虫1.1-基础知识+requests库

    目录 爬虫-基础知识+requests库 1. 状态返回码 2. URL各个字段解释 2. requests库 3. requests库爬虫的基本流程 爬虫-基础知识+requests库 关于html ...

  2. Python爬虫:HTTP协议、Requests库(爬虫学习第一天)

    HTTP协议: HTTP(Hypertext Transfer Protocol):即超文本传输协议.URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源. HTTP协议 ...

  3. Python爬虫(二):Requests库

    所谓爬虫就是模拟客户端发送网络请求,获取网络响应,并按照一定的规则解析获取的数据并保存的程序.要说 Python 的爬虫必然绕不过 Requests 库. 1 简介 对于 Requests 库,官方文 ...

  4. 爬虫(三):Requests库的基本使用

    一:什么是Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用,你会发现 ...

  5. Python爬虫学习==>第八章:Requests库详解

    学习目的: request库比urllib库使用更加简洁,且更方便. 正式步骤 Step1:什么是requests requests是用Python语言编写,基于urllib,采用Apache2 Li ...

  6. python之爬虫(四)之 Requests库的基本使用

    什么是Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用,你会发现,其 ...

  7. Python爬虫:HTTP协议、Requests库

    HTTP协议: HTTP(Hypertext Transfer Protocol):即超文本传输协议.URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源. HTTP协议 ...

  8. 爬虫入门【2】Requests库简介

    发送请求 使用Requests发送网络请求很简单 #首先要导入requests库 import requests #返回一个Response对象 r=requests.get('https://git ...

  9. python爬虫---从零开始(三)Requests库

    1,什么是Requests库 Requests是用python语言编写,基于urllib,采用Apache2 Licensed 开源协议的HTTP库. 它比urllib更加方便,可以节约我们大量的工作 ...

随机推荐

  1. Activiti(1) - TaskRuntime API 入门

    目录 TaskRuntime API pom.xml 注册TaskRuntime实例 角色与分组 任务事件监听器 DemoApplication 源码 Activiti 是一个自动化工作流框架.它能帮 ...

  2. 原创电子书《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》

    <菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...

  3. Flume 学习笔记之 Flume NG概述及单节点安装

    Flume NG概述: Flume NG是一个分布式,高可用,可靠的系统,它能将不同的海量数据收集,移动并存储到一个数据存储系统中.轻量,配置简单,适用于各种日志收集,并支持 Failover和负载均 ...

  4. FFmpeg(二) 解封装相关函数理解

    一.解封装基本流程 ①av_register_All()////初始化解封装,注册解析和封装的格式. ②avformat_netword_init()//初始化网络,解析rtsp协议 ③avforma ...

  5. 【Java】访问mysql数据库视图

    数据库连接Connect: package cn.hkwl.zaxq.mysql; import java.sql.Connection; import java.sql.DriverManager; ...

  6. PHP获取客户端的真实IP

    REMOTE_ADDR只能获取访问者本地连接中设置的IP,如中南民族大学校园网中自己设置的10.X.XXX.XXX系列IP,而这个函数获取的是局域网网关出口的IP地址, 如果访问者使用代理服务器,将不 ...

  7. LitePal的基本用法

    快速配置   1. 引入Jar包或源码 首先我们需要将LitePal的jar包引入到项目当中,可以点击这里查看LitePal的最新版本,选择你需要的下载即可.下载好了jar包之后,把它复制到项目的li ...

  8. selenium-webdriver中的显式等待与隐式等待

    在selenium-webdriver中等待的方式简单可以概括为三种: 1 导入time包,调用time.sleep()的方法传入时间,这种方式也叫强制等待,固定死等一个时间 2 隐式等待,直接调用i ...

  9. 05-04 scikit-learn库之主成分分析

    目录 scikit-learn库之主成分分析 一.PCA 1.1 使用场景 1.2 代码 1.3 参数 1.4 属性 1.5 方法 二.KernelPCA 三.IncrementalPCA 四.Spa ...

  10. 在vue中操作dom元素

    在vue中可以通过给标签加ref属性,就可以在js中利用ref去引用它,从而达到操作该dom元素,以下是个参考例子 1 <template> 2 <div> 3 <div ...