爬虫笔记(十一)——认识cookie

什么是cookie?

    在爬虫的使用中,如果涉及登录等操作时,经常会使用到cookie。简单的来说,我们访问每一个互联网页面,都是通过HTTP协议进行的,而HTTP协议是一个无状态协议,所谓的无状态协议就是无法维持会话之间的状态。

    比如,仅使用HTTP协议的话,我们登录一个网站的时候,假如登录成功了,但是当我们访问该网站的其他网页时,该登录状态会消失,此时还需要再次登录,只要涉及网页的更新,就需要反复地登录,这是非常麻烦的。

    所以此时,我们需要将对应的会话信息,比如登录成功等信息通过一些方式保存下来,比较常用的方式有两种:通过Cookie保存会话信息或通过Session保存会话信息。

   使用python处理Cookie,在python3可以使用Cookiejar库进行处理,而在python2中则使用Cookielib库进行处理。在此之前呢,我们必须先介绍一个opener的概念。

opener

  在前面,我们都是使用的默认的opener,也就是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout。如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置。

代码实战

未使用cookie登录

# -*- coding:UTF-8 -*-
import urllib.request
import urllib.parse
url = "http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LfgTz"
postdata = urllib.parse.urlencode({
    "username": "weisuen",
    "password": "aA123456"
}).encode('utf-8')  # 使用urlencode编码处理后,再设置为utf-8编码

req = urllib.request.Request(url, postdata)  # 构建Resquest对象

req.add_header('User-Agent','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45')

data = urllib.request.urlopen(req).read()  #登录并爬取对应的网页
fhandle = open('/home/wk/csdn1.html','wb')
fhandle.write(data)
fhandle.close()
url2 = "http://bbs.chinaunix.net/"  # 设置要爬取的该网站下其他网页地址
req2 = urllib.request.Request(url2, postdata)
req2.add_header('User-Agent','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45')
data2 = urllib.request.urlopen(req2).read()  # 爬取该站下的其他网页
fhandle2 = open('/home/wk/csdn.html','wb')
fhandle2.write(data2)
fhandle2.close()

1.使用urllib.request.Request()创建对象

2.add_header添加头部信息,这里添加代理信息

3.urllib.request.urlopen().read()登录打开网站并读取内容

4.文件操作,保存网页到本地

5.登录后再爬取该网页下的其他网页,并保存本地

总结:打开第一个保存的网页,发现其已经是在登录状态,但打开第二个网页,它是要重新登录才能进去的。这是因为我们没有设置cookie,使其会话信息一直保存。

使用cookie登录

# -*- coding:UTF-8 -*-
import urllib.request
import urllib.parse
import http.cookiejar
url = "http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LfgTz"
postdata = urllib.parse.urlencode({  #  此处登录可用自己在网站上注册的用户名和密码
    "username": "weisuen",
    "password": "aA123456"
}).encode("utf-8")
req = urllib.request.Request(url, postdata)
req.add_header('User-Agent','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45')

# 使用http.cookiejar.CookieJar()创建CookieJar对象
cjar = http.cookiejar.CookieJar()

# 使用HTTPCookieProcessor创建cookie处理器,并以其参数构建opener对象
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
# 将opener安装为全局

urllib.request.install_opener(opener)
file = opener.open(req)
data = file.read()
file = open('/home/wk/csdn.html','wb')
file.write(data)
file.close()

url2 = "http://bbs.chinaunix.net/"  # 设置要爬取的该网站下其他网页地址
data2 = urllib.request.urlopen(url2).read()
fhandle = open('/home/wk/csdn1.html','wb')
fhandle.write(data2)
fhandle.close()
 
 

猜你喜欢

转载自blog.csdn.net/wzyaiwl/article/details/81112797