• Python网络数据爬取网络爬虫基础(一)



    The website is the API......(未来的数据都是通过网络来提供的,website本身对爬虫来讲就是自动获取数据的API)。掌握定向网络数据爬取和网页解析的基本能力。

    ##Requests 库的使用,此库是Python公认的优秀的第三方网络爬虫库。能够自动的爬取HTML页面;自动的生成网络请求提交。

    ##robots.tex 协议 网络爬虫排除标准 (网络爬虫的盗亦有道)

    1.安装Requests库 以管理员权限进入cmd控制台, 通过" pip install requests "命令安装Requests库

    #测试安装Requests库的效果,以爬取百度主页为例
    >>> import requests
    >>> r = requests.get("http://www.baidu.com")##一行代码就可以获取任何对应的URL的资源
    >>> r.status_code() #状态码
    200
    >>> r.encoding = "utf-8" #将编码更改为UTF-8编码
    >>> r.text #打印网页内容
    ......百度主页的内容......

    2. requests 的主要方法:

    ##2.1  r = requests.get(url) : get 方法为获得一个网页最常用的方法  ,此方法构建一个向服务器发送请求的Request(requests库内部生产的)对象;返回一个包含服务器资源的Response(包含了网络爬虫返回的内容)对象。

    requests.get(url,params=None,**kwargs)

    url :获取URL页面的链接

    parmas:url 中额外的参数,可以是字典或字节流格式,可选

    **kwargs:12个控制访问参数

    其实get 方法采用request方法进行封装,其他的方法也通过调用request方法来实现的。可以理解为requests库只有一种request方法,为了编程方便才提供额外的6种方法。

     3.Response对象包含了服务器返回的所有信息,同时也包含了向服务器发送请求的信息

    ##Response 对象的5个属性

    3.1. r.status_code HTTP请求的返回状态,200表示连接成功,404表示连接失败;(有可能返回的是其他的值,只要不是200,都表示连接是失败的)

    3.2.r.text HTTP响应内容的所有字符串形式,即URL对应的网页内容

    3.3. r.encoding 从 HTTP header中猜测响应内容的编码方式(如果header中不存在charst字段,则默认的是ISO--8859--1编码)

    3.4.r.apparent_encoding 从内容中分析出响应内容编码方式(根据网页内容分析出编码方式,更加准确)

    3.5.r.content 表示响应内容的二进制形式

    ############################################################################################################

    ##爬取网页的通用代码框架

    ##爬取网页有风险,有可能有些网站不允许爬或者因为其他的原因无法爬取

    理解requests库的异常:

    # requests.ConnectionError  网络连接错误异常,如查询DNS失败或者服务器的防火墙拒绝连接等

    # requests.HTTPError :HTTP错误异常

    # requests.URLRequirde: URL缺失异常

    # requests.TooManyRediecrts :重定向异常,超过最大重定向次数(对一些复杂的连接访问的时候,容易产生这样的错误)

    # requests.ConnectTimeout :连接远程服务器超时异常(与服务器连接超过一个预定的时间而产生的异常)

    # requests.Timeout :发起URL请求到获取URL内容,产生的超时异常

    ##Response 作为一个返回的对象,它提供了一个方法

    r.raise_for_status()  --->与异常打交道的方法,能够判定返回的状态码是不是200,如果返回的不是200,将产生一个requests.HTTPError 异常

    ##爬取网页的通用代码框架
    import requests
    def getHTMLText(url):
        try:
            r = requests.get(url,timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return "产生异常"
        
    if _name_ == "_main_":
        url ="http://www.baidu.com"
        print(getHTMLText(url))
    ####通用代码框架可以有效的处理,在访问或者爬取网页的时候产生的异常、错误,以及由于网络不稳定等因素产生的异常。用户在使用通用代码框架后可以使得爬取网页变得更加有效、稳定可靠###

    ####requests库的7个主要方法:

    1. requests.request()

    2.requests.get()

    3.requests.head()

    4.requests.post()

    5.requests.put()

    6.requests.patch()

    7.requests.delete()

    HTTP 协议,超文本传输协议,是一种基于“”请求与响应“”模式的,无状态的应用层协议。(无状态指的是第一次请求与第二次请求并无关联)

    HTTP协议采用URL作为定位网络资源的标识

    URL的格式 http://host[:port][path](URL是通过HTTP协议存取网络资源的Internet路径,一个URL对应一个数据资源)

    host: 合法的主机域名和IP地址

    port:端口号 ,缺省的端口号为80

    path:请求的资源在服务器上的路径

    HTTP协议对资源的操作(其实这6个方法也是requests库6个函数对应的功能):

    GET :请求获取URL位置资源 与 requests.get() 方法一致

    POST :请求向URL的资源后增加新的信息,不改变现有的内容 与 requests.post()方法一致

    HEAD :请求获取URL资源的响应消息报告,即获取该资源的头部信息与 requsts.head()方法一致

    PUT :请求向URL的位置存取一个资源,原来的资源将被覆盖 与  requests.put()方法一致

    PATCH:请求向URL位置处的资源进行局部更新,改变该出资源的部分信息与 requests.patch()方法一致

    DELETE:请求删除URL位置处的相关资源  与 requests.delete()方法一致

    ##理解PATCH和PUT的区别
    假设URL位置有一组数据UserInfo,包括UserID,UserName等20个字段;
    需求:用户修改UserName其他不变
    *使用PATCH,仅向URL提交UserName的局部更新请求(主要好处:节省网络带宽)
    
    *采用PUT,必须将所以的20个字段一并提交到URL,未提交的文字段将被删除(覆盖)

    ####requests库的head()  方法

    #requests库的head()方法
    import requests
    r = requests.head("http://httpbin.org/get")#用很少的网络流量获取网络资源的概要信息
    print(r.headers) 
    >>>
    {'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Date': 'Thu, 01 Nov 2018 14:33:19 GMT', 'Content-Type': 'application/json', 'Content-Length': '265', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true', 'Via': '1.1 vegur'}
    >>>r.text
    ..........(无)
  • 相关阅读:
    RPD Volume 168 Issue 4 March 2016 评论1
    初步接触CERNVM
    java中重载与重写的区别
    第三节 java 函数
    第二节 java流程控制(循环结构)
    第二节 java流程控制(判断结构+选择结构)
    JAVA 对象引用,以及对象赋值
    Java学习笔记整理第一章 java基本数据类型、修饰符、运算符
    plantuml的使用
    力扣 第210题
  • 原文地址:https://www.cnblogs.com/shaopan/p/9893587.html
Copyright © 2020-2023  润新知