日志

爬虫-urllib模块的使用

 来源    2021-01-14    1  

urllib是Python中请求url连接的官方标准库,在Python3中将Python2中的urllib和urllib2整合成了urllib。urllib中一共有四个模块,分别如下:

  • request:主要负责构造和发起网络请求,定义了适用于在各种复杂情况下打开 URL (主要为 HTTP) 的函数和类
  • error:处理异常
  • parse:解析各种数据格式
  • robotparser:解析robot.txt文件

一、request模块

1.urlopen()方法:

  • 在urlopen()方法中,直接写入要访问的url地址字符串,该方法就会主动的访问目标网址,然后返回访问结果,返回的访问结果是一个http.client.HTTPResponse对象,该对象的常见方法有:
  1. read() :获取访问网页获取的数据,bytes类型
  2. info():返回响应头信息
  3. getcode():返回Http状态码。
  4. geturl():返回请求的url
  • 发送简单的GET请求

    from urllib.request import urlopen
    
    #向指定的url发送请求,并返回服务器响应的类文件对象
    resp = urlopen('https://www.baidu.com') 
    print(resp.read().decode())
  • 发送简单的POST请求(data参数)

    from urllib.reuqest import urlopen
    from urllib.parse import urlencode
    
    #将字典类型的数据转换成表单类型的数据格式,如"world=hello"
    data = urlencode({"word":"hello"}).encode()
    response = request.urlopen('http://httpbin.org/post', data=data)
    
    print(response.read().decode())

    默认的访问方式是GET,当在urlopen()方法中传入data参数时,则会发起POST请求。注意:传递的data数据需要为bytes格式

2.Request

  • 如果需要执行更复杂的操作,比如增加HTTP报头,必须创建一个 Request 实例来作为urlopen()的参数;而需要访问的url地址则作为 Request 实例的参数。
  • 为了使爬虫程序更像一个真实用户,那我们第一步就是需要伪装成一个被公认的浏览器,在发送请求的时候带上User-Agent头
    from urllib.request import Request,urlopen
    
    url = 'https://www.baidu.com/'
    ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
    #url连同headers一起构造request请求,这个请求附带IE 9.0浏览器的User-Agent
    request = Request(url,headers=ua_header)
    #向服务器发送请求
    resp = urlopen(request)
    print(resp.read().decode)

3.ProxyHandler处理器(代理IP)

  • 使用爬虫来爬取数据的时候,如果过于频繁的访问,而且网站还设有限制的话,很有可能会禁封我们的ip地址,这个时候就需要设置代理,来隐藏我们的真实IP。
  • 代理IP的原理:以本机先访问代理IP,再通过代理IP地址访问服务器,这样服务器接受到的访问IP就是代理IP地址。
    from urllib.request import build_opener,urlopen(),install_opener,Request,ProxyHandler
    
    # 构建了两个代理Handler,一个有代理IP,一个没有代理IP
    httpproxy_handler = urllib2.ProxyHandler({'http': '218.18.232.26:80', 'https': '218.18.232.26:80'})
    nullproxy_handler = urllib2.ProxyHandler({})
    
    proxySwitch = True #定义一个代理开关
    
    # 通过build_opener()方法使用这些代理Handler对象,创建自定义opener对象
    # 根据代理开关是否打开,使用不同的代理模式
    if proxySwitch:  
        opener = build_opener(httpproxy_handler)
    else:
        opener = build_opener(nullproxy_handler)
    
    request = Request("http://www.baidu.com/")
    
    # 1. 如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。
    resp = opener.open(request)
    
    # 2. 如果这么写,就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。
    # install_opener(opener)
    # resp = urlopen(request)
    
    print (resp.read().decode())

    如果代理需要授权验证,简单的方式是只需要在ProxyHandler传入的参数字典中,将值改为'用户名:密码@ip:端口号'这种形式,比如{"http":"myname:mypasswd@124.88.67.81:80"},复杂一点的需要创建一个密码管理对象,下面会有介绍。

4.HTTPPasswordMgrWithDefaultRealm()

  • " ## 舍去最后一位的分号 print cookieStr[:-1]
  • 访问网站获得cookie,并将cookie保存在本地文件中

    from http.cookiejar import MozillaCookieJar
    from urllib.request import Request,build_opener,HTTPCookieProcessor
    
    # 保存cookie的本地磁盘文件名
    filename = 'cookie.txt'
    
    #声明一个MozillaCookieJar(有save实现)对象实例来保存cookie,之后写入文件
    cookiejar = MozillaCookieJar(filename)
    
    # 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
    handler = HTTPCookieProcessor(cookiejar)
    
    opener = build_opener(handler)
    response = opener.open("https://www.baidu.com/")
    
    # 保存cookie到本地文件
    cookiejar.save()
  • 从文件中获取cookie

    from http.cookiejar import MozillaCookieJar
    from urllib.request import Request,build_opener,HTTPCookieProcessor
    
    #创建MozillaCookieJar(有load实现)实例对象
    cookiejar = MozillaCookieJar(filename)
    
    #从文件中读取cookie内容到对象
    cookiejar.load('cookie.txt')
    
    # 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
    handler = HTTPCookieProcessor(cookiejar)
    
    opener = build_opener(handler)
    response = opener.open("https://www.baidu.com/")
  • 8.处理HTTPS请求SSL证书验证

    • 最简单的方法就是通过添加忽略ssl证书验证关闭证书验证,由于urllib并没有很好的处理ssl的对象,所以在这里我们需要用到一个别的库,即ssl库,如下:
      import ssl
      from urllib.request import urlopen,Request
      
      # 表示忽略未经核实的SSL证书认证
      context = ssl._create_unverified_context()
      
      url = "https://www.12306.cn/mormhweb/"
      headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
      request = Request(url,headers=headers)
      
      # 在urlopen()方法里 指明添加 context 参数
      resp = urlopen(request, context=context)
      print(resp.read().decode())

    二、error模块

    • 在urllib中主要设置了两个异常,一个是URLError,一个是HTTPError,HTTPError是URLError的子类。

    1.URLError

    • URLError产生的原因主要有:
    1. 没有网络连接
    2. 服务器连接失败
    3. 找不到指定的服务器
    • 下面访问一个不存在的域名:
      from urllib.error import URLError
      from urllib.request import Request,urlopen
      
      request = Request('http://www.fafafasfdaffaf.com/')
      try:
          resp = urlopen(request)
      except URLError as e:
          print(e)

    2.HTTPError

    • HTTPError包含了三个属性:
    1. code:请求的状态码
    2. reason:错误的原因
    3. headers:响应的报头
      from urllib.error import HTTPError
      from urllib.request import Request,urlopen
      
      requset = Request('http://www.baidu.com/lfafdaflafapae.html')
      
      try:
          resp = urlopen(requset)
      except HTTPError as e:
          print(e)
          print(e.code)
          print(e.reason)
          print(e.headers)

    三、parse模块

    data参数需要用urllib.parse模块对其进行数据格式处理。

    • urllib.parse.quote(url):(URL编码处理)主要对URL中的非ASCII码编码处理
    • urllib.parse.unquote(url):(URL解码处理)URL上的特殊字符还原
    • urllib.parse.urlencode(data):对请求数据data进行格式转换
