zoukankan      html  css  js  c++  java
  • python爬虫(二)

    python爬虫之urllib

    在python2和python3中的差异

    在python2中,urllib和urllib2各有各个的功能,虽然urllib2是urllib的升级版,但是urllib2还是不能完全替代urllib,但是在python3中,全部封装成一个类urllib。

    Urllib2可以接受一个Request对象,并以此可以来设置一个URL的headers,但是urllib只接受一个URL。这就意味着你不能通过urllib伪装自己的请求头。
    Urllib模板可以提供运行urlencode的方法,该方法用于GET查询字符串的生成,urllib2的不具备这样的功能,而且urllib.quote等一系列quote和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。这就是urllib和urllib2一起使用的原因。。quote用来url转码的。

    Request
    import urllib.request
    urllib.request.Request(url, data=None, headers = {}, method= None)
    
    headers = {
          'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                        'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
          'Referer': 'http://www.lagou.com/zhaopin/Python/?labelWords=label',
          'Connection': 'keep-alive'
     }

    http的头信息可以直接使用字典的形式。

    urllib发送数据

    Request如果要发送data,并无法直接传入字典类型的参数,需要进行数据转换,你可以直接使用类似于get传出参数的方法,也可以使用urllib给我们提供的类。

    from urllib import request, parse
    data = {
        'first': 'true',
        'pn': 1,
        'kd': 'Python'
    }
    data = parse.urlencode(data).encode('utf-8')
    print(data)
    结果:
    b'first=true&pn=1&kd=Python‘

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

    urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)

    urlopen

    没法伪装我们的头信息
    urllib.request.urlopen(url, data=None, timeout=None)
    
    url       需要打开的网站
    data      psot提交的数据
    Timeout   网站访问的超时时间

    Request

    可以伪装头信息
    from urllib import request
    req = request.Request(url, headers=headers, data=data)
    html = request.urlopen(req).read()

    urllib的下载

    from urllib import request
    
    url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
    request.urlretrieve(url, "1.jpg")
    
    
    或者通过以下方式
    
    from urllib import request
    
    url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
    req = request.Request(url)
    res = request.urlopen(req)
    text = res.read()
    with open("2.jpg", "wb") as f:
        f.write(text)

    urllib的代理

    from urllib import request, parse
    
    data = {
            'first': 'true',
            'pn': 1,
            'kd': 'Python'
        }
    url = 'http://2018.ip138.com/ic.asp'
    
    proxy = request.ProxyHandler({'http': '113.95.51.146:8118'})  # 设置proxy
    opener = request.build_opener(proxy)  # 挂载opener
    # opener = request.build_opener()  # 挂载opener
    request.install_opener(opener)  # 安装opener
    data = parse.urlencode(data).encode('utf-8')
    page = opener.open(url, data).read()
    print(type(page))
    print(page.decode("gbk"))
    
    结果:<body style="margin:0px"><center>您的IP是:[113.95.51.146] 来自:湖北省武汉市 联通</center></body></html>

    urllib的cookie使用

    如果已经知道cookie,或者说你是通过抓包获取到的cookie,直接放在header的信息中直接登陆就可以;
    登陆京东网站的cookie信息和不登录京东的cookie信息是不一样的。
    你可以登录京东以后,抓取cookie的信息,然后访问任何网站就可以了。

    import urllib.request
    url = “http://www.jd.com"
    header = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
              "cookie": "xxxxx"}
    req = urllib.request.Request(url=url, headers=header)
    res = urllib.request.urlopen(req)
    text = res.read()

    urllib的cookie相关的类

    在python2中cookie的类叫做:import cookielib
    在python3中cookie的类叫做:import http.cookiejar

    opener的概念

    当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。在前面,我们都是使用的默认的opener,也就是urlopen。
    urlopen是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout。
    如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置。

    终端输出cookie对象
    
    import urllib.request
    import http.cookiejar
    
    url = "http://www.hao123.com"
    req = urllib.request.Request(url)
    cookiejar = http.cookiejar.CookieJar()
    handler = urllib.request.HTTPCookieProcessor(cookiejar)
    opener = urllib.request.build_opener(handler)
    r = opener.open(req)
    print(cookiejar)
    <CookieJar[<Cookie BAIDUID=93B415355E0704B2BC94B5D514468898: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/>]>

    Cookie保存到文件中

    import urllib.request
    import http.cookiejar
    
    url = "http://www.hao123.com"
    req = urllib.request.Request(url)
    
    cookieFileName = "cookie.txt"
    cookiejar = http.cookiejar.MozillaCookieJar(cookieFileName)#文件cookie
    handler = urllib.request.HTTPCookieProcessor(cookiejar)
    opener = urllib.request.build_opener(handler)
    r = opener.open(req)
    print(cookiejar)
    cookiejar.save() # 保存在了文件cookie.txt中

    MozillaCookieJar继承FileCookieJar()继承CookieJar

    Cookie从文件中读取cookie信息并访问

    import urllib.request
    import http.cookiejar
    cookie_filename = 'cookie.txt'
    cookie = http.cookiejar.MozillaCookieJar(cookie_filename)
    cookie.load(cookie_filename, ignore_discard=True, ignore_expires=True)
    print(cookie)
    url = "http://www.hao123.com"
    req = urllib.request.Request(url)
    handler = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(handler)  # 利用urllib2的build_opener方法创建一个opener
    response = opener.open(req)
    
    print(response.read().decode(“utf-8”))#解决乱码的问题
  • 相关阅读:
    Elementary Methods in Number Theory Exercise 1.5.2
    Elementary methods in number theory exercise 1.5.1 暨 重启C++之路:列出1到210的所有素数
    Elementary Methods in Number Theory Exercise 1.5.5
    《Elementary Methods in Number Theory》勘误
    Elementary Methods in Number Theory Exercise 1.5.2
    Elementary Methods in Number Theory Exercise 1.5.5
    Linux_我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了)
    寄存器和常用汇编指令
    Linux_AMD体系结构学习(内存模型)
    计算机是如何启动的?
  • 原文地址:https://www.cnblogs.com/yangjian319/p/9188296.html
Copyright © 2011-2022 走看看