《精通Python网络爬虫》核心技术篇5(2)

  • 什么是 Cookie
  • Cookiejar 实战精析

什么是Cookie

在爬虫的使用中,如果涉及登陆等操作,经常会使用到 Cookie。

什么是 Cookie?

1.其实我们每访问一个互联网页面,都是通过 HTTP 协议进行的,而 HTTP 协议是一个无状态协议,即无法维持会话之间的状态

2.如果我们仅使用 HTTP 协议的话,我们登陆一个网站之后,如果想再登陆该网站的其他网站链接时,登陆状态就会消失,需要重新再登陆,这很不方便的。

3.我们可以通过以下方式保存对应的会话信息:通过 Cookie 保存会话信息,通过 Session 保存会话信息。

Cookiejar 实战精析

现在我们来具体看一下 Cookie 的作用。

我们想登陆 ChinaUnix 论坛,登录网址是:http://bbs.chinaunix.net/member.php?mod=logging&action=login&logsubmit=yes (但这并不是真实地登录网址)

那么如何获取登录网址呢?
1. F12 调出调试界面进行分析;(这里我们用这种方法,浏览器用Chrome)
2. 使用工具软件 Fiddler 进行分析。

  • 具体操作:
    1-打开链接并定位到此处:
    http://bbs.chinaunix.net/member.php?mod=logging&action=login&logsubmit=yes
    《精通Python网络爬虫》核心技术篇5(2)_第1张图片
    2-点 F12 打开调试界面,将 preserve log 选中:
    《精通Python网络爬虫》核心技术篇5(2)_第2张图片
    3-输入自己创建好的账号及密码:
    《精通Python网络爬虫》核心技术篇5(2)_第3张图片
    4-观察 调试界面 中的网址变化,寻找至与此网站相似的 post 方法网址(复制下来保存到文本中,后续又用,这是真实的登录网址):
    《精通Python网络爬虫》核心技术篇5(2)_第4张图片
    5-回到登录界面,我们鼠标右键,调出源代码:
    《精通Python网络爬虫》核心技术篇5(2)_第5张图片
    《精通Python网络爬虫》核心技术篇5(2)_第6张图片
    6-我们发现对应的表单 name 为:username,密码为:password。
    至此,我们可以构造数据:
{
    "username":"xxxx",
    "password":"xxxx" # xxxx 均为自己创建的账号密码
}

到这里,差不多可以写爬虫抓取网页进行分析了。

  • 具体代码:
import urllib.request
import urllib.parse
""" First """
#爬网页
url1="http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LWLzC"
postdata=urllib.parse.urlencode({
    "username":"xxxx",
    "password":"xxxx"  # xxxx 均为自己创建的账号密码
}).encode("utf-8")  # 使用 urlencode 编码处理后,再设置为 utf-8 编码

req = urllib.request.Request(url1,postdata)  # 构建 Request 对象
req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36")
data=urllib.request.urlopen(req).read()  #模拟浏览器登录并爬取对应的网页,注意修改成自己的 agent
#存数据
fhandle=open("E:/myweb/c51.html","wb") #将爬取的网页写入文件中
fhandle.write(data)
fhandle.close()

""" Second """
url2="http://bbs.chinaunix.net/"
req2 = urllib.request.Request(url2,postdata)  # 构建 Request 对象
req2.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36")
data2=urllib.request.urlopen(req2).read()  #模拟浏览器爬取该网站下的其他网页
#存数据
fhandle=open("E:/myweb/c52.html","wb")  #将爬取的其他网页写入文件中
fhandle.write(data2)
fhandle.close()

我们打开 c51 和 c52 html,观察到:
这个网页已经成功登陆:
《精通Python网络爬虫》核心技术篇5(2)_第7张图片

然而这个没有:
《精通Python网络爬虫》核心技术篇5(2)_第8张图片

所以,我们需要Cookie 来保持这种会话信息。

接下来,我们利用 Cookiejar 库进行处理(Python3)。
(Python2:Cookielib)

  • 处理思路:
    1)导入 Cookie 处理模块 http.cookiejar;
    2)使用 http.cookiejar.CookieJar() 创建 CookieJar 对象;
    3)使用 HTTPCookieProcessor 创建 cookie 处理器,并以其为参数构建 opener 对象;
    4)创建全局默认的 opener 对象。
  • 具体代码及结果
import urllib.request
import urllib.parse
import http.cookiejar
""" First """
#爬网页
url1="http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LWLzC"
postdata=urllib.parse.urlencode({
    "username":"xxxx",
    "password":"xxxx"  # xxxx 均为自己创建的账号密码
}).encode("utf-8")  # 使用 urlencode 编码处理后,再设置为 utf-8 编码

req = urllib.request.Request(url1,postdata)  # 构建 Request 对象
req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36")
# 使用 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()
#存数据
fhandle=open("E:/myweb/nc51.html","wb") #将爬取的网页写入文件中
fhandle.write(data)
fhandle.close()

""" Second """
url2="http://bbs.chinaunix.net/"
data2=urllib.request.urlopen(url2).read()  #爬取该网站下的其他网页
#存数据
fhandle=open("E:/myweb/nc52.html","wb")  #将爬取的其他网页写入文件中
fhandle.write(data2)
fhandle.close()

此时会话信息就得以保存。

你可能感兴趣的:(Python网络爬虫)