• Python爬虫基础(一)urllib2库的基本使用


            爬虫也就是所谓的网络数据采集,是一种通过多种手段收集网络数据的方式,不光是通过与 API 交互(或者直接与浏览器交互)的方式。最常用的方法是写一个自动化程序向网络服务器请求数据(通常是用 HTML 表单或其他网页文件),然后对数据进行解析,提取需要的信息。实践中,网络数据采集涉及非常广泛的编程技术和手段,比如数据分析、信息安全等。

            要抓取网页数据,要做的就是向服务器发起请求并获取响应,而在Python中,我们可以使用urllib2这个库来实现。

    下面是一个发生请求并获取服务器响应的简单的例子:

    # -*- coding: utf-8 -*-
    
    # 导入urllib2 库 import urllib2 # 使用urllib2.urlopen()向指定的url发送请求,并返回服务器响应的类文件对象 response = urllib2.urlopen("http://www.baidu.com") # 类文件对象的read()方法可读取文件全部内容,返回字符串 html = response.read() # 打印字符串(页面源码) print html

    上面的例子就是一个简单的爬虫程序,运行程序后打印的结果就是服务器返回的页面源码。其效果和在浏览器输入http://www.baidu.com后查看页面源码是一样的。

    使用urlopen()发送请求十分简单,只需要传入目标url即可,但是如果需要执行更复杂的操作,必须创建一个 Request 实例来构造请求。

     下面是一个使用Request()方法构造请求的简单的例子:

    import urllib2
    
    # url 作为Request()方法的参数,构造并返回一个Request对象
    request = urllib2.Request("http://www.baidu.com")
    
    # Request对象作为urlopen()方法的参数,发送给服务器并接收响应
    response = urllib2.urlopen(request)
    
    html = response.read()
    
    print html

    这个例子的运行结果和上面一样

    使用Request()构造请求时,除了必须要的url参数外还有两个可选参数data和headers:

      data:伴随url提交的数据

      headers:一个字典,包含需要发送的HTTP报头的键值对

    先来说一说headers中的User-Agent:

    像上面的两个例子,直接用urllib2给一个网站发送请求的话,确实十分简单,但是很容易被网站检测到是爬虫程序。如果遇到一些不喜欢被程序(非人为访问)访问的站点,就有可能会拒绝你的访问请求。但是如果我们用一个合法的身份(例如模拟浏览器)去请求别人网站,情况就会好一些,所以我们就应该给我们的爬虫程序加上一个身份,就是所谓的User-Agent。我们可以将爬虫程序伪装成一个被公认的浏览器,用不同的浏览器在发送请求的时候,会有不同的User-Agent头。 urllib2默认的User-Agent头为:Python-urllib/x.y(x和y是Python主版本和次版本号,例如 Python-urllib/2.7)

    给爬虫程序添加User-Agent:

    import urllib2
    
    url = "http://www.baidu.cn"
    
    #  User-Agent,可以从网上找,也可以自己使用浏览器抓包获取
    header = {"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"} 
    
    # 起构造Request请求,
    request = urllib2.Request(url, headers = header)
    
    # 向服务器发送这个请求
    response = urllib2.urlopen(request)
    
    html = response.read()
    print html

     我们在程序中添加一个火狐浏览器的User-Agent,这样就可以伪造成浏览器进行发送请求。

    除了User-Agent,我们还可以在 HTTP Request 中加入特定的 Header,来构造一个完整的HTTP请求消息。

    import urllib2
    
    url = "http://www.baidu.cn"
    
    # User-Agent
    header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"} 
    request = urllib2.Request(url, headers = header)
    
    #也可以通过调用Request.add_header() 添加/修改一个特定的header
    request.add_header("Connection", "keep-alive")
    
    # 也可以通过调用Request.get_header()来查看header信息
    # request.get_header(header_name="Connection")
    
    response = urllib2.urlopen(requset)
    
    #可以查看响应状态码
    print response.code html = response.read() print html

    为了程序更好地运行,我们可以做一个User-Agent列表,在爬虫执行时随机选择一个User-Agent使用

    # -*- coding: utf-8 -*-
    
    import urllib2
    import random
    
    url = "http://www.baidu.cn"
    
    # User-Agent列表
    ua_list =  [
        "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
        "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
        "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
        "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
    ]
    
    # 随机选择一个User-Agent
    user_agent = random.choice(ua_list)
    
    request = urllib2.Request(url)
    
    #也可以通过调用Request.add_header() 添加/修改一个特定的header
    request.add_header("User-Agent", user_agent)
    
    # 第一个字母大写,后面的全部小写
    request.get_header("User-agent")
    
    response = urllib2.urlopen(request)
    
    html = response.read()
    print html

     这样每次发送请求就会使用不同的User-Agent。

  • 相关阅读:
    .NET安全系列之六:强名程序集
    Flash Player10.1.102.64版本后,跨域访问不支持带中文的地址
    ArcSDE 服务启动后又停止的解决方式一例
    ArcGIS Engine Maplex Label(标注)使用一例
    设置frameset的framespacing的颜色
    html表格导出Excel的一点经验心得
    解决Unable to create logfile system tables. User perhaps lacks permissions or resources to create tables
    WCF方法重载
    respond_to 和 respond_with
    Linux Apache服务器相关的重要目录
  • 原文地址:https://www.cnblogs.com/xinyangsdut/p/7568927.html
Copyright © 2020-2023  润新知