关于python爬虫应用urllib库作用分析

编辑: admin 分类: python 发布时间: 2021-12-04 来源:互联网
目录
  • 一、urllib库是什么?
  • 二、urllib库的使用
    • urllib.request模块
    • urllib.parse模块
    • 利用try-except,进行超时处理
    • status状态码 && getheaders()
  • 突破反爬

    一、urllib库是什么?

    urllib库用于操作网页 URL,并对网页的内容进行抓取处理

    urllib包 包含以下几个模块:

    urllib.request - 打开和读取 URL。

    urllib.error - 包含 urllib.request 抛出的异常。

    urllib.parse - 解析 URL。

    urllib.robotparser - 解析 robots.txt 文件

    python爬虫主要用到的urllib库中的request和parse模块

    二、urllib库的使用

    下面我们来详细说明一下这两个常用模块的基本运用

    urllib.request模块

    urllib.request 定义了一些打开 URL 的函数和类,包含授权验证、重定向、浏览器 cookies等。

    语法如下:

    urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,

    capath=None, cadefault=False, context=None)

     url:url 地址。

    data:发送到服务器的其他数据对象,默认为 None。

    timeout:设置访问超时时间。

    cafile capath:cafile 为 CA 证书, capath 为 CA 证书的路径,使用 HTTPS 需要用到。

    cadefault:已经被弃用。

    context:ssl.SSLContext类型,用来指定 SSL 设置。

    # -*- codeing = utf-8 -*-
    # @Author: Y-peak
    # @Time : 2021/9/2 19:24
    # @FileName : testUrllib.py
    # Software : PyCharm
    import urllib.request
    #get请求
    response = urllib.request.urlopen("http://www.baidu.com")  #返回的是存储网页数据的对象
    #print(response)  可以尝试打印一下看一下
    print(response.read().decode('utf-8')) #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码
    

    在这里插入图片描述

    将其打印的内容写到一个html文件中,打开和百度一毛一样

    # -*- codeing = utf-8 -*-
    # @Author: Y-peak
    # @Time : 2021/9/2 19:24
    # @FileName : testUrllib.py
    # Software : PyCharm
    import urllib.request
    response = urllib.request.urlopen("http://www.baidu.com")  #返回的是存储网页数据的对象
    data = response.read().decode('utf-8')  #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码
    #print(data)
    with open("index.html",'w',encoding='utf-8') as wfile: #或者你们也可以常规打开,不过需要最后关闭记得close()
        wfile.write(data)
        print("读取结束")
    

    在这里插入图片描述

    urllib.parse模块

    有时我们爬虫需要模拟浏览器进行用户登录等操作,这个时候我们就需要进行post请求

    但是post必须有一个获取请求之后的响应,也就是我们需要有一个服务器。给大家介绍一个免费的服务器网址,就是用来测试用的http://httpbin.org/。主要用来测试http和https的

    在这里插入图片描述

    在这里插入图片描述

    我们可以尝试执行一下,去获取对应的响应。

    在这里插入图片描述

    在这里插入图片描述

    可以用Linux命令去发起请求,URL地址为http://httpbin.org/post。得到下方的响应。

    在这里插入图片描述

    我们也可以通过爬虫来实现

    # -*- codeing = utf-8 -*-
    # @Author: Y-peak
    # @Time : 2021/9/2 19:24
    # @FileName : testUrllib.py
    # Software : PyCharm
    import urllib.request
    import urllib.parse #解析器
    data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding='utf-8')  #转换为二进制数据包,里面是键值对(有时输入的用户名:密码就是这样的),还有一些编码解码的数值等.这里就是按照utf-8的格式进行解析封装生成二进制数据包
    response = urllib.request.urlopen("http://httpbin.org/post",data=data)  #返回的请求
    print(response.read().decode('utf-8'))      #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码
    
    

    两个响应结果对比是不是一样几乎

    在这里插入图片描述

    在这里插入图片描述

    相当于进行了一次模拟的post请求。这样有些需要登录的网站也是可以爬取的。

    利用try-except,进行超时处理

    一般进行爬虫时,不可能一直等待响应。有时网络不好或者网页有反爬或者一些其他东西时。无法快速爬出。我们就可以进入下一个网页继续去爬。利用timeout属性就好

    # -*- codeing = utf-8 -*-
    # @Author: Y-peak
    # @Time : 2021/9/2 19:24
    # @FileName : testUrllib.py
    # Software : PyCharm
    import urllib.request
    try:
        response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.01)  #返回的是存储网页数据的对象, 直接用这个网址的get请求了.timeout表示超时,超过0.01秒不响应就报错,避免持续等待
        print(response.read().decode('utf-8'))      #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码
    except urllib.error.URLError as e:
        print("超时了\t\t错误为:",e)
    
    

    status状态码 && getheaders()

    status:

    • 返回200,正确响应可以爬取
    • 报错404,没有找到网页
    • 报错418,老子知道你就是爬虫
    • getheaders():获取Response Headers

    在这里插入图片描述 

    • 也可以通过gethead(“xx”) 获取xx对应的值,比如:上图 gethead(content-encoding) 为 gzip

    突破反爬

    首先打开任何一个网页按F12找到Response Headers,拉到最下面找到 User-Agent。将其复制保存下来,为反爬做准备。

    在这里插入图片描述

    在这里插入图片描述

    下面我们进行尝试,直接爬取豆瓣,直接来个418,知道你是爬虫,我们来伪装一下

    在这里插入图片描述

    为什么418呢,因为如果是直接进行请求访问的话,发过去的User-Agent 是下面的,直接告诉浏览器我们是爬虫。我们需要伪装

    在这里插入图片描述

    # -*- codeing = utf-8 -*-
    # @Author: Y-peak
    # @Time : 2021/9/2 19:24
    # @FileName : testUrllib.py
    # Software : PyCharm
    import urllib.request
    headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
    }
    request = urllib.request.Request("http://douban.com", headers=headers) #返回的是请求,将我们伪装成浏览器发送的请求
    response = urllib.request.urlopen(request)  #返回的是存储网页数据的对象
    data = response.read().decode('utf-8')     #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码
    with open("index.html",'w',encoding='utf-8') as wfile: #或者你们也可以常规打开,不过需要最后关闭记得close()
        wfile.write(data)
    

    当然反爬不可能如此简单,上面将讲的那个 post请求,也是十分常见的突破反爬的方式,不行就将整个Response Headers全部模仿。下面还有个例子作为参考。和上面的post访问的网址一样

    浏览器访问结果

    在这里插入图片描述

    爬虫访问结果

    # -*- codeing = utf-8 -*-
    # @Author: Y-peak
    # @Time : 2021/9/3 0:47
    # @FileName : testUrllib.py
    # Software : PyCharm
    
    import urllib.request
    import urllib.parse
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
    }
    url = "http://httpbin.org/post"
    data = (bytes)(urllib.parse.urlencode({"账户":"密码"}),encoding = 'utf-8')
    request = urllib.request.Request(url, data = data,headers=headers, method='POST') #返回的是请求
    response = urllib.request.urlopen(request)  #返回的是存储网页数据的对象
    data = response.read().decode('utf-8')     #通过read将数据读取出来, 使用utf-8解码防止有的地方出现乱码
    print(data)
    

    在这里插入图片描述

    以上就是关于python爬虫应用urllib库作用分析的详细内容,更多关于python爬虫urllib库分析的资料请关注hwidc其它相关文章!

    【文章来自:http://www.yidunidc.com/gfcdn.html 欢迎留下您的宝贵建议】