资讯专栏INFORMATION COLUMN

爬虫养成记 - urllib2的HTTPCookieProcessor

gnehc / 2686人阅读

摘要:相当于该用户的档案。上述的文字对机制描述的比较简单也并不一定完全正确。但是默认的并不支持。中供我们使用的是。创建需要闯入一个存放的容器。即过期的也保存。目前博主只知道链接后带的参数需要与相匹配。但是并不知道两者具体的关系。

很多网站的资源需要用户登录之后才能获取。
我们一旦登录后再访问其他被保护的资源的时候,就不再需要再次输入账号、密码。那么网站是怎么办到的呢?
一般来说,用户在登录之后,服务器端会为该用户创建一个Session。Session相当于该用户的档案。该档案就代表着该用户。
那么某一次访问请求是属于该用户呢?登录的时候服务器要求浏览器储存了一个Session ID的Cookie值。每一个访问都带上了该Cookie。服务器将Cookie中的Session ID与服务器中的Session ID比对就知道该请求来自哪个用户了。

上述的文字对Session机制描述的比较简单也并不一定完全正确。更加详细的资料可以阅读:http://blog.csdn.net/fangaoxi...

opener

通过阅读源码我们可以知道,我们在调用urllib2.urlopen(url)的时候,其实urllib2open函数内部创建了一个默认的opener对象。然后调用opener.open()函数。
但是默认的opener并不支持cookie。
那么我们先新建一个支持cookie的opener。urllib2中供我们使用的是HTTPCookieProcessor

创建HTTPCookieProcessor需要闯入一个存放cookie的容器。
Python提供的存放cookie的容器位于cookielib,有以下几个。
CookieJar -> FileCookieJar -> MozillaCookieJar / LWPCookieJar

示例代码:

import cookielib
import urllib2

cookies = cookielib.CookieJar()
cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies)
opener = urllib2.build_opener(cookieHandler)
urllib2.install_opener(opener)

request = urllib2.Request("http://www.baidu.com")
urllib2.urlopen(request)
for cookie in cookies:
    print cookie.name, cookie.value

上面的代码显示,urllib2的确帮我们把cookie从response中提取出来。但是如何保存在一个文件中呢?

FileCookieJar

FileCookieJar 实现了save()load()revert()三个函数。
但是通过查看FileCookieJar的源码我们可以发现,FileCookeJar并没有实现save()的具体功能,而是直接抛出了NotImplementedError

    def save(self, filename=None, ignore_discard=False, ignore_expires=False):
        """Save cookies to a file."""
        raise NotImplementedError()

FileCookieJar的子类MozillaCookieJarLWPCookieJar实现了save()方法。

示例代码:

# coding=utf-8
import cookielib
import urllib2

cookies = cookielib.MozillaCookieJar()
cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies)
opener = urllib2.build_opener(cookieHandler)
urllib2.install_opener(opener)

request = urllib2.Request("http://www.baidu.com")
urllib2.urlopen(request)

# 将cookie存为一个文件
cookies.save(filename="cookie.txt")

# 新建一个cookie对象
cookies2 = cookielib.MozillaCookieJar()

# 从文件中读取cookie
cookies2.load("cookie.txt")
for cookie in cookies2:
    print cookie.name, cookie.value

save()函数带有两个参数,ignore_discard和ignore_expires。

ignore_discard: save even cookies set to be discarded. 即也保存需要被丢弃的cookie。
ignore_expires: save even cookies that have expired. 即过期的cookie也保存。

上面提到了save()、load(),还有一个函数未提到即revert()。revert()函数的作用是Clear all cookies and reload cookies from a saved file.

模拟登录实际操作

我们来试一下模拟登录SegmentFault。
示例代码如下:

import urllib
import urllib2
import cookielib

cookies = cookielib.MozillaCookieJar()
cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies)
opener = urllib2.build_opener(cookieHandler)
urllib2.install_opener(opener)

