精华内容
下载资源
问答
  • 一.urllib库urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求。其常被用到的子模块在Python3中的为urllib.request和urllib.parse,在Python2中是urllib和urllib2。二.由易到难...

    一.urllib库

    urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求。其常被用到的子模块在Python3中的为urllib.request和urllib.parse,在Python2中是urllib和urllib2。

    二.由易到难的爬虫程序:

    1.爬取百度首页面所有数据值

    #!/usr/bin/env python#-*- coding:utf-8 -*-#导包

    importurllib.requestimporturllib.parseif __name__ == "__main__":#指定爬取的网页url

    url = 'http://www.baidu.com/'

    #通过urlopen函数向指定的url发起请求,返回响应对象

    reponse = urllib.request.urlopen(url=url)#通过调用响应对象中的read函数,返回响应回客户端的数据值(爬取到的数据)

    data = reponse.read()#返回的数据为byte类型,并非字符串

    print(data)#打印显示爬取到的数据值。

    补充说明:

    urlopen函数原型:urllib.request.urlopen(url, data=None, timeout=, *, cafile=None, capath=None, cadefault=False, context=None)

    在上述案例中我们只使用了该函数中的第一个参数url。在日常开发中,我们能用的只有url和data这两个参数。

    url参数:指定向哪个url发起请求

    data参数:可以将post请求中携带的参数封装成字典的形式传递给该参数(暂时不需要理解,后期会讲)

    urlopen函数返回的响应对象,相关函数调用介绍:

    response.headers():获取响应头信息

    response.getcode():获取响应状态码

    response.geturl():获取请求的url

    response.read():获取响应中的数据值(字节类型)

    2.将爬取到百度新闻首页的数据值写入文件进行存储

    #!/usr/bin/env python#-*- coding:utf-8 -*-

    importurllib.requestimporturllib.parseif __name__ == "__main__":

    url= 'http://news.baidu.com/'reponse= urllib.request.urlopen(url=url)#decode()作用是将响应中字节(byte)类型的数据值转成字符串类型

    data =reponse.read().decode()#使用IO操作将data表示的数据值以'w'权限的方式写入到news.html文件中

    with open('./news.html','w') as fp:

    fp.write(data)print('写入文件完毕')

    3.爬取网络上某张图片数据,且存储到本地

    #!/usr/bin/env python#-*- coding:utf-8 -*-

    importurllib.requestimporturllib.parse#如下两行代码表示忽略https证书,因为下面请求的url为https协议的请求,如果请求不是https则该两行代码可不用。

    importssl

    ssl._create_default_https_context=ssl._create_unverified_contextif __name__ == "__main__":#url是https协议的

    url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1536918978042&di=172c5a4583ca1d17a1a49dba2914cfb9&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F0dd7912397dda144f04b5d9cb9b7d0a20cf48659.jpg'reponse= urllib.request.urlopen(url=url)

    data= reponse.read()#因为爬取的是图片数据值(二进制数据),则无需使用decode进行类型转换。

    with open('./money.jpg','wb') as fp:

    fp.write(data)print('写入文件完毕')

    4.url的特性:url必须为ASCII编码的数据值。所以我们在爬虫代码中编写url时,如果url中存在非ASCII编码的数据值,则必须对其进行ASCII编码后,该url方可被使用。

    案例:爬取使用百度根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦’的页面数据)

    #!/usr/bin/env python#-*- coding:utf-8 -*-

    importurllib.requestimporturllib.parseif __name__ == "__main__":#原始url中存在非ASCII编码的值,则该url无法被使用。

    #url = 'http://www.baidu.com/s?ie=utf-8&kw=周杰伦'

    #处理url中存在的非ASCII数据值

    url = 'http://www.baidu.com/s?'

    #将带有非ASCII的数据封装到字典中,url中非ASCII的数据往往都是'?'后面键值形式的请求参数

    param ={'ie':'utf-8','wd':'周杰伦'}#使用parse子模块中的urlencode函数将封装好的字典中存在的非ASCII的数值进行ASCII编码

    param =urllib.parse.urlencode(param)#将编码后的数据和url进行整合拼接成一个完整可用的url

    url = url +paramprint(url)

    response= urllib.request.urlopen(url=url)

    data=response.read()

    with open('./周杰伦.html','wb') as fp:

    fp.write(data)print('写入文件完毕')

    5.通过自定义请求对象,用于伪装爬虫程序请求的身份。

    之前在讲解http常用请求头信息时,我们讲解过User-Agent参数,简称为UA,该参数的作用是用于表明本次请求载体的身份标识。如果我们通过浏览器发起的请求,则该请求的载体为当前浏览器,则UA参数的值表明的是当前浏览器的身份标识表示的一串数据。如果我们使用爬虫程序发起的一个请求,则该请求的载体为爬虫程序,那么该请求的UA为爬虫程序的身份标识表示的一串数据。有些网站会通过辨别请求的UA来判别该请求的载体是否为爬虫程序,如果为爬虫程序,则不会给该请求返回响应,那么我们的爬虫程序则也无法通过请求爬取到该网站中的数据值,这也是反爬虫的一种初级技术手段。那么为了防止该问题的出现,则我们可以给爬虫程序的UA进行伪装,伪装成某款浏览器的身份标识。

    上述案例中,我们是通过request模块中的urlopen发起的请求,该请求对象为urllib中内置的默认请求对象,我们无法对其进行UA进行更改操作。urllib还为我们提供了一种自定义请求对象的方式,我们可以通过自定义请求对象的方式,给该请求对象中的UA进行伪装(更改)操作。

    #!/usr/bin/env python#-*- coding:utf-8 -*-

    importurllib.requestimporturllib.parseimportssl

    ssl._create_default_https_context=ssl._create_unverified_contextif __name__ == "__main__":#原始url中存在非ASCII编码的值,则该url无法被使用。

    #url = 'http://www.baidu.com/s?ie=utf-8&kw=周杰伦'

    #处理url中存在的非ASCII数据值

    url = 'http://www.baidu.com/s?'

    #将带有非ASCII的数据封装到字典中,url中非ASCII的数据往往都是'?'后面键值形式的请求参数

    param ={'ie':'utf-8','wd':'周杰伦'}#使用parse子模块中的urlencode函数将封装好的字典中存在的非ASCII的数值进行ASCII编码

    param =urllib.parse.urlencode(param)#将编码后的数据和url进行整合拼接成一个完整可用的url

    url = url +param#将浏览器的UA数据获取,封装到一个字典中。该UA值可以通过抓包工具或者浏览器自带的开发者工具中获取某请求,从中获取UA的值

    headers={'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}#自定义一个请求对象

    #参数:url为请求的url。headers为UA的值。data为post请求的请求参数(后面讲)

    request = urllib.request.Request(url=url,headers=headers)#发送我们自定义的请求(该请求的UA已经进行了伪装)

    response =urllib.request.urlopen(request)

    data=response.read()

    with open('./周杰伦.html','wb') as fp:

    fp.write(data)print('写入数据完毕')

    展开全文
  • 何为 headers 呢, ... 通俗的来说,headers就是用户发送给网页的信息。 那么headers对我们开发爬虫来说有什么实际意义呢? 我们使用python开发爬虫去爬取网页,很容易被服务器识别为“非人类”,从而被服务器拒绝访问...

    在正式文章之前呢,先讲一下 HTTP headers

    何为 headers 呢,
    HTTP Headers是HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。

    通俗的来说,headers就是用户发送给网页的信息。
    那么headers对我们开发爬虫来说有什么实际意义呢?
    我们使用python开发爬虫去爬取网页,很容易被服务器识别为“非人类”,从而被服务器拒绝访问,导致我们无法爬取页面,而我们利用headers就可以让爬虫伪装成“人类”获取网页信息。

    一般我们要使用的headers信息有 :cookie,referer, user-agent
    那么怎么查看headers呢?
    在我们打开目标网页后,按F12打开控制台,再按下F5刷新页面:
    在这里插入图片描述
    第一个箭头指向的圆点可以暂停一下,可以定位到我们最开始的请求,也就是第二个箭头指向的位置,点第二个箭头指向的位置,就可以看到第三个箭头指向的位置,我们点进去可以看到:在这里插入图片描述
    我们要的headers信息都在

    urllib:

    这是我们爬取baidu首页的代码:
    注:此代码无法直接运行,需要先将代码段中标注位置修改为使用者的headers

    # -*- coding: utf-8 -*-
    """
    Created on Sat Sep 11 12:42:05 2021
    
    @author: Napoléon Bonaparte
    """
    
    import urllib  #引入 urllib 库
    
    
    
    def main(): 
        askurl("https://www.baidu.com/")
    
    
    
    def askurl(url):
        head = {"User-Agent": "你找出来的User-Agent "}
        request = urllib.request.Request(url,headers=head)
        
        html = " "
        
        try:
            response = urllib.request.urlopen(request)
            html = response.read().decode("utf-8")
            print(html)
            
            fh_save(html)
            
        except urllib.error.URLError as e :
            if hasattr(e, "code"):
                print(e.code)
            if hasattr(e, "reason"):
                print(e.reason)
    
        return html
    
    
    #此函数是用来保存文件的
    def fh_save(file_name):
            fh = open('save.html','w',encoding='utf-8')
            fh.write(file_name)
            fh.close()
    
    
    
    
    
           
    if __name__ == "__main__":    #执行主函数
    	main()
    	print("执行完毕!")        
        
    
    

    将文字标注位置换为使用者User-Agent即可爬取百度首页,爬取内容保存在py代码文件根目录下。

    下面为代码段讲解:

    head = {"User-Agent": "你找出来的User-Agent "}
        request = urllib.request.Request(url,headers=head)
    

    此段代码使用 head 作为字典保存了User-Agent信息,在我们实际使用时,也可将cookie,referer信息保存在head中
    request 封装了用户代理,表示告诉我们将要访问的 url 的 headers信息

    try:
            response = urllib.request.urlopen(request)
            html = response.read().decode("utf-8")
            print(html)
            
            fh_save(html)
            
    except urllib.error.URLError as e :
            if hasattr(e, "code"):
                print(e.code)
            if hasattr(e, "reason"):
                print(e.reason)
    
    #此函数是用来保存文件的
    def fh_save(file_name):
            fh = open('save.html','w',encoding='utf-8')
            fh.write(file_name)
            fh.close()
    

    此段代码是 try except 语句,类似C++中的 if else
    而我们真正开始爬取目标网站的代码是:
    response = urllib.request.urlopen(request)
    此代码表示通过 urllib 库 中的 request.urlopen 传递我们已经封装好的对象 request
    此时 response 已经保存了爬取目标网页信息

    html = response.read().decode(“utf-8”)
    这一行中的 decode(“utf-8”)指的是‘’以utf-8‘’规则对网页信息解码,使用utf-8可以让网页包含中文。

    except urllib.error.URLError as e :
    if hasattr(e, “code”):
    print(e.code)
    if hasattr(e, “reason”):
    print(e.reason)

    这段代码是在不能访问目标页面的情况下执行的,urllib.error.URLError 的作用是收集报错代码。
    不得不指出的是,如果收集到的报错代码是418,则是被服务器识别出来不是‘人类’在操作,需要去修改headers,让我们的爬虫伪装的更像人类操作。

    当我们成功运行代码之后,返回到我们的根目录下查看,会发现多出来一个 save.html 的文件,我们使用浏览器打开,会发现这就是我们爬取到的 baidu.com 首页。

    在这里插入图片描述

    展开全文
  • 【python】urllib库之四大模块

    千次阅读 多人点赞 2018-09-18 15:57:59
    文章目录urllib库urllib库四大模块1:urlopen()2:data参数3:timeout参数二:request.Request方法1:一般用法2:高级用法1:验证2:代理3:Cookies三:异常处理1:URLError2:HTTPError四:解析链接1:urlparse...


    【前言】
    有好一段时间都没敲py了, 今天将urllib库算是较全的学习了一下老实说还是敲py比较舒服,当然还有requests,Beautiful库,正则表达式这些对于进行对爬去文章的处理都是不可避免的。

    urllib库

    一 urllib库四大模块

    1:request

    http请求模块,可以用来模拟发送请求。就好比在浏览器中输入网址然后回车一样,只需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程。

    2:error

    3:parse

    一个工具模块,提供了好多URL处理方法,比如拆分,解析,合并等。

    4:robotparser

    主要用来识别网址的robots.txt文件,然后判断哪些网站可以爬,哪些网站不可以爬,它用的很少。

    1:urlopen()
    """
    作者:贾继康
    时间:
    程序功能:rullib.request 模拟浏览器的一个请求发送过程
             目的:获取网页的源代码
    """
    # 导入rullib库
    import urllib.request
    response = urllib.request.urlopen('https://www.python.org');
    print(response.read().decode('utf-8')) # 以编码utf-8的格式进行请求阅读
    
    2:data参数
    """
    作者:贾继康
    时间:
    程序功能:urlopen()参数
    """
    import urllib.request # 请求模块
    import urllib.parse # urllib库中的工具模块
    # 传递一个参数:word,值:hello-------》转字节流使用bytes()方法:第一个参数:str类型,需要使用urllib.parse模块
    # 中的urlopen()方法来将参数字典转换为字符串,第二个参数:编码格式:utf-8
    
    data = bytes(urllib.parse.urlencode({'word': 'hello'}),encoding='utf-8')
    response = urllib.request.urlopen('http://httpbin.org/post',data=data)
    print('\n',response.read())
    
    
    3:timeout参数
    """
    作者:贾继康
    时间:
    程序功能:
    """
    import socket# 判断异常
    import urllib.error
    import urllib.request
    try:
        response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)
    except urllib.error.URLError as e:
        # socket.timeout超时异常
        if isinstance(e.reason, socket.timeout):
            print('时间超时')
    

    二:request.Request方法

    1:一般用法
    """
    作者:贾继康
    时间:
    程序功能:Request类
    class urllib.request.Request(url,data=None, headers={},orgin_req_host=None,unverifiable=False,metho=None)
    """
    """
    import urllib.request
    request = urllib.request.Request('http://httpbin.org/get')# 请求响应
    response = urllib.request.urlopen(request)# 使用urlopen()方法来发送请求:Request类型的对象
    print(response.read().decode('utf-8'))
    
    """
    from urllib import request,parse # 请求和处理方法
    
    url = "http://httpbin.org/post"
    headers = {
        # 伪装成谷歌浏览器
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.12 Mobile Safari/537.36',
        'Host': 'httpbin.org'
    }
    dict = {
        'name': 'Germey'
    }
    
    data = bytes(parse.urlencode(dict),encoding='utf-8')
    # req = request.Request(url=url, data=data,method='POST')
    # req.add_header('User_Agent','Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.12 Mobile Safari/537.36')
    req = request.Request(url=url, data=data, headers=headers, method='POST')
    response = request.urlopen(req)
    print(response.read().decode('utf-8'))
    
    
    
    

    结果

    {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "name": "Germey"
      }, 
      "headers": {
        "Accept-Encoding": "identity", 
        "Connection": "close", 
        "Content-Length": "11", 
        "Content-Type": "application/x-www-form-urlencoded", 
        "Host": "httpbin.org", 
        "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.12 Mobile Safari/537.36"
      }, 
      "json": null, 
      "origin": "182.245.65.138", 
      "url": "http://httpbin.org/post"
    }
    
    2:高级用法
    1:验证

    当请求的一个网页需要验证:提示输入用户名和密码

    """
    作者:贾继康
    时间:
    程序功能:
    """
    # HTTPBasicAuthHandler:用于管理密码,为何用户名和密码的表
    # build_opener()方法构建一个Opener:Opener在发送请求的时候就相当于已经验证成功
    from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
    from urllib.error import URLError #  导入错误提示包
    
    username = 'username'
    password = 'password'
    url = 'http://localhost:5000/'# 一个需要验证的网址
    
    p = HTTPPasswordMgrWithDefaultRealm()# 实例化HTTPBasicAuthHandler对象,参数是 HTTPPasswordMgrWithDefaultRealm对象
    p.add_password(None,url,username,password)
    auth_hander = HTTPBasicAuthHandler(p)
    opener = build_opener(auth_hander)# build_opener()方法构建一个Opener:Opener在发送请求的时候就相当于已经验证成功
    
    try:
        result = opener.open(url)# 使用opener的open()打开这个链接
        html = result.read().decode('utf-8')
        print(html)
    except URLError as e:
        print(e.reason)
    
    2:代理
    """
    作者:贾继康
    时间:
    程序功能:代理服务器
    1:ProxyHandler:参数是一个字典---》键名:协议类型,键值:代理链接(可以添加多个代理)
    2:然后使用Hander以及build_opener()方法构造一个opener
    3: 发送请求
    """
    from urllib.error import URLError
    from urllib.request import ProxyHandler,build_opener
    
    
    proxy_hander = ProxyHandler({
        'http': 'http://127.0.0.1:9743',
        'https': 'http://127.0.0.1:9743'
    })
    # 使用build_opener()方法构建一个opener
    opener = build_opener(proxy_hander)
    try:
        response = opener.open('https://www.baidu.com')
        print(response.read().decode('utf-8'))
    except URLError as e:
        print(e.reason)
    
    3:Cookies
    """
    作者:贾继康
    时间:
    程序功能:
       获取网站的Cookies
       1:声明CookieJar对象
       2:urllib.request.HTTPCookieProcessor(cookie)构建一个Handler
       3:利用build_opener()方法构建一个opener
       4: 执行open()函数
    
       改进版本:V2.0
       CookieJar改写成:MozillaCookieJar--生成文件时将会用到
       比如:读取和保存Cookies,可以将Cookies保存成Mozilla型浏览器的Cookies格式
    
       改进版本:V3.0
       保存格式:libwww-perl(LWP)格式的Cookies文件
       要改成libwww-perl(LWP)格式的Cookies文件只需要声明:cookie = http.cookiejar.LWPCookieJar(filename)
    
    """
    import http.cookiejar,urllib.request
    
    """
    cookie = http.cookiejar.CookieJar()# 1 声明CookieJar对象
    handler = urllib.request.HTTPCookieProcessor(cookie) # 2
    opener = urllib.request.build_opener(handler) # 3
    
    response = opener.open('http://www.baidu.com')
    for item in cookie:
        print(item.name+"="+item.value)
    结果:
        BAIDUID=77B6920A1FCACD2B94C2905DD2B83C90:FG=1
        BIDUPSID=77B6920A1FCACD2B94C2905DD2B83C90
        H_PS_PSSID=1445_21110_22074
        PSTM=1537189285
        BDSVRTM=0
        BD_HOME=0
        delPer=0
    
    """
    
    """
    # V2.0
    filename = 'cookies.txt'
    cookie = http.cookiejar.MozillaCookieJar(filename)
    handler  = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(handler)
    
    response = opener.open('http://www.baidu.com')
    cookie.save(ignore_discard=True,ignore_expires=True)
    
    """
    
    """
    # V3.0
    filename = 'cookies.txt'
    cookie = http.cookiejar.LWPCookieJar(filename)
    handler  = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(handler)
    
    response = opener.open('http://www.baidu.com')
    cookie.save(ignore_discard=True,ignore_expires=True)
    
    """
    # 针对V3.0格式读取并利用
    cookie = http.cookiejar.LWPCookieJar()
    # 使用load()加载本地的cookies文件
    cookie.load('cookies.txt',ignore_discard=True,ignore_expires=True)
    # 获取Cookies的内容
    handler = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(handler)
    
    response = opener.open('http://www.baidu.com')
    print(response.read().decode('utf-8'))# 输出百度网页的源代码
    

    三:异常处理

    1:URLError
    """
    作者:贾继康
    时间:
    程序功能:
    """
    from urllib import request,error
    try:
        response = request.urlopen('http://jiajiknag.com/index.html')
    except error.URLError as e:
        print('页面不存在!!!')
    
    2:HTTPError
    """
    作者:贾继康
    时间:
    程序功能:
            HTTPError 子类
            URLError 父类
            先捕获子类的错误后捕获父类的错误
    
    """
    from urllib import request,error
    try:
        response = request.urlopen('http://jiajiknag.com/index.html')
    except error.HTTPError as e:
        print(e.reason,e.code,e.headers,sep='\n')
    except error.URLError as e:
        print(e.reason)
    else:
        print('Request.Sucessfully')
    

    四:解析链接

    1:urlparse()
    """
    作者:贾继康
    时间:
    程序功能:
    """
    from urllib.parse import urlparse # 该方法可以实现URL 的识别和分段
    result = urlparse('http://www.baidu . com/index .htr比u ser?id=S#comment')
    print(type(result),result)
    

    结果:

    <class 'urllib.parse.ParseResult'> ParseResult(scheme='http', netloc='www.baidu . com', path='/index .htr比u ser', params='', query='id=S', fragment='comment')
    

    urlparse ()方法将其拆分成了6 个部分 :
    ://前面的就是scheme ,代表协议;

    第一个/符号前面便是netloc ,即域名,

    后面是path ,即访问路径;

    分号;前面是params ,代表参数;

    问号?后面是查询条件query , 一般用作GET 类型的URL;
    井号#后面是锚点,用于直接定位页面内部的下拉位置。

    urlparse ()方法其他配置

    1:urlstring

    2:scheme

    3:allow_fragments

    """
    作者:贾继康
    时间:
    程序功能:
    """
    """
    from urllib.parse import urlparse # 该方法可以实现URL 的识别和分段
    result = urlparse('http://www.baidu . com/index .htr比u ser?id=S#comment')
    print(type(result),result)
    """
    """
    scheme:默认的协议
    from urllib.parse import urlparse # 该方法可以实现URL 的识别和分段
    # scheme:默认的协议
    result = urlparse('http://www.baidu . com/index .htr比u ser?id=S#comment',scheme='https')
    # print(type(result),result)
    print(result)
    结果:ParseResult(scheme='http', netloc='www.baidu . com', path='/index .htr比u ser', params='', query='id=S', fragment='comment')
    """
    
    # 即是否忽略fragment 。如果它被设置为False ,干ragment 部分就会被忽略,
    # 它会被解析为path 、parameters 或者query 的一部分,而fragment 部分为空。
    from urllib.parse import urlparse # 该方法可以实现URL 的识别和分段
    # scheme:默认的协议
    result = urlparse('http://www.baidu . com/index .htr比u ser?id=S#comment',allow_fragments=False)
    # print(type(result),result)
    print(result)
    
    
    
    2:urlunparse()
    """
    作者:贾继康
    时间:
    程序功能:有了urlparse(),
             相应地就有了它的对立方法urlunp arse () 。它接受的参数是一个可迭代对象,
             但是它的长度必须是6 , 否则会抛出参数数量不足或者过多的问题。
    """
    from urllib.parse import urlunparse
    
    data = ['http','www.baidu.com','index.html','user','a=6','comment']
    print(urlunparse(data))
    

    结果:

    http://www.baidu.com/index.html;user?a=6#comment
    
    3:urlsplit()
    """
    作者:贾继康
    时间:
    程序功能:这个方法和urlparse() 方法非常相似,
             只不过它不再单独解析params 这一部分,只运回5个结果。
    """
    from urllib.parse import urlsplit
    result = urlsplit('http://www.baidu . com/index .htr比u ser?id=S#comment')
    # 返回结果是Spli tResult , 它其实也是一个元组类型, 既可以用属性获取值,也可以
    # 用泵’引来获取。
    print(result)
    print(result.scheme,result[0])
    
    4:urlunsplit()
    """
    作者:贾继康
    时间:
    程序功能:
         它也是将链接各个部分组合成完整链接的方法,传人的参数也是一个可迭
         代对象,例如列表、元组等,唯一的区别是长度必须为5 。
    """
    from urllib.parse import urlunsplit
    data = ['http','www.baidu.com','index.html','a=6','comment']
    print(urlunsplit(data))
    

    结果:

    http://www.baidu.com/index.html?a=6#comment
    
    5:urljoin()
    """
    作者:贾继康
    时间:
    程序功能:
         生成链接还有另一个方法,那就是urljoin(I)方法。我们可以提供一个base_url (基础链
    接) 作为第一个参数,将新的链接作为第二个参数.
         该方法会分析base_url 的scheme 、netloc 和path这3 个内容并对新链接缺失的部分进行补充,最后返回结果。
    """
    from urllib.parse import urljoin
    print(urljoin('http://www.baidu.com', 'FAQ.html'))
    print(urljoin('http://www.baidu.com ', 'https://cuiqingcai.com/FAQ.html'))
    print(urljoin('http://www.baidu.com/about.html', 'https://cuiqingcai.com/FAQ.html'))
    print(urljoin('http://www.baidu.com/about.html', 'https://cuiqingcai.com/FAQ.html?question=2'))
    print(urljoin('http://www.baidu.com讪d=abc', 'https://cuiqingcai.com/index.php'))
    print(urljoin('http://www.baidu.com', '?category=2#comment'))
    print(urljoin('www.baidu.com', '?category=2#comment'))
    print(urljoin('www.baidu.com#co阳nent', '?category=2'))
    

    结果:

    http://www.baidu.com/FAQ.html
    https://cuiqingcai.com/FAQ.html
    https://cuiqingcai.com/FAQ.html
    https://cuiqingcai.com/FAQ.html?question=2
    https://cuiqingcai.com/index.php
    http://www.baidu.com?category=2#comment
    www.baidu.com?category=2#comment
    www.baidu.com?category=2
    
    6:urlencode()
    """
    作者:贾继康
    时间:
    程序功能:声明了一个字典来将参数表示出来,然后调用urlencode ()方法将其序列化为GET 请求
    参数。
    
    """
    from urllib.parse import urlencode
    params = {
        'name': 'germey',
        'age': 22
    }
    
    base_url = 'http://www.baidu.com?'# 创建一个链接
    url = base_url + urlencode(params)
    print(url)
    

    结果:

    http://www.baidu.com?name=germey&age=22
    
    7:parse_qs()
    """
    作者:贾继康
    时间:
    程序功能:parse_qs()方法, 就可以将它转回字典,示例如下:
    """
    from urllib.parse import parse_qs
    query = 'name=jiajikang&age=20'
    print(query)
    print(parse_qs(query))
    
    

    结果:

    name=jiajikang&age=20
    {'name': ['jiajikang'], 'age': ['20']}
    
    8:parse_qsl()
    """
    作者:贾继康
    时间:
    程序功能:还有一个parse_qsl()方法,它用于将参数转化为元组组成的列表,
    """
    from urllib.parse import parse_qsl
    query = 'name=jiajiknag&age=22'
    print(parse_qsl(query))
    

    结果:

    [('name', 'jiajiknag'), ('age', '22')]
    
    9:quote()
    """
    作者:贾继康
    时间:
    程序功能:
          该方法可以将内容转化为URL 编码的格式。URL 中带有中文参数时,有时可能会导致乱码的问题,
     此时用这个方法可以将巾文字符转化为U RL 编码
    """
    from urllib.parse import quote
    keyword = '贾继康'
    url = 'https://www.baidu.com/s?wd=' + quote(keyword)
    print(url)
    

    结果:

    https://www.baidu.com/s?wd=%E8%B4%BE%E7%BB%A7%E5%BA%B7
    

    #####10:unquote()

    """
    作者:贾继康
    时间:
    程序功能:它可以进行URL 解码
    """
    from urllib.parse import unquote
    
    url = 'https://www.baidu.com/s?wd=%E8%B4%BE%E7%BB%A7%E5%BA%B7'
    print(unquote(url)) 
    

    结果:

    https://www.baidu.com/s?wd=贾继康
    

    五:分析Robots协议(urllib库中得robotparser模块)

    1:Robots协议

    Robots 协议也称作爬虫协议、机器人协议,它的全名叫作网络爬虫排除标准( Robots Exclusion Protocol ),用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取。它通常是一个叫作robots.txt的文本文件,一般放在网站的根目录下。当搜索爬虫访问一个站点时,它首先会检查这个站点根目录下是否存在robots.txt 文件,如果存在,搜索爬虫会根据其中定义的爬取范围来爬取。如果没有找到这个文件,搜索爬虫便会访问所有可直接访问的页面。

    2:爬虫名称
    爬虫名称 名称 网
    BaiduSpider 百度 www .baidu.com
    Googlebot 谷歌 www.google.com
    360Spider 360搜索 www.so.com
    YodaoBot 有道 www.youdao.com
    ia archiver Alexa www.alexa.cn
    3:robotparser(判断网页是否可以被抓取)

    了解Robots 协议之后,我们就可以使用ro bot parser 模块来解析robots.txt 了。该模块提供了一个
    类RobotFileParser ,它可以根据某网站的robots.txt 文件来判断一个爬取爬虫是否有权限来爬取这个
    网页。
    该类用起来非常简单,只需要在构造方法里传人robots.txt 的链接即可。首先看一下它的声明:
    urllib.robotparser.RobotFileParser(url =’ ’)
    当然,也可以在声明时不传人,默认为空,最后再使用set_url ()方法设置一下也可。
    下面列刷了这个类常用的几个方法。
    1:set_url(): 用来设置ro bots . txt 文件的链接。如果在创建RobotFileParser 对象时传入了链
    接,那么就不需要再使用这个方法设置了。
    2:read(): 读取robots .txt 文件并进行分析。注意,这个方法执行一个读取和分析操作,如果不
    调用这个方法, 接下来的判断都会为False ,所以一定记得调用这个方法。这个方法不会返
    回任何内容,但是执行了读取操作。
    3:parse(): 用来解析robots.txt文件,传人的参数是robots . txt 某些行的内容,它会按照robots.txt
    的语法规则来分析这些内容。
    4:can_fetch():该方法传人两个参数, 第一个是Use r-age nt ,第二个是要抓取的URL 。返回的
    内容是该搜索引擎是否可以抓取这个URL ,返回结果是True 或False a
    5:mtime(): 返回的是上次抓取和分析robots.txt 的时间,这对于长时间分析和抓取的搜索爬虫是
    很有必要的,你可能需要定期检查来抓取最新的robots.txt 。
    6:modified():它同样对长时间分析和抓取的搜索爬虫很有帮助,将当前时间设置为上次抓取
    和分析robots.txt 的时间。

    """
    作者:贾继康
    时间:
    程序功能:判断网页是否可以被抓取
              1:创建RobotFileParser()对象
              2:set_url()方法设置robots.txt的链接
    
    """
    
    from urllib.robotparser import RobotFileParser
    rp = RobotFileParser()
    rp.set_url('http://www.jianshu.com/robots.txt')
    rp.read()
    print(rp.can_fetch('*','http://www.jianshu.com/p/b67554025d7d'))
    print(rp.can_fetch('*', 'http://www.jianshu.com/search?q=python&page=1&type=collections'))
    

    结果:

    False
    False
    
    展开全文
  • urllib库与requests库

    2019-12-04 11:49:57
    urllib url="http://category.dangdang.com/pg1-cid4008154.html" import urllib.request headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chro...

    同样是爬某网站的商品标题

    urllib

    url="http://category.dangdang.com/pg1-cid4008154.html"
    import urllib.request
    headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0",
            "Content-Type":"application/javascript",
             }
      ##############################################################
    opener=urllib.request.build_opener()
    headall=[]
    for key,value in headers.items():
        item=(key,value)
        headall.append(item)
    opener.addheaders=headall
    urllib.request.install_opener(opener) 
    data=urllib.request.urlopen(url).read().decode("gbk")
      ##############################################################
    from lxml import etree
    html = etree.HTML(data)
    href_list = html.xpath("//a[@name='itemlist-picture']/@title")
    href_list
    

    requests

    url="http://category.dangdang.com/pg1-cid4008154.html"
    import requests
    headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0",
            "Content-Type":"application/javascript",
             }
      ##############################################################
    r=requests.get(url,headers=headers)
    html = r.content.decode('gbk')
      ##############################################################
    from lxml import etree
    html = etree.HTML(html)
    href_list = html.xpath("//a[@name='itemlist-picture']/@title")
    href_list[0:10]
    

    输出

    [' Lily冬粉紫韩版直筒中长款双面呢大衣羊毛大衣女',
     ' Lily春秋新款女装纯色直筒毛呢大衣中长款毛呢大衣117410F1556',
     ' 【1件3折!限时购!到手价:126元】裂帛2019春新款时尚圆领绣花休闲甜美风清新韩版学生长袖卫衣女',
     ' 【到手价449元】加厚女羽绒面包服秋冬季新款韩版学生小棉袄短款外套棉衣',
     ' 【到手价299元】百搭羊羔毛外套女新款小个子呢子韩版短款毛呢外套女学生',
     ' 【2.5折价:79.75元/叠加40元券】茵曼秋装新款连帽印花抽绳宽松休闲运动长袖卫衣女【1883082079】',
     ' Lily春新款女装商务通勤OL深宝蓝拉链毛呢外套117420F1543',
     ' 【领券下单立减120元】Amii韩版ins高领加厚加绒卫衣女2019秋冬新款宽松印花长袖上衣',
     ' 【明星同款】Lily2018冬新款直筒人字纹双面呢长款大衣118419F1901',
     ' 【到手价149元】长袖运动服女新款韩版学生宽松时尚bf短款拉夏贝尔情侣外套']
    
    展开全文
  • urllib库的常用方法

    2019-10-16 14:13:37
    urllib urllib 是一个用来处理网络请求的python标准,它包含4个模块。 2. urllib.parse #解析模块,用于解析URL 3. urllib.error #异常处理模块,用于处理request引起的异常 4. urllib.robotparse #用于解析...
  • urllib库中的urllib.parsel解析模块使用

    千次阅读 2018-12-23 17:16:05
    目前urllib.parse模块下主要有urllib.parse.urlpase,urllib.parse.urlunparse,urlliib.parse.urljoin和urlencode常用几个方法。 1.urlparse()的使用 urlparse模块主要是把url拆分为6部分,并返回元组。urlpa...
  • 上一篇我简单说了说爬虫的原理,这一篇我们来讲讲python自带的请求库:urllib在python2里边,用urllib库和urllib2库来实现请求的发送,但是在python3种在也不用那么麻烦了,因为只有一个库了:Urllib.urllib库是...
  • urllib库(python内置库)

    2020-02-29 23:26:04
    urllib import request resp = request . urlopen ( "https://www.sogou.com/" ) print ( resp . read ( ) ) #若显示二进制代码,可以进行转码,以上print代码写为:print(resp.read().decode('utf-8')) ...
  • urllib库相关 urllib库常用有四个模块,常用前三个 urllib.request urllib.error urllib.parse urllib.robotparser 一.urllib.request 1.urlopen() urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,...
  • 使用urllib库爬取百度贴吧 原代码如下 import urllib.request import urllib.parse def tieba_spider(url,begin_page,end_page): ''' 作用:贴吧爬虫调度器,负责组合处理每个页面的url url:贴吧url的前半部分 ...
  • urllib库

    2019-11-29 15:25:00
    urllib库 一、urllib简介 urllib 是一个用来处理网络请求的python内置标准库,它包含4个模块 urllib.request:HTTP请求模块,用于模拟浏览器发起网络请求 urllib.parse:解析模块,用于解析URL urllib.error:异常...
  • Python3 urllib库的使用

    2020-12-20 06:41:02
    什么是 Urllib urllib 是Python内置的 HTTP 请求urllib 模块提供的上层接口,使访问 www 和 ftp 上的数据就像访问本地文件一样。有以下几种模块:1.urllib.request 请求模块urllib.error 异常处理模块...
  • 什么是Urllib库

    千次阅读 2018-11-12 23:56:01
    在Python2.X中,有Urllib库,也有Urllib2库,但是在最新的Python3.X中,将Urllib2合并到了Urllib中,这个库在我们爬取网页的时候会经常用到。 升级合并后,模块中的包的位置变化的地方较多,以下是一些常见的变动:...
  • Urllib库

    千次阅读 2021-01-06 12:58:53
    在 Python 的 urllib 中,所有和网络请求相关的方法,都被集到 urllib.request 模块下面。 urtopen 函数的基本使用: from urllib import request resp = request.urlopen('http://www.baidu.com') print(resp....
  • urllib库的基本使用

    2019-08-21 15:14:51
    urllib库介绍 urllib是python3内置的HTTP请求库,包含request,error,parse,robotparser四个基本模块,分别用于发送请求,异常处理,URL解析处理,识别robots协议。 request模块 urlopen() 方法 urlopen(url, ...
  • urllib库与os库一、如何在Pycharm中导入第三方库二、urllib库1、urllib网络访问2、urllib网络图片爬取三、os库 如果说强大的标准库奠定了python发展的基石,丰富的第三方库则是python不断发展的保证,随着python的...
  • Urllib库是Python中的一个功能强大、用于操作URL,并在做爬虫的时候经常要用到的库。在Python2.x中,分为Urllib库和Urllib2库,Python3.x之后都合并到Urllib库中,使用方法稍有不同。本文介绍的是Python3中的urllib...
  • urllib库详解

    2019-01-07 23:48:57
    urllib是Python中自带的内建模块,提供了一系列用于操作URL的功能。 urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None) 第一个参数url是必须传入的,其他参数可以根据...
  • 文章目录urlliburllib2的基本使用urlopenRequestUser-Agent添加更多的Header信息URL编码转换urlliburllib2的高级用法Handler处理器 和 自定义Opener简单的自定义opener()ProxyHandler处理器(代理设置)Cookie...
  • urllib库总结

    2019-09-07 14:28:07
    在Python中有很多可以用来抓取网页,urllib就是其中的一个,就是用来抓取网页的, urllib有几个主要的模块------->request模块,它是urllib最基本的http请求模块,可以用来模拟发送请求,就像在浏览器中输入网址,...
  • urllib库parse模块用法总结

    千次阅读 2017-12-19 18:41:46
    urllib库parse模块用法总结如下: # !/usr/bin/env python # -*- coding:utf-8 -*- """ urllib.parse 处理URL的模块 """ import urllib.parse # 解析url,返回包含url信息的6元元组 res=urllib.parse.urlparse(...
  • Python中有很多可以用来抓取网页 写过爬虫的同学都知道,无论什么爬虫大体思路都是相同的,都是要分析网络请求地址,模拟发送请求,然后解析返回的数据,最后保存相应的信息 爬虫分类 通用爬虫(General Purp.....
  • Python爬虫——urllib库的基本使用

    千次阅读 2019-01-18 20:46:04
    什么是Urllib  urlopen 以GET形式发送请求,获取响应体的内容 以POST方式发送请求 判断错误类型是否为超时 响应(response) 响应类型 状态码,响应头 Request(传递Headers) 结果与例一一致 方法一 ...
  • 一、认识requests和urllib工具 二、urllib的具体使用 1.urllib的request模块的urlopen方法可以发送http请求,具体使用: 2.使用response.read()可以获得响应体的内容,具体使用: 3.设置请求头部信息:headers...
  • 对于请求一些网站,我们需要加上请求...import urllib.request url="http://www.meizitu.com" #注意:在urllib 中headers是元组 headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTM

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,707
精华内容 3,082
关键字:

urllib库的作用