在模拟登录中,还有两个重要的问题,前面一直找不到提出来的机会,在这里一起提一下,这两个问题就是 headers 内容的增加和 cookies 的有效期
1. headers 内容的增加
我们先看一张图和两段代码
代码1:
user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0' headers = {'User-Agent':user_agent}
代码2:
user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0' host = 'www.lvye.org' referer = 'http://www.lvye.org/index.php' cookies = 'PHPSESSID=8e1mu8g2akohgtdvlitv314ct3; lvyebbs=290738b8c90d8cf97c03922248ba629e134e944a1248e7351eded398c4bb6b1a' heasers = {'User-Agent':user_agent, 'Host':host, 'Referer':referer, 'Cookie':cookies}
这是爬虫代码中关于headers的部分,我们前面也提到过,图片中heahers有很多的内容,我们在编写代码时并不知道我们要使用哪一个,我当时给出的方法是,发现不成功的时候再将headers里面的内容一个一个的加上去。首先肯定的是这个方法是没有错的,但是,我们可以有很多种做法去实现它,比如,你可以用代码2中的方法,先定义变量然后加入字典,这种做法也没有错,但实际上还有另外一种方法,我们先来看代码
#!/usr/bin/env python # -*- coding: UTF-8 -*- __author__ = '217小月月坑' ''' 另一种headers的形式 ''' import urllib2 # 要登陆的网址 url = 'http://www.lvye.org/userinfo.php?uid=409557' request = urllib2.Request(url) # 另一种加入headers的方法 request.add_header("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0") request.add_header("Host", "www.lvye.org") request.add_header("Referer", "http://www.lvye.org/index.php") request.add_header("Cookie", "lvyebbs=290738b8c90d8cf97c03922248ba629e134e944a1248e7351eded398c4bb6b1a; PHPSESSID=edqhc21p48l4js6rg0eo3vafm0") response = urllib2.urlopen(request) print response.read()
这里我们使用了另一种方法:request.add_header,这个"request."引起了我的注意,这不是使用urllib2.Request创建的请求吗,所以到头来还是要看这个函数,前面在第12小节的时候我们已经稍微的讲解了urllib2.Request这个函数,为了便于理解那时只讲了很小的一部分,毕竟那个时候还用不到那么多。怎么查看函数前面也已经说了,使用python自带的help方法,显示的内容很多,我这里只是截取了一部分,大家可以自己去看一下
我们先来看一些名词,"module","class","methods", 这三个单词翻译成中文就是 模块,类,方法,这是面向对象编程的一些基本的概念,有兴趣的同学可以自己去看,但是我现在并不打算详细的讲解这个,我就这么简单的说吧,urllib2是python里面的一个模块,urllib2这个模块里面有很多的类,Request 就是其中的一个类,像前面使用到的urlopen也是一个类,而Request这个类里面有很多的方法,比如,add_date,add_headers,等等。python里面该怎么找一个模块里面含有什么类,一个类里面含有什么方法呢,做法有很多种
查看相关的文档,或者查看函数原型等等
python对于类和方法的引用是以"."来引用的,在很多python专门的ide和编辑器中,只要输入模块,然后"."就会有很多的候选项,然后在里面找到你想要的
至于request.add_header,我们知道request是这么来的: request = urllib2.Request(url),用专业的话来说request是urllib2.Request这个类里面的一个实例,所以它继承了urllib2.Request里面的所有特性。或者一种简单的说法是,使用urllib2.Request 生成的request就是Request这个类克隆出来的一个儿子,它跟Request一模一样,只是名字不一样,而且它可以使用Request里面的方法
2. cookies 的时效性
我们在登录网站的时候一般会有"七天之内自动登录"或者"一个月内自动登录"的选项,这个就是cookies的时效性,有的cookies长有的cookies短,我们在程序编码的时候不可能知道这个网站的cookies能持续多长时间,大家也可以对比一下我这篇文章里使用的cookies和上一次代码中写的cookies不一样,那么,这种情况下应该怎么办呢
答案只能是获取最新的那个cookies,也就是最后一次打开网页的cookies,方法前面我其实已经说过了,还记得我在41小节的时候说的使用浏览器查看cookies吗?
"按F12调出控制台然后按F5刷新"
这里的F5刷新就是刷新网页,保证获取到的cookies是最新的