爬虫实战2(上):爬取豆瓣影评


 这次我们将主要尝试利用python+requsets模拟登录豆瓣爬取复仇者联盟4影评,首先让我们了解一些模拟登录相关知识补充。本文结构如下:

  • request模块介绍与安装

  • getpost方式介绍

  • request模块使用实例

 

一、request模块介绍与安装

 

1.requests和urllib区别

  requsetsurllib都是爬虫的常用模块,requsets更加友好。虽然上一篇爬取糗事百科的实战中我们用的urllib模块,但是基本不影响我们快速入手requsets,因为上一篇主要还是介绍爬虫爬取数据的一个流程,正则分析etc.
  查看更多requests模块信息,请查阅: 官方文档

2.requests模块安装教程

   win10上requests安装教程

 

二、get与post方式介绍

 
  上一篇爬取糗事百科数据使用的urllib模块,都是用get方式来爬取数据(没有用urllib2.Request的date参数,date参数在post方式时用到)。而postget有什么区别呢?

  HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GETPOSTPUTDELETE,对应着对这个资源的 4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

  1. get是从服务器上获取数据,post是向服务器传送数据。
  2. get是把参数数据(如你的账号密码等信息)队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段对应,在URL中可看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
  3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
  4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
  5. get安全性非常低,post安全性较高

 

三、request模块使用实例

 

1.get方式使用实例

 
  首先,我们看一下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 the Request. **kwargs – Optional arguments that request takes.
返回 Response object

  显然这里有多个参数,params参数就是先前提到附在URL后的请求数据信息,暂且不提。和前文一样,F12打开开发者工具,设置URL和headers参数来爬取豆瓣复仇者联盟的影评界面源码。

  • 1.url

    登陆豆瓣找到影评,多尝试翻页可以发现URL格式变化规律如下:

    爬虫实战2(上):爬取豆瓣影评

    如果我们需要爬取第二页只需将改为start = 20即可。

  • 2.headers常见反爬虫参数设置

    • Host :请求的服务器主机
    • User-Agent:操作系统版本、浏览器内核、浏览器厂商等信息
    • Referer:当前页面的上一个页面

          在这里我们仅设置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)
    

    爬虫实战2(上):爬取豆瓣影评

2.post方式使用实例

 
  经过上面介绍,我们知道网站登录密码肯定就是post方式传递参数拼接URL。那么整个流程为:

  1. post发送账号密码等FormDate(表单数据)给服务器
  2. 服务器返回cookie等信息标识我们的身份
  3. 利用request.session保存cookie等信息(服务器用来识别用户)开始访问网站。

   本次,接下来将模拟登陆豆瓣获取个人主页信息说明整个流程。
 

 1.构造request.post参数

    request.post原型如下:

requests.post(url, data=None, json=None, **kwargs)[源代码]

Sends a POST request.

 首先,我们打开登陆界面,随便输入错误的账号和密码,按下F12,打开开发者界面查看Network,观察服务器响应(抓包)。

爬虫实战2(上):爬取豆瓣影评

  我们可以看到一个可疑的xhr文件basic,里面有Form Date信息即是我们要找的。同时,我们也可以在General中发现真实请求的登陆网址: 爬虫实战2(上):爬取豆瓣影评

    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": ""
}

 

 2.session对话保持

  向服务器post参数后,要保存服务器发来的cookie等信息(识别用户),利用requests库的session会话对象跨请求保持这些参数信息。

# 3.创建session对象保存对话
session = requests.Session()
session.post(url=loginURL, headers=headers, data=data)

 

 3.登陆豆瓣

  登陆豆瓣个人主页,首先要知道我们的个人主页地址,手动登陆进入个人主页界面查看。然后利用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("登陆失败!")

爬虫实战2(上):爬取豆瓣影评

四、结语

  本次我们初步了解利用post方式模拟登陆豆瓣,下篇文章我们将展示利用python+request+re爬取豆瓣影评的实战记录。