postData = {
    "remember": 1,
    "username": "YOUREMAIL",
    "password": "YOURPASSWORD"
}
headers = {
    "Accept": "*/*",

    "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4",
    "Connection": "keep-alive",
    "Content-Length": "54",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "Cookie": "_gat=1; PHPSESSID=YOUR_PHPSESSID; _ga=GA1.2.741059584.1485746441; Hm_lvt_e23800c454aa573c0ccb16b52665ac26=1485746441; Hm_lpvt_e23800c454aa573c0ccb16b52665ac26=1485746618",
    "DNT": "1",
    "Host": "segmentfault.com",
    "Origin": "https://segmentfault.com",
    "Referer": "https://segmentfault.com/",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"
}
request = urllib2.Request("https://segmentfault.com/api/user/login?_=57f36e7f98914cc9a7971aebc264e113", headers=headers)
request.add_data(urllib.urlencode(postData))

response = urllib2.urlopen(request)
print response.getcode()
for cookie in cookies:
    print cookie.name, cookie.value

response = urllib2.urlopen("https://segmentfault.com/u/charliecharlie")
print response.read()

但是目前这个模拟登录并不完美。
实际上浏览器在访问第一个页面的时候,服务器就在Response中返回了一个cookie,设置了一个PHPSESSID的Cookie。
目前博主只知道login链接后带的_参数需要与PHPSESSID相匹配。但是并不知道两者具体的关系。
且上述代码中其实并不需要HTTPCookieProcessor而是直接写在headers里即可。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38407.html

相关文章

  • 爬虫养成 - 网络下载器urllib2初认识

    摘要:申明本系列文章借鉴了慕课网的课程,。慕课网是一个非常赞的学习网站。是下的一个模块,在中,被拆分成和实现一个最简单的下载器使用函数可以给服务器发送一个请求。该函数返回一个该返回的对象有三个额外的函数取得服务器返回的。默认没有的,请求方式为。 申明:本系列文章借鉴了慕课网的课程,http://www.imooc.com/learn/563。慕课网是一个非常赞的学习网站。 urllib2是p...

    AlphaWallet 评论0 收藏0
  • 爬虫养成 - urllib2调试和错误处理

    摘要:设置和处理事实上,并不是所有发起的请求都能得到服务器的回应。例如网络无链接连接不到服务器链接不存在请求的方法不对等情况都会造成抛出错误。上面说到的出错就会抛出。用于处理相关的错误。 urllib2的timeout timeout参数用于设置超时。我们在爬取一些响应较慢的网站的时候,需要设置一个比较长的超时时间。 response = urllib2.urlopen(request, t...

    CoffeX 评论0 收藏0
  • 爬虫养成 - 网络下载器urllib2伪装术

    摘要:发送请求方不希望被跟踪。主要用来将伪装成一个正常的浏览器。该字典就是说是网络协议名称,是代理的。另外一般会明确指定资源存放的位置。意思是将现在提交的数据存放于下第篇。请求删除某一个资源。向服务器提交数据。 前一个教程我们涉及到了urllib2的一些高级应用。这一片文章我们来比较系统的介绍一下。 该篇教程参考了静觅的博文:http://cuiqingcai.com/954.html。写这...

    Darkgel 评论0 收藏0
  • 爬虫系列之三】URLError异常处理以及Cookie使用

    摘要:一的处理出现产生的原因很多,比如网络没法连接,连接不到服务器,或者服务器不存在。二的使用,一般是某些网站为了辨别用户身份,进行跟踪,从而存储在客户端的数据。模块的主要作用是提供可存储的对象,以便于与模块配合使用来访问资源。 一、urlError的处理 出现urlError产生的原因很多,比如:网络没法连接,连接不到服务器,或者服务器不存在。在代码中,我们需要用try-except的语句...

    xiaochao 评论0 收藏0
  • 爬虫养成 - 什么是网络爬虫

    摘要:趁着春节,希望能写一个小小的网络爬虫框架。网页下载器接收,将页面内容下来。可以定义一个表,定义两个字段和缓存数据库网页下载器网页下载器就是更具下载网页内容等。常见的网页下载器有是官方的基础模块。 趁着春节,希望能写一个小小的网络爬虫框架。先定一个小目标,希望能比较优雅地将某个网站上的所有图片爬下来。暂时先将这个爬虫的名字叫做Squirrel,小松鼠吧。 什么是爬虫 爬虫其实是一种从互联...

    lucas 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<