Python3.X网络爬虫学习(三)

什么是Cookie

由于HTTP协议是无状态的(无法维持会话之间的状态),而服务器端的业务必须是要有状态的。Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用。比如判断用户是否是第一次访问网站,假如登录成功,但是当我们访问该网站的其它网页时,该登录状态就会消失,此时还需要再登录一次,这时非常不方便的。

因此我们就需要将对应的会话信息保存下来,常用的方式有两种:通过Cookie或者Session保存会话信息。

如果通过Cookie保存信息

当我们访问一个网页时,服务器就会向客户端发送Cookie,客户端就会将Cookie信息保存下来,之后每次HTTP请求浏览器都会将Cookie发送给服务器端。

如果通过Session保存信息

Session是存在服务器的一种用来存放用户数据的类HashTable结构。浏览器第一次发送请求时,服务器自动生成了一HashTable和一Session ID来唯一标识这个HashTable,并将其发送到浏览器。浏览器第二次发送请求会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。 

Session的实现方式和Cookie有一定关系。建立一个连接就生成一个Session ID,打开几个页面就好几个了,这里就用到了Cookie,把Session ID存在Cookie中,每次访问的时候将Session ID带过去就可以识别了

通过前面的分析,我们可以直到,如果我们要去爬取一个网站的其它网页,如果有了Cookie,当我们登录成功后,则会保持登录状态进行后续内容的爬取。

Cookiejar

cookiejar模块的主要作用是提供可存储Cookie的对象。Cookiejar模块非常强大,我们可以利用本模块的Cookiejar类的对象来捕获Cookie并在后续连接请求时重新发送,比如可以实现模拟登录功能。该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

进行Cookie处理的一种常用思路如下:

  1. 导入Cookie处理模块:http.cookiejar。
  2. 使用http.cookiejar.CookieJar()创建CookieJar对象。
  3. 使用HTTPCookieProcessor创建cookie处理器,并以其为参数创建opener对象。
  4. 创建全局默认的opener对象。

获取Cookie,并保存下来

import urllib.request
import urllib.parse
import http.cookiejar

#创建一个CookieJar对象实例来保存cookie
cookie = http.cookiejar.CookieJar()
#利用urllib库中request的HTTPCookieProcessor对象来创建cookie处理器,并以其为参数创建opener对象
handle = urllib.request.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib.request.build_opener(handle)
#将opener安装为全局,这样以后在使用urlopen()时,也会使用我们安装的opener对象
urllib.request.install_opener(opener)
response = opener.open("http://www.baidu.com")
for item in cookie:
    print("name = " + item.name)
    print("value = " + item.value)

执行程序,打印出下列结果:

Python3.X网络爬虫学习(三)_第1张图片

通过Cookie爬取一个网页

Python3.X网络爬虫学习(三)_第2张图片

输入用户名和密码,点击登录,如果要获得真实的登录地址,需要通过浏览器自带的调试器查看。观察调试界面,会发现一个POST方法,而Request URL中的网址就是真实处理POST表单的网址。

Python3.X网络爬虫学习(三)_第3张图片

接下来我们需要构建需要传递的信息,查看登录网页的源代码,并找到登录框对应源代码的相关参数。

Python3.X网络爬虫学习(三)_第4张图片

可以看出,登录框中用户名所对应的表单name为:username,密码所对应的表单name为:password。因此可以构建数据为:

{
    "username":"xxxx", #输入自己的用户名
    "password":"xxxx" #输入自己的密码
}

下面开始通过代码实现爬虫功能:

import urllib.request
import urllib.parse
import http.cookiejar

url = "http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LG91C"
postdata = urllib.parse.urlencode({
    "username":"自己的用户名",
    "password":"自己的密码"
}).encode("utf-8")
req = urllib.request.Request(url,postdata)
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \
#                         (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0")
cookie = http.cookiejar.CookieJar()
handle = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handle)
urllib.request.install_opener(opener)
file = opener.open(req)
data = file.read()
file = open("E://1.html","wb")
file.write(data)
file.close()
url2 = "http://bbs.chinaunix.net/"
data2 = urllib.request.urlopen(url2).read()
file2 = open("E://2.html","wb")
file2.write(data2)
file2.close()

我们进行登录并爬取了对应网页并保存在本地文件1.html中,接着爬取了该站下的其它网页并保存到本地文件2.html中,可以看到,在2.html中依然为登录状态,说明对应的登录状态已经通过Cookie保存。

你可能感兴趣的:(Python,基础)