53. Python 爬虫(2)

发布时间:2019-09-11 07:46:09编辑:auto阅读(1741)

    Cookie

    Requests通过会话信息来获取cookie信息

    Cookie的五要素:

        Name   value   domain   path  expires


    打印cookie的五大要素

    import requests
    url = "http://www.hao123.com"
    s = requests.session()
    r = s.get(url)
    print (r.cookies)
    for cook in r.cookies:
        print (cook.name)
        print (cook.value)
        print (cook.domain)
        print (cook.path)
        print (cook.expires)
        print ("#" * 30)


    打印结果:

    <RequestsCookieJar[<Cookie BAIDUID=C425EDB0B83699C89BDA3D02B25C53BA:FG=1 for .hao123.com/>, <Cookie hz=0 for .www.hao123.com/>, <Cookie ft=1 for www.hao123.com/>, <Cookie v_pg=normal for www.hao123.com/>]>
    BAIDUID
    C425EDB0B83699C89BDA3D02B25C53BA:FG=1
    .hao123.com
    /
    1548337791
    ##############################
    hz
    0
    .www.hao123.com
    /
    None
    ##############################
    ft
    1
    www.hao123.com
    /
    1516809599
    ##############################
    v_pg
    normal
    www.hao123.com
    /
    None
    ##############################

    你只要获得了登陆页的cookies,你就可对网站进行合理的请求和访问了。

    使用已知cookie信息,如何访问网站:

    import requests
    url = 'http://httpbin.org/cookies'
    r = requests.get(url, cookies={'key1': 'value1', 'key2': 'value2'})
    print(r.text)

    结果:

    {
        "cookies": {
        "key1": "value1",
        "key2": "value2"
        }
    }

    请求到我的IP地址:

    import requests
    url = "http://2017.ip138.com/ic.asp"
    s = requests.session()
    r = s.get(url=url)
    print (r.encoding)
    r.encoding = "gbk"
    print (r.text)


    代理访问:

    采集时为避免被封IP,经常会使用代理。

    requests也有相应的proxies属性。

    西刺代理

    import requests
    proxies = {
    "http": "http://139.208.187.142:8118"
    }
    r1 = requests.get("http://2017.ip138.com/ic.asp", proxies=proxies)
    r1.encoding = "gbk"
    print (r1.text)

    请求结果:

    <html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=gb2312">
    <title> 您的IP地址 </title>
    </head>
    <body style="margin:0px"><center>您的IP是:[139.208.187.142] 来自:吉林省延边朝鲜族自治州 联通</center></body></html>

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

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


    requests的中文乱码问题:

    import requests
    param = {"key1": "hello", "key2": "world"}
    url = 'https://www.baidu.com/'
    r = requests.get(url=url)
    print(r.encoding)              #ISO-8859-1默认使用的是这个
    r.encoding = "utf-8"
    print(r.text)

    这样就可以正常显示了


    总结:

    Requests给你提供的所有接口,在传输数据的时候,都可以以key:value的形式进行传输,这个也是为什么特别使用requests的原因

    如果你使用urllib,那么你就没有这么幸运了,很多事情都需要你自己去处理,并不可以直接通过dict的形式进行传输,需要进行装换。



    Urllib 模块

    在python2和python3上有差异

    在python2上,urllib和urllib2各有各的功能,虽然urllib2是urllib的包装、升级版,但是urllib2还是不能完全替代urllib,而在python3中,则全部封装成1个类:urllib

    python2:
    import urllib
    import urllib2
    python3:
    import urllib


    Request方法:

    import urllib.request
    urllib.request.Request(url, data=None, headers = {}, method= None)


    先看看python2中的urllib2和urllib的区别

    (1)urllib2可以接收一个request对象,并以此可以来设置一个url的headers,但是urllib只可以接收一个url,这就意味着你不能通过urllib伪装自己的请求头。

    举例:

    python2中接收request对象:

    urllib2.Request


    python3中接收request对象:

    urllib.request.Request()

    python3 对这个方法重新进行了封装。


    (2)ullib模板可以提供运行urlencode的方法,该方法用于GET查询字符串的生成,urllib2不具备这样的功能,而且urllib.quote等一系列qoute和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。这就是为什么有时候urllib和urllib2一起使用的原因。(quote 是用来给url转码的)

    举例:

    python2中使用urllib.encode

    data = {"key1":"hello", "key2":"world"}
    d = urllib.encode(data)

    作用:等同于域名后面的参数 www.**.com?key1=hello&key2=world


    python3中使用parse.urlencode

    from urllib import parse
    import urllib.request
    url = "www.hao123.com"
    data = {"key1":"hello", "key2":"world"}
    ndata = parse.urlencode(data) 	#将数据转化成一个字典形式
    print (ndata)
    #打印结果:key1=hello&key2=world
    #继续往下:
    req = urllib.request.Request(url=url, data=ndata.encode("utf-8"))
    res = urllib.request.urlopen(req)
    print (res.read().decode("utf-8"))

    【注意】:urlencode()主要作用就是将url附上要提交的数据。Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码


    方法解释:

    urllib.request.urlopen(url, data=None, timeout=None)
    url    		需要打开的网站
    data    		psot提交的数据
    Timeout       	网站访问的超时时间

    但是没法伪装我们的头信息

    from urllib import request
    req = request.Request(url, headers=headers, data=data)
    html = request.urlopen(req).read()


    如果不自己添加信息,只需要加头信息,即添加一个字典形式的头信息即可访问,如下:

    ... ...
    headers = {"User-Agent":
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"}
    req = urllib.request.Request(url=url, headers=headers)
    res = urllib.request.urlopen(req)
    print (res.read().decode("utf-8"))


    分享链接:时下流行的浏览器User-Agent大全

    http://blog.csdn.net/u012175089/article/details/61199238


    同理,python2同样可以实现添加头信息,请求页面:

    import urllib
    import urllib2
    headers = {"User-Agent":
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"}
    url = "https://www.qiushibaike.com"
    req = urllib2.Request(url, headers=headers)
    res = urllib2.urlopen(req)
    print (res.read())


关键字