通过前两天的小demo,大家是不是对Spider有了进一步的了解。是不是感觉通过短短几行代码就能够获取并保存我们想要保存的内容就很神奇,其实这些都没什么。总之,紧跟博主步伐就了 -。-
当我们真正开始数据采集的操作之后,我们遇到的第一个问题就是,如何获取登录窗口背后的数据 许多网站的内容是需要登录之后才能抓取的,如微博,百度云盘,知乎等。这些网站只有登录之后才能看到想要的信息。
登录权限包含什么? 1、服务器生成的令牌 2、登录有效时限 3、状态跟踪信息
Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而存储在用户本地终端上的数据(通常经过加密)。 Cookie是小量信息,是由Web服务器创建的,将信息存放在用户计算机的文件上
通过上述页面我们可以看到,登陆上去会有提示。
上述返回200代表成功访问,这是为什么呢?因为我们添加了Cookie
一个简单的Cookie
Chrome DevTools是Chrome浏览器自带的开发人员工具,我们检测网络流量要用到的是其中的Network面板 默认情况下,只要DevTools在开启状态,DevTools会记录所有的网络请求,记录都是在Network中展示出来
上述的过程都是建立在登录有Cookie的前提下才能进行访问查看,如果没有登录则不能查看及操作。
Cookie这方面博主就介绍到这里,如果想看剩下的可以看博主以往的博文。传送门——> 快速入门网络爬虫系列 Chapter13 | 模拟登陆
我们知道有些网站登陆之后才可以显示需要的数据。这里需要了解web中的cookie
和session
。
cookie
是保存在浏览器客户端的,session
是保存在服务器端的,session
依赖于cookie
实现。当访问对应网站的时候cookie
是再次发回当前网站对应的服务器。cookie
和session
都是有有效期的。
这个时候我们需要看下下图:
当我们添加cookie之后,相当于模拟了我们登录账号。这个时候就可以直接进入登录之后的界面
至于cookie和session时效性:
cookie:一般默认为14天。 session:如果没有特殊情况,半个小时
。
模拟登录的分析就这么多,那么接下来就可以来实现了。
通过上图分析我们可以知道 Github的GET网址为:https://github.com/login Github的POST网址为:https://github.com/session
import requests
url = "https://github.com/session"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
# 加入需要的cookie表示已经登陆了
"cookie": "_octo=GH1.1.332975439.1600306176; _ga=GA1.2.1383224642.1600306188; _device_id=b3fc5e59ed4944773db74bbfa4adafe8; has_recent_activity=1; tz=Asia%2FShanghai; tz=Asia%2FShanghai; _gat=1; logged_in=no; _gh_sess=F6769fV4FjQ9Fn%2FbXDdVeQZvq%2FxCRmVcXlS7FO3jaPp6XtEXoiqI35eogYuKa85J5gQ2LBNFK79qmJH6OTCU2U97IJHb0WanI7%2FnCe35CWsEo5D3OzQxJLeXfqm5DleVEsLcj7WzOKZngfoW30tHxPmMzcWFHO%2FwyfFhFL4w6IPdQ8tY4gg8Y4M4ugCf1sAdMSJhxwWuPFBExpfvLPVOgX4a%2FtHaVXMYUmYEdx76C512wuRiND%2FR9Yjcxz0w%2BEKzJ%2Bc6yY6hvwAUKAkLAVjVew%3D%3D--tnXOGubdyTAls3fX--TTHuSWdAkG%2Bgl%2BA9I%2B9fiw%3D%3D",
}
response = requests.get(url=url, headers=headers)
print(response)
print(response.content.decode("utf-8"))
print(response.status_code)
通过上图,我们可以看到<Response [200]>
代表登录成功。至于是不是成功呢?我们可以查看以下
通过查找对比,我们发现登录成功。
上述代码只能通过复制cookie来模拟登录,那么能不能智能些呢?
答案是肯定的。我们可以通过获取authenticity_token
,并输入账号密码进行登录。
为什么直接就说需要这三个呢? 看下图:
上图为所有的parms
,经过测试,只需要最少三个即可完成登录,那就是authenticity_token
,login
,password
。
想要实现,我们需要先获取authenticity_token
,我们先来看网页
我们很容易就看到了authenticity_token
,找到了,接下来的提取就很简单了,我们通过正则进行提取
#获取token
authenticity_token = re.findall(r'name="authenticity_token" value="(.*?)"',content)[0]
# encoding: utf-8
'''
@author 李华鑫
@create 2020-10-06 14:57
Mycsdn:https://buwenbuhuo.blog.csdn.net/
@contact: 459804692@qq.com
@software: Pycharm
@file: requests中的session.py
@Version:1.0
'''
import requests
import re
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}
url_login = "https://github.com/login"
url_login_action = "https://github.com/session"
# url_profile = "https://github.com/settings/profile"
# 创建session对象
session = requests.session()
# 使用session发送请求,对应的响应中的cookie会自动保存到sesison对象中
response = session.get(url=url_login, headers=headers)
print("cookie:", response.cookies)
#获取响应内容
content = response.content.decode("utf-8")
#获取token
authenticity_token = re.findall(r'name="authenticity_token" value="(.*?)"',content)[0]
print(authenticity_token)
# 准备参数
data = {
"authenticity_token": authenticity_token,
"login": input("用户名:"),
"password":input("密码:"),
}
# 使用session发送请求,上次存储的当前网站的cookie会自动发送过去
response2 = session.post(url=url_login_action, headers=headers, data=data)
#获取响应内容
print(response2.content.decode("utf-8"))
?,完工!
美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!