注册
登录
提问时间:2019/3/1 14:05:03    楼主:未知网友   阅读量:237

有些时候,当我们去访问一个页面时,经常会跳转到登陆页面,比如人人网上看用户空间,这是因为没有登陆不允许访问的缘故。当我们使用爬虫去爬取一些用户相关信息的数据时,也会发现往往爬取到的是登陆页面,并不是我们想要的结果。

那该如何解决呢,总不能每次都先去登陆网站,然后再去爬取吧,这时候就需要cookie闪亮登场了。什么是cookie呢?当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie。

cookie有什么作用呢?我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。

经过上面的介绍,我们差不多明白了cookie的重要性,也知道了为什么有时候爬取到的是登陆页面而不是我们想要的结果。重回之前的问题,当我们要爬取一个人人网的用户空间信息,应该怎么操作呢?

1、我们需要使用爬虫程序对人人网的登录时的请求进行一次抓取,获取请求中的cookie数据;

2、在使用个人信息页的url进行请求时,该请求需要携带 1 中的cookie,只有携带了cookie后,服务器才可识别这次请求的用户信息,方可响应回指定的用户信息页数据。

import requests

from lxml import etree


headers = {

    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"

}

# 1.进行登陆操作,服务器就会对当前用户 创建一个cookie对象(存储当前的用户状态信息,以及身份标识)

# 2. 进行个人主页的请求(携带步骤1中创建的cookie), 获取当前用户个人主页的页面数据


# 登陆

 #登录请求的url(通过抓包工具获取)

login_url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2018922053679 "

session = requests.session()  # #创建一个session对象,该对象会自动将请求中的cookie进行存储和携带

data = {

    "captcha_type":"web_login",

    "domain":"renren.com",

    "email":"18829037944",

    "f":"",

    "icode":"",

    "key_id":"1",

    "origURL":"http://www.renren.com/home",

    "password": "30f28dff42c847e99969e7e91f8356bcb80aa2e9993893add81b6ff76c899be3",

    "rkey": "f1ace095ea75f09850cbb28b87a04b9e",

}

session.post(url=login_url, data=data, headers=headers) #  使用session发送请求,目的是为了将session保存该次请求中的cookie


get_url = "http://www.renren.com/968520666/profile"

#  再次使用session进行请求的发送,该次请求中已经携带了cookie

response = session.get(url=get_url, headers=headers)

#设置响应内容的编码格式

response.encoding = 'utf-8'

page_text = response.text


#将响应内容写入文件

with open('./renren01.html','w', encoding="utf-8") as fp:

    fp.write(response.text)

    print("over")