zoukankan      html  css  js  c++  java
  • urllib的使用和进阶——urllib.request

       urllib是python中常用的一个基本库,以后的许多库包括一些框架如Scrapy都是建立在这个库的基础上的。在urllib中,为用户提供了一系列用于操作URL的功能,其提供的功能主要就是利用程序去执行各种HTTP请求。这当中,最常使用的就是urllib.request模块中的urlopen。

      如果要模拟浏览器完成特定功能,需要把请求伪装成浏览器。伪装的方法是先监控浏览器发出的请求,再根据浏览器的请求头来伪装,User-Agent头就是用来标识浏览器的。

      官方给出的方法原型是这样的:

    def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
                *, cafile=None, capath=None, cadefault=False, context=None):

      一般常用的为以下三个部分:

      url:  需要打开的网址

      data:Post提交的数据

      timeout:设置网站的访问超时时间


      但是urlopen也有很大的缺陷,就是他没有办法进行对爬虫进行伪装,也就是无法设置请求头,这就需要urllib中的另外一个库——request,request库提供了对于请求头的使用,用来进行对爬虫的伪装,一般来说,我们会设置几个不同的Headers来进行伪装,用来改变为不同的用户(在自我学习阶段,这样可以使要求不严格的spider减少对ip的改变)。下面的代码基本实现了这种方式的基本操作,并且对于urlopen和request的常用的方法进行了罗列(以www.bing.com为例)。

     1 '''
     2 @Description: urllib 的使用和进阶
     3 @Version: 1.0
     4 @Autor: Montoin Yan
     5 @Date: 2020-02-01 17:55:43
     6 @LastEditors  : Montoin Yan
     7 @LastEditTime : 2020-02-01 19:46:27
     8 '''
     9 
    10 #导入urllib中的resqust模块,引用urlopen
    11 #urlopen方法用于发送请求,并将请求到的结果储存在文件中。缺点是不能使用header的引用
    12 #因此引用Request库进行请求头的引用,方便伪装来逃避反扒措施
    13 from urllib.request import urlopen,Request
    14 import random
    15 #当查询到response中的type时,可以按照以下格式进行具体方法的查询
    16 from http.client  import HTTPResponse
    17 
    18 url = "http://www.bing.com"
    19 #设置多个请求头,防止被反扒措施进行拦截
    20 ua_list = [
    21     "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",
    22     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36",
    23     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362",
    24     "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400"
    25 ]
    26 #随机pick one
    27 ua = random.choice(ua_list)
    28 request = Request(url,headers={
    29     'User-agent':ua
    30 })
    31 # response  = urlopen(url,timeout=3) #GET
    32 response =  urlopen(request,timeout=3)
    33 
    34 print(response.closed) #可以使用closed,说明是类文件对象,
    35 
    36 with response:
    37     print(type(response)) #检查response的对应的方法类型
    38     print(response.status) #检查response的状态
    39     print(response.reason) #检查返回结果是否成功
    40     print(response._method) #检查当前所对应的传输方法 即GET或者POST
    41     # print(response.info()) #获取Headers
    42     # print(response.read()) #读取并打印获取到的文件的内容
    43     print(response.geturl()) #返回网页执行真正的url,即当遇到301  302的时候,页面会从当前页面自动跳转到location页面,具体location地址可以在浏览器的开发者模式中进行查看urllib是支持自动跳转的
    44 
    45 print(request.get_method()) #获取request中传输的方法,即GET或者POST
    46 print(request.get_header("User-agent")) #获取当前使用的请求头
    47 print(response.closed) #关闭成功,说明response支持上下文管理协议

       结果如下所示,可进行参考:

  • 相关阅读:
    Liskov替换原则
    OCP开放封闭原则
    SRC单一职责原则
    什么是敏捷设计
    [WCF编程]13.并发:服务并发模式
    [WCF编程]12.事务:服务事务编程(下)
    [WCF编程]12.事务:服务事务编程(上)
    [WCF编程]12.事务:Transaction类
    [WCF编程]12.事务:事务传播
    [WCF编程]12.事务:事务协议与管理器
  • 原文地址:https://www.cnblogs.com/yandashan666/p/12249812.html
Copyright © 2011-2022 走看看