Python 爬虫(七)-- Scrapy 模拟登录

1. Cookie原理


HTTP是无状态的面向连接的协议, 为了保持连接状态, 引入了Cookie机制

Cookie是http消息头中的一种属性,包括:

  • Cookie名字(Name)Cookie的值(Value)
  • Cookie的过期时间(Expires/Max-Age)
  • Cookie作用路径(Path)
  • Cookie所在域名(Domain),使用Cookie进行安全连接(Secure)。

前两个参数是Cookie应用的必要条件,另外,还包括Cookie大小(Size,不同浏览器对Cookie个数及大小限制是有差异的)。

更详细的cookie

2. 模拟登陆


这次主要爬取的网站是知乎

爬取知乎就需要登陆的, 通过之前的python内建库, 可以很容易的实现表单提交

现在就来看看如何通过Scrapy实现表单提交

首先查看登陆时的表单结果, 依然像前面使用的技巧一样, 故意输错密码, 方面抓到登陆的网页头部和表单(我使用的Chrome自带的开发者工具中的Network功能)

cpp_py_medium

表单截图

查看抓取到的表单可以发现有四个部分:

  • 邮箱和密码就是个人登陆的邮箱和密码
  • rememberme字段表示是否记住账号
  • 第一个字段是_xsrf,猜测是一种验证机制

现在只有_xsrf不知道, 猜想这个验证字段肯定会实现在请求网页的时候发送过来, 那么我们查看当前网页的源码(鼠标右键然后查看网页源代码, 或者直接用快捷键)

cpp_py_medium

查询网页源码

发现我们的猜测是正确的

那么现在就可以来写表单登陆功能了

其中主要的功能都在函数的注释中说明

3. Cookie的保存


为了能使用同一个状态持续的爬取网站, 就需要保存cookie, 使用cookie保存状态, Scrapy提供了cookie处理的中间件, 可以直接拿来使用

CookiesMiddleware

这个cookie中间件保存追踪web服务器发出的cookie, 并将这个cookie在接来下的请求的时候进行发送

Scrapy官方的文档中给出了下面的代码范例 :

那么可以对我们的爬虫类中方法进行修改, 使其追踪cookie

4. 伪装头部


有时候登陆网站需要进行头部伪装, 比如增加防盗链的头部, 还有模拟服务器登陆, 这些都在前面的爬虫知识中提到过

cpp_py_medium

Headers

为了保险, 我们可以在头部中填充更多的字段, 如下

在scrapy中RequestFormRequest初始化的时候都有一个headers字段, 可以自定义头部, 这样我们可以添加headers字段

形成最终版的登陆函数

5. Item类和抓取间隔


完整的知乎爬虫代码链接

设置抓取间隔, 访问由于爬虫的过快抓取, 引发网站的发爬虫机制, 在setting.py中设置

更多设置可以查看官方文档

抓取结果(只是截取了其中很少一部分)

6. 存在问题

  • Rule设计不能实现全网站抓取, 只是设置了简单的问题的抓取
  • Xpath设置不严谨, 需要重新思考
  • Unicode编码应该转换成UTF-8
1 6 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部