您的位置:68399皇家赌场 > 集群主机 > (转)Python模块之requests

(转)Python模块之requests

发布时间:2019-05-09 05:52编辑:集群主机浏览(62)

    验证

    第一,进行GET时,关闭证书验证.因为,假诺不闭馆,请求总是退步,无法取获得重定向的消息.

    >>> response = requests.get('http://www.baidu.com/', headers = header, verify=False)
    D:pythonlibsite-packagesurllib3connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
    InsecureRequestWarning)
    >>> response.history
    [<Response [302]>]
    >>> response.url
    u'https://www.baidu.com/'
    

     

    皇家赌场 1

    当不钦命User-Agent时

    >>> response = requests.get('http://www.baidu.com/', verify=False)
    >>> response.history
    []
    >>> response.url
    u'http://www.baidu.com/'
    

    皇家赌场 2

    至于CA数据申明认证

    CA(Certificate Authority)是数字证书认证宗旨的简称,是指发放、管理、撤消数字证书的受正视的第一方单位,如香港数字认证股份有限公司、新加坡市数字证书认证主旨有限公司等...

    CA的意义是反省评释持有者身份的合法性,并签发证书,以免证书被假冒或歪曲,以及对证件和密钥举办保管。

    现实生活中可以用身份证来评释身份, 那么在网络世界里,数字证书正是身份证。和现实生活差别的是,并不是各类上网的用户都有数字证书的,往往只有当1人需求评释自身的地位的时候才要求用到数字证书。

    普通用户一般是无需,因为网站并不关怀是何人访问了网址,以往的网址只关心流量。可是转头,网址就必要评释本人的地位了。

    诸如未来钓鱼网址许多的,比如您想访问的是www.baidu.com,但骨子里你拜访的是www.daibu.com”,所以在交付自身的隐情新闻在此以前供给验证一下网址的身价,供给网址展现数字证书。

    貌似平常的网址都会再接再砺出示自个儿的数字证书,来确定保障客户端和网址服务器之间的通讯数据是加密安全的。

    1.假诺想得到2进制,能够用.content的秘籍:

    过程

    玖,管理HTTPS请求 SSL证书验证

    于今各处可知 https 发轫的网址,urllib2可感觉 HTTPS 请求验证SSL证书,就好像web浏览器同样,借使网址的SSL证书是因而CA认证的,则能够健康访问,如:https://www.baidu.com/等...

    设若SSL证书验证不经过,只怕操作系统不信任服务器的平安证书,举例浏览器在访问1230六网址如:https://www.12306.cn/mormhweb/的时候,会警告用户证书不受信任。(据他们说12306 网站证书是团结做的,未有经过CA认证)

    1旦未有ssl证书认证,会报如下错误:

    urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)>
    
    from urllib import request
    import ssl
    
    # 表示忽略网站的不合法证书认证
    context = ssl._create_unverified_context()
    
    headers = {"User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)"}
    
    req = request.Request("https://www.12306.cn/mormhweb/", headers=headers)
    
    # 在urlopen()添加context参数,请求将忽略网站的证书认证
    response = request.urlopen(req, context=context)
    
    print(response.read())
    

    >>>r.status_code200

    测试2

    当钦赐headers的User-Agent为火狐浏览器时:

    >>> header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1',}
    >>> requests.get('http://www.baidu.com/', headers = header)
    <Response [200]>
    >>> requests.get('http://www.baidu.com/', headers = header)
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestsapi.py", line 72, in get
    return request('get', url, params=params, **kwargs)
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestsapi.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestssessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestssessions.py", line 640, in send
    history = [resp for resp in gen] if allow_redirects else []
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestssessions.py", line 218, in resolve_redirects
    **adapter_kwargs
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestssessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestsadapters.py", line 506, in send
    raise SSLError(e, request=request)
    requests.exceptions.SSLError: HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)'),))
    

      

    皇家赌场 3

    三,Request构造请求对象

    # 导入urllib 库下request模块
    from urllib import request
    
    # url 作为Request()方法的参数,构造并返回一个Request对象
    req = request.Request("http://www.baidu.com")
    
    # Request对象作为urlopen()方法的参数,发送给服务器并接收响应
    response = request.urlopen(req)
    
    html = response.read()
    
    print(html)
    

    注意:
    新建Request实例,除了必须要有 url 参数之外,还是可以设置其它四个参数:

    • 一,data(私下认可空):提交的Form表单数据,同时 HTTP 请求方法将从默许的 "GET"方式 改为 "POST"形式。

    • 贰,headers(私下认可空):参数为字典类型,包涵了特殊需求发送的HTTP报头的键值对。

    一、HTTP协议

    报错音信

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestsapi.py", line 72, in get
    return request('get', url, params=params, **kwargs)
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestsapi.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestssessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestssessions.py", line 640, in send
    history = [resp for resp in gen] if allow_redirects else []
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestssessions.py", line 218, in resolve_redirects
    **adapter_kwargs
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestssessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
    File "D:pythonlibsite-packagesrequests-2.18.3-py2.7.eggrequestsadapters.py", line 506, in send
    raise SSLError(e, request=request)
    requests.exceptions.SSLError: HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)'),))
    

     

     

    陆,随机增添/修改User-Agent

    from  urllib import request
    import random
    
    
    def loadPage(url):
        # User-Agent 列表
        useragent_list = [
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
            "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
            "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
            "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
            "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
            "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3"
        ]
        # 随机选择一个User-Agent字符串
        # random.choice()这个方法可以从列表中随机的取出一个元素
        user_agent = random.choice(useragent_list)
    
        # 构造请求对象
        req = request.Request(url)
        # 添加一个请求报头,添加的时候是User-Agent
        req.add_header("User-Agent", user_agent)
        # 查看指定请求报头,获取的时候一定是User-agent
        print(req.get_header("User-agent"))
    
        # 发送请求,返回服务器响应
        reseponse = request.urlopen(req)
        # 返回响应的html内容
        return reseponse.read()
    
    
    if __name__ == "__main__":
        url = input("请输入需要抓取的网页:")
        html = loadPage(url)
        print(html)
    

    >>>r.textu'....................'

    结论

    当钦点headers的User-Agent时,baidu的服务器会重定向到https的网址.因而报出SSL验证失利的错误.

    2,urlopen发送请求,重回响应案例

    # 导入urllib 库下request模块
    from urllib import request
    
    # 向指定的url发送请求,并返回服务器响应的类文件对象
    response = request.urlopen("http://www.baidu.com")
    
    # 类文件对象支持 文件对象的操作方法,如read()方法读取文件全部内容,返回字符串
    html = response.read()
    
    # 打印字符串
    print(html)
    

    伍、重回请求头

    赶尽杀绝措施

    四,User-Agent伪装成浏览器

    • 浏览器 正是互连网世界上公认被允许的地位,要是大家期待大家的爬虫程序更像贰个下马看花用户,这大家第2步就是索要伪装成三个被浏览器。用分化的浏览器在殡葬请求的时候,会有差别的 User-Agent 报头。

    • python2中的urllib2默认的User-Agent头为:Python-urllib/x.y (x和y 是Python 主.次 版本号,例如 Python-urllib/2.7)

    from urllib import request
    
    def loadPage():
        # 包含一个请求报头的headers, 发送的请求会附带浏览器身份发送
        headers = {"User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)"}
        # 构造一个请求对象
        req = request.Request("http://www.baidu.com/", headers=headers)
        # 发送http请求,返回服务器的响应内容
        # response响应是一个类文件对象
        response = request.urlopen(req)
        # 类文件对象支持文件操作的相关方法,比如read():读取文件所有内容,返回字符串
        return response.read()
    
    
    if __name__ == "__main__":
        # print __name__
        html = loadPage()
        # 打印字符串,也就是整个网页的源码
        print(html)
    

    OPTIONS:使服务器传回该能源所支撑的富有HTTP请求方法,能够测试服务器功效是否平常运维。

    分析

    现象:第一次GET时正常,第二次GET时,会报错.

    不同点:User-Agent不相同

    解析:由于报错SSL证书验证退步,所以此番的拜会应该是https协议.然而我们一望而知使用的是http,所以,估摸访问该网址后,被重定向到了

    1,简述

    所谓网页抓取,就是把U大切诺基L地址中钦命的网络财富从互连网流中抓抽取来。在Python中有众多库能够用来抓取网页。

    在python第22中学自带urllib和urllib二。贰者分别如下:

    • 一,urllib 模块仅尚可UPRADOL,不能够创制 设置headers 的Request 类实例;

    • 二,然而 urllib 提供 urlencode 方法用来发出GET查询字符串,而 urllib2则尚未。(那是 urllib 和 urllib贰 平时一起利用的显要缘由)

    • 叁,编码专门的工作采用urllib的urlencode()函数,帮大家将key:value那样的键值对,调换来"key=value"那样的字符串,解码专门的工作得以利用urllib的unquote()函数。( 注意,不是urllib二.urlencode())

    在python3中urllib2被改为urllib库下request模块。编码使用urllib库下parse模块

    from urllib import parse
    # url转码操作,只有转码后浏览器才会识别该url
    kw = {'name': '中国'}
    res = parse.urlencode(kw)
    print(res)
    res2 = parse.unquote(res)
    print(res2)
    # 结果如下:
    # name=E5
    		

    本文由68399皇家赌场发布于集群主机,转载请注明出处:(转)Python模块之requests

    关键词: 68399皇家赌场 日记本 Python爬虫学习 生活不易 我