相关文章
python爬虫-urllib模块
日志urllib 模块是一个高级的 web 交流库,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象.urllib 支持各种 web 协议,例如:HTTP.FTP.Gophe ...
2
爬虫--urllib模块
日志一.urllib库 概念:urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urll ...
2
python 爬虫 urllib模块 发起post请求
日志urllib模块发起的POST请求 案例:爬取百度翻译的翻译结果 1.通过浏览器捉包工具,找到POST请求的url 针对ajax页面请求的所对应url获取,需要用到浏览器的捉包工具.查看百度翻译针对某 ...
1
python 爬虫 urllib模块 反爬虫机制UA
日志方法: 使用urlencode函数 urllib.request.urlopen() import urllib.request import urllib.parse url = 'https:// ...
1
python 爬虫 urllib模块 url编码处理
日志案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦’的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...
2
python 爬虫 urllib模块介绍
日志一.urllib库 概念:urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urll ...
1
爬虫——urllib爬虫模块
日志网络爬虫也称为网络蜘蛛.网络机器人,抓取网络的数据.其实就是用Python程序模仿人点击浏览器并访问网站,而且模仿的越逼真越好.一般爬取数据的目的主要是用来做数据分析,或者公司项目做数据测试,公司业务 ...
2
洗礼灵魂,修炼python(53)--爬虫篇—urllib模块
日志urllib 1.简介:  urllib 模块是python的最基础的爬虫模块,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象.urllib 支持各种 web 协议,例 ...
1
练手爬虫用urllib模块获取
日志练手爬虫用urllib模块获取 有个人看一段python2的代码有很多错误 import re import urllib def getHtml(url): page = urllib.urlope ...
1
Python爬虫1-----urllib模块
日志1.加载urllib模块的request from urllib import request 2.相关函数: (1)urlopen函数:读取网页 webpage=request.urlopen(ur ...
2
爬虫之urllib模块
日志1. urllib模块介绍 python自带的一个基于爬虫的模块. 作用:可以使用代码模拟浏览器发起请求. 经常使用到的子模块:request,parse. 使用流程: 指定URL. 针对指定的URL ...
1
爬虫基础urllib 之(三) --- urllib模块
日志Mac本 需导入ssl import ssl ssl._create_default_https_context = ssl._create_unverified_context urllib.req ...
2
python爬虫入门(1)-urllib模块
日志作用:用于读取来自网上(服务器上)的数据 基本方法:urllib.request.urlopen(url,data=None,[]timeout]*,cafile=None,cadefault=Fal ...
1
Python爬虫进阶——urllib模块使用案例淘宝
日志很多时候呢,我们都是读取本地HTML文件来进行爬虫练手,但每次都要手打不同的HTML明显耗时耗力: 还有些小伙伴不喜欢F12,偏偏喜欢在Pycharm中查看HTML的源代码: -- 难道每次都只能&q ...
1
一起学爬虫——urllib库常用方法用法总结
日志1.读取cookies import http.cookiejar as cj,urllib.request as request cookie = cj.CookieJar() handler = ...
2
Python中操作HTTP请求的urllib模块详解
日志urllib 是 Python 标准库中用于网络请求的库.该库有四个模块,分别是urllib.request,urllib.error,urllib.parse,urllib.robotparser. ...
1
urllib模块使用笔记
日志文中所有python代码均使用的是python2.7实现,与python3并不兼容. UrlLib模块 urllib模块是适用于一个简单的网络数据获取和处理(不能处理有关验证和cookie等功能),官 ...
2
05爬虫-requests模块基础(2)
日志今日重点: 1.代理服务器的设置 2.模拟登陆过验证码(静态验证码) 3.cookie与session 4.线程池 1.代理服务器的设置 有时候使用同一个IP去爬取同一个网站,久了之后会被该网站服务器 ...
1
03爬虫-requests模块基础(1)
日志requests模块基础 什么是requests模块 requests模块是python中原生基于网络模拟浏览器发送请求模块.功能强大,用法简洁高效. 为什么要是用requests模块 用以前的url ...
2
Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块
日志Python第十三天   django 1.6   导入模板   定义数据模型   访问数据库   GET和POST方法    SimpleCMDB项目   urllib模块   urllib2模块 ...
1