zoukankan      html  css  js  c++  java
  • 网络爬虫urllib:request之urlopen

    网络爬虫urllib:request之urlopen

    网络爬虫简介
    • 定义:按照一定规则,自动抓取万维网信息的程序或脚本。

    • 两大特征:

      • 能按程序员要求下载数据或者内容
      • 能自动在网络上流窜(从一个网页跳转到另一个网页)
    • 两大步骤

      • 下载网页
      • 提取正确的信息
      • 根据一定规则自动跳转其它撤销负面上执行以上两步操作
    • 爬虫分类

      • 通用爬虫(常见的搜索引擎)
      • 专用爬虫(聚集爬虫)
    • Python常用的网络包

      • Python3:urllib、requests

    urllib

    • 包含的模块

      • urllib.request:打开和读取urls
      • urllib.error:包含urllib.request产生的常见的错误,使用try捕捉
      • urllib.parse:包含解析url的方法
      • urllib.robotparse:解析robots.txt文件
    • 这个模块的作用:

      • 第一个模块 request,它是最基本的 HTTP 请求模块,我们可以用它来模拟发送一请求,就像在浏览器里输入网址然后敲击回车一样,只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程了。
      • 第二个 error 模块即异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作保证程序不会意外终止。
      • 第三个 parse 模块是一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、合并等等的方法。
      • 第四个模块是 robotparser,主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬的,其实用的比较少。

    request模块

    request.urlopen(url)

    • geturl():返回结果的url
    • info():请求返回对象的meta信息,即网页的元信息,相当于HTTP的头信息
    • getcode():返回http code,如:404,202等信息

    打开网页,并把相应页面作为返回结果。然后可以使用read()读取网页内容。

    注: 打开的网页是bytes类型的,需要使用decode("utf - 8")解码,参数为解码的格式。同时也可以安装chardet模块,它可以自动检测页面的编码格式,当然,不一定准确。

    chardet的使用格式:

    cs = chardet.detect(html) # 得到字典
    decode(cs.get("encoding", "utf - 8")) # 自动检测编码格式并解码,如果检测不到,以默认设置解码
    

    举例:

    使用urllib包中的request模块的方法request.urlopen()打开前程无忧网的任意页面,然后将其结果打印出来。

    # 导入urllib包,并引用request模块
    from urllib import request
    
    # 使用urllib.request请求一个网页内容,把内容打印出来
    
    if __name__ == '__main__':
        # 首先定义好需要访问的网站网页
        url = "https://search.51job.com/list/060000%252C00,000000,0000,00,9,99,Python,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare="
        
        # 然后使用request.urlopen打开相应url并把相应页面作为返回
        rsp = request.urlopen(url)
    
        #把返回结果读取出来
        # 读取出来的内容的类型为bytes字节
        html = rsp.read()
    
        # 由于该网页的编码格式为“gbk”,所以解码时也使用该格式
        html = html.decode("gbk")
    
        print(html)
    
    

    结果:打印出形如以下的结果

    <!DOCTYPE html>
    <html>
    <head>
        <meta>
        <title></title>
    </head>
    <body>
    
        <script>
    
        </script>
    </body>
    </html>
    
    

    特点注意: 使用urlopen()打开的网页结果返回是的tybes类型,需要使用encode()并指定编码格式解码出来才能打印出正确的结果。

    当然,在使用encode()时,每次都需要修改格式,是否有些麻烦,在这里使用chardet模块就是一个不错的选择,程序会自动检测网页的编码格式,然后以相应的编码格式打印网页。

    例: 使用chardet模块检测网页编码格式

    import chardet
    
    ...
    
    html = request.urlopen(url)
    
    # 使用chardet生成编码字典
    cs = chardet.detect(html)
    
    # 自动检测网页编码格式,然后以相应编码格式解码出来,如果没有检测到,使用默认设置格式
    # 使用get取值的目的是保证不出错
    html = html.decode(cs.get("encoding", "utf - 8"))
    print(html)
    
    

    结果还是一样的。

    注意, 使用chardet.detect()生成编码格式字典,然后使用get()可以自动检测网页,其中,get()的参数表示默认格式,如果字典中没有检测出网页的格式,就以其默认设置的格式解码网页。

    geturl、info、getocode的使用

    使用这三个方法,分别可以得到网页的url,meta信息和http code。

    还是以先前的例子为例。

    # 导入urllib包,并引用request模块
    from urllib import request
    
    # 使用urllib.request请求一个网页内容,把内容打印出来
    
    if __name__ == '__main__':
        # 首先定义好需要访问的网站网页
        url = "https://search.51job.com/list/060000%252C00,000000,0000,00,9,99,Python,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare="
        
        # 然后使用request.urlopen打开相应url并把相应页面作为返回
        rsp = request.urlopen(url)
    
        # 返回结果网页的url
        print("URL: {0}".format(rsp.geturl()))
    
        # 得到网页的元信息,相当于HTTP头部信息
        print("Info: {0}".format(rsp.info()))
    
        # http code
        print("Code: {0}".format(rsp.getcode()))
    
    
    

    结果:

    URL: https://search.51job.com/list/060000%252C00,000000,0000,00,9,99,Python,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=
    Info: Date: Mon, 08 Jul 2019 10:12:44 GMT
    Server: Apache
    Set-Cookie: guid=61af6f9db92ec772d5fe3a15809819b2; expires=Wed, 07-Jul-2021 10:12:44 GMT; path=/; domain=.51job.com; httponly
    Set-Cookie: search=jobarea%7E%60060000%7C%21; expires=Tue, 07-Jul-2020 10:12:44 GMT; path=/; domain=.51job.com; httponly
    Set-Cookie: nsearch=jobarea%3D%26%7C%26ord_field%3D%26%7C%26recentSearch0%3D%26%7C%26recentSearch1%3D%26%7C%26recentSearch2%3D%26%7C%26recentSearch3%3D%26%7C%26recentSearch4%3D%26%7C%26collapse_expansion%3D; expires=Tue, 07-Jul-2020 10:12:44 GMT; path=/; domain=.51job.com; httponly
    Set-Cookie: search=jobarea%7E%60060000%7C%21ord_field%7E%600%7C%21; expires=Tue, 07-Jul-2020 10:12:44 GMT; path=/; domain=.51job.com; httponly
    Set-Cookie: nsearch=jobarea%3D%26%7C%26ord_field%3D%26%7C%26recentSearch0%3D%26%7C%26recentSearch1%3D%26%7C%26recentSearch2%3D%26%7C%26recentSearch3%3D%26%7C%26recentSearch4%3D%26%7C%26collapse_expansion%3D; expires=Tue, 07-Jul-2020 10:12:44 GMT; path=/; domain=.51job.com; httponly
    Set-Cookie: search=jobarea%7E%60060000%7C%21ord_field%7E%600%7C%21recentSearch0%7E%601%A1%FB%A1%FA060000%2C00%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FAPython%A1%FB%A1%FA2%A1%FB%A1%FA%A1%FB%A1%FA-1%A1%FB%A1%FA1562580764%A1%FB%A1%FA0%A1%FB%A1%FA%A1%FB%A1%FA%7C%21; expires=Tue, 07-Jul-2020 10:12:44 GMT; path=/; domain=.51job.com; httponly
    Set-Cookie: nsearch=jobarea%3D%26%7C%26ord_field%3D%26%7C%26recentSearch0%3D%26%7C%26recentSearch1%3D%26%7C%26recentSearch2%3D%26%7C%26recentSearch3%3D%26%7C%26recentSearch4%3D%26%7C%26collapse_expansion%3D; expires=Tue, 07-Jul-2020 10:12:44 GMT; path=/; domain=.51job.com; httponly
    Keep-Alive: timeout=10, max=113
    Connection: Keep-Alive
    Transfer-Encoding: chunked
    Content-Type: text/html
    
    
    Code: 200
    

    其中,meta信息相当于http头部信息,包括:日期、Cotent-Type等。

     
     
  • 相关阅读:
    FreePbx
    ntpdate和date
    Linux系统/dev/mapper目录浅谈
    利用rsync做全平台备份
    windows 共享给 linux
    Linux、UNIX设置开机自动运行命令
    JNU周练1019
    JNU周练1013
    2013/7/30 JNU周练
    二叉树遍历
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/11957422.html
Copyright © 2011-2022 走看看