这次我们将主要尝试利用python
+requsets
模拟登录豆瓣爬取复仇者联盟4影评,首先让我们了解一些模拟登录相关知识补充。本文结构如下:
request模块介绍与安装
get与post方式介绍
request模块使用实例
requsets
和urllib
都是爬虫的常用模块,requsets更加友好。虽然上一篇爬取糗事百科的实战中我们用的urllib模块,但是基本不影响我们快速入手requsets,因为上一篇主要还是介绍爬虫爬取数据的一个流程,正则分析etc.
查看更多requests
模块信息,请查阅: 官方文档
win10上requests安装教程
上一篇爬取糗事百科数据使用的urllib
模块,都是用get
方式来爬取数据(没有用urllib2.Request的date参数,date参数在post方式时用到)。而post
和get
有什么区别呢?
HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE,对应着对这个资源的查,改,增,删 4个操作。到这里,大家应该有个大概的了解了,GET
一般用于获取/查询资源信息,而POST
一般用于更新资源信息。
- get是从服务器上获取数据,post是向服务器传送数据。
- get是把参数数据(如你的账号密码等信息)队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段对应,在URL中可看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
- 对于get方式,服务器端用
Request.QueryString
获取变量的值,对于post方式,服务器端用Request.Form
获取提交的数据。- get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
- get安全性非常低,post安全性较高
首先,我们看一下requests.get
原型:
requests.get
(url, params=None, **kwargs)[源代码]Sends a GET request.
参数 url* – URL for the new Request
object. params – (optional) Dictionary or bytes to be sent in the query string for theRequest
. **kwargs – Optional arguments thatrequest
takes.返回 Response
object
显然这里有多个参数,params参数就是先前提到附在URL后的请求数据信息,暂且不提。和前文一样,F12打开开发者工具,设置UR
L和headers
参数来爬取豆瓣复仇者联盟的影评界面源码。
1.url
登陆豆瓣找到影评,多尝试翻页可以发现URL格式变化规律如下:
如果我们需要爬取第二页只需将改为start = 20即可。
2.headers常见反爬虫参数设置
在这里我们仅设置User-Agent即可。
3.代码及结果展示
# 1.利用request.get获取网页源码
url = "https://movie.douban.com/subject/26100958/comments?start=0&limit=20&sort=new_score&status=P"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0)Gecko/20100101 Firefox/66.0"
}
r = requests.get(url, headers=headers)
html = r.text
print(html)
经过上面介绍,我们知道网站登录密码肯定就是post
方式传递参数拼接URL。那么整个流程为:
post
发送账号密码等FormDate
(表单数据)给服务器cookie
等信息标识我们的身份request.session
保存cookie
等信息(服务器用来识别用户)开始访问网站。 本次,接下来将模拟登陆豆瓣获取个人主页信息说明整个流程。
request.post
原型如下:
requests.post
(url, data=None, json=None, **kwargs)[源代码]Sends a POST request.
首先,我们打开登陆界面,随便输入错误的账号和密码,按下F12,打开开发者界面查看Network,观察服务器响应(抓包)。
我们可以看到一个可疑的xhr文件basic
,里面有Form Date
信息即是我们要找的。同时,我们也可以在General
中发现真实请求的登陆网址:
headers
设置见前,代码见下:
# 1.设置URL 和 headers
loginURL = "https://accounts.douban.com/j/mobile/login/basic"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"
}
# 2.分析表单
data = {
"ck": "",
"name": "你的账号",
"password": "你的密码",
"remember": "false",
"ticket": ""
}
向服务器post参数后,要保存服务器发来的cookie等信息(识别用户),利用requests库的session会话对象跨请求保持这些参数信息。
# 3.创建session对象保存对话
session = requests.Session()
session.post(url=loginURL, headers=headers, data=data)
登陆豆瓣个人主页,首先要知道我们的个人主页地址,手动登陆进入个人主页界面查看。然后利用session对象进行get请求即可。
# 4.开始登陆豆瓣
# 比如获取登陆后我的主页信息
personalURL = "https://www.douban.com/people/195562116/"
r = session.get(personalURL)
if r.status_code == 200:
print("登陆成功!\n")
print(r.text)
else:
print("登陆失败!")
本次我们初步了解利用post方式模拟登陆豆瓣,下篇文章:爬虫实战2(下):爬取豆瓣影评,我们将展示利用python
+request
+re
爬取豆瓣影评的实战记录。