美文网首页Python程序员
python爬虫—基本使用整理

python爬虫—基本使用整理

作者: simplehu | 来源:发表于2017-04-06 21:02 被阅读0次

    都说好记性不如烂笔头,这是真真实实的硬道理。反观自己,不论是在学校的时候还是现在工作,你会发现很多时候很多东西明明以前会,但是因为没有去记录,等再遇到不会了;很多问题以前碰到过,解决了,还是因为没有整理记录,最后遇到同样的问题时,也许还会记得,也许只能心里暗暗悔恨没有整理记录,但是不管那种,为了给自己省去不必要的麻烦,多多记录总是好的。

    最近一直在爬虫,然而代码是“代码一般仿”,一份代码成功后,一直就copy,但是突然发现其实自己并没有去深入或者说简单的了解,所以简单的记录下也让自己重新了解下基本的知识。

    用到的库:urllib2

    urllib2提供一个基础函数urlopen,通过向指定的URL发出请求来获取数据。
    原型:urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])

    案例1:基本的网页抓取
    import urllib2
    response=urllib2.urlopen('http://www.baidu.com')
    html=response.read()
    #重定向的url
    print response.geturl()
    #响应状态码
    print response.code()
    #print response.getcode()
    #响应信息
    print response.info()
    

    HTTP是基于请求—响应模型的,即客户端提出请求,服务端提供响应。urllib2用一个Request对象来映射你提出的HTTP请求,在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,并通过调用urlopen传入该Request对象,然后返回一个相关请求response对象,可以在Response中调用read()获取到的网页内容。

    response=urllib2.urlopen("http://www.baidu.com"),实际上可以看作两个步骤:

    import urllib2
    #指定一个域名并发送请求 
    request=urllib2.request('http://www.baidu.com')
    #服务端响应来自客户端的请求 
    response=urllib2.urlopen(request)
    #获取网页内容
    html=response.read()
    
    案例2:动态网页抓取

    现在大多数网站都是动态网页,需要动态地传递参数给它,然后做出对应的响应。因此,在访问时需要传递数据给它。最常见的情况如登录、注册。

    数据传送分为POST和GET两种方式:GET方式是直接以链接形式访问,链接中包含了所有的参数

    • POST方式:
    import urllib
    import urllib2
    values = {"username":"aaa","password":"1234"}
    data = urllib.urlencode(values) 
    url = "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
    request = urllib2.Request(url,data)
    response = urllib2.urlopen(request)
    html = response.read()
    
    • GET方式:
    import urllib
    import urllib2
    values = {"username":"aaa","password":"1234"}
    data = urllib.urlencode(values) 
    #python2的编码:data = urllib.quote(values) 
    url = "http://passport.csdn.net/account/login"
    geturl = url + "?"+data
    request = urllib2.Request(geturl)
    response = urllib2.urlopen(request)
    html = response.read()
    
    案例3:添加Headers

    有些网站不能直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,因此为了完全模拟浏览器的工作,需要设置一些Headers 的属性。

    import urllib  
    import urllib2  
    url = 'http://xxx.xxx.com/xxx'
    cookie_str=""
    headers = {
            'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.9 Safari/537.36',
            #Referer是用来应付防盗链,服务器会识别headers中的referer是不是它自己,如果不是,有的服务器不会响应
            'Referer' : 'http://xxx.xxx.com/xxx/xxx.jsp?city=SZ',
            'Connection': 'keep-alive',
            'Cookie':cookie_str
        }
    request = urllib2.Request(url, None, headers) 
    #request = urllib2.Request(url) 
    #也可这样添加header:request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.9 Safari/537.36')
    #或者request.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.9 Safari/537.36'))
    response = urllib2.urlopen(request)  
    html = response.read()
    
    案例4:获取Cookie

    案例3中headers包含了cookie,有些场景下需要把cookie传入进去,因此需要获取cookie。

    当获取一个URL使用的opener(一个urllib2.OpenerDirector的实例)是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,但是如果需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置。

    基本流程:创建CookieJar对象→HTTPCookieProcessor对象来创建cookie处理器→构建opener→创建请求→读取数据(保存数据)

    打印cookie信息:

    import urllib2
    import cookielib
    #声明一个CookieJar对象实例来保存cookie
    cookie = cookielib.CookieJar()
    #cookie = cookielib.LWPCookieJar()
    #利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
    handler=urllib2.HTTPCookieProcessor(cookie)
    #通过handler来构建opener
    opener = urllib2.build_opener(handler)
    #创建一个请求,原理同urllib2的urlopen,也可以传入request
    response = opener.open('http://www.baidu.com')
    for item in cookie:
        print 'Name = '+item.name
        print 'Value = '+item.value
    

    保存cookie到文件:

    import cookielib
    import urllib2
    #设置保存cookie的文件,比如保存在同级目录下的cookie.txt
    filename = './cookie.txt'
    #声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
    cookie = cookielib.MozillaCookieJar(filename)
    #利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
    handler = urllib2.HTTPCookieProcessor(cookie)
    #通过handler来构建opener
    opener = urllib2.build_opener(handler)
    #创建一个请求,原理同urllib2的urlopen
    response = opener.open("http://www.baidu.com")
    #保存cookie到文件
    cookie.save(ignore_discard=True, ignore_expires=True)
    

    使用urlopen创建请求

    import cookielib
    import urllib2
    from urllib2 import urlopen, Request
    cookieFile = "cookies.txt"
    testURL = 'http://maps.google.com/'
    #为cookie jar 创建实例
    cJar = cookielib.LWPCookieJar()
    #创建HTTPCookieProcessor的opener对象
    opener = urllib2.build_opener( urllib2.HTTPCookieProcessor(cJar))
    #安装HTTPCookieProcessor的opener
    urllib2.install_opener(opener)
    #创建一个Request对象
    r = Request(testURL)
    #打开HTML文件
    h = urlopen(r)
    print "页面的头部\n======================"
    print h.info()
    print "页面的Cookies\n======================"
    for ind, cookie in enumerate(cJar):
      print "%d - %s" % (ind, cookie)
      #保存cookies
    cJar.save(cookieFile)
    

    从文件中读取cookie

    import cookielib
    import urllib2 
    #创建MozillaCookieJar实例对象
    cookie = cookielib.MozillaCookieJar()
    #从文件中读取cookie内容到变量
    cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
    #创建请求的request
    req = urllib2.Request("http://www.baidu.com")
    #利用urllib2的build_opener方法创建一个opener
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
    response = opener.open(req)
    print response.read()
    
    参考:

    https://docs.python.org/2/library/urllib2.html
    http://python.jobbole.com/81334/

    相关文章

      网友评论

        本文标题:python爬虫—基本使用整理

        本文链接:https://www.haomeiwen.com/subject/qszqattx.html