网页抓取qq(考虑一个问题:如何抓取一个访问受限的网页(组图))

优采云 发布时间: 2021-10-08 01:28

  网页抓取qq(考虑一个问题:如何抓取一个访问受限的网页(组图))

  考虑一个问题:如何抓取访问受限的网页?如学校好友主页、个人新闻页面等。

  显然,通过浏览器,我们可以手动输入用户名和密码来访问目标页面。所谓的“抓取”,不过是需要我们用一个程序来模拟完成同样的工作,所以我们需要了解在“登录”的过程中发生了什么。

  对于未登录的用户,服务器强制用户跳转到登陆页面。用户输入用户名和密码并提交。服务器将用户的POST信息与数据库中的信息进行比较,如果通过则跳转到登陆页面。那么当我们访问其他页面时,服务器是如何判断我们的身份的呢?由于HTTP协议是无状态的,显然服务器无法直接知道我们最后一秒刚刚登录成功。

  最简单的想法是,在每个POST请求中,用户都需要带上用户名和密码来标识自己的身份;虽然这是可行的,但是大大增加了服务器的负担(对于每个请求,都需要经过数据库的验证),也大大降低了用户体验(每个页面都需要重新输入用户名和密码,并且每个页面都有一个登录表单)。

  因此,一个解决方案诞生了:cookie。Cookie,简而言之就是将用户操作的一些历史信息(当然也包括登录信息)保存在本地计算机上,当用户再次访问该站点时,浏览器通过HTTP将本地cookie的内容发送给服务器协议完成验证,或继续上一步。

  更进一步,另一种解决方案诞生了:session,简而言之,就是将用户操作的历史信息保存在服务器上。但是这种方式还是需要将发送请求的客户端与会话对象进行匹配,所以可以通过cookie机制获取客户端的身份(即会话id),也可以通过GET将id提交给服务器。session id,即服务器上会话对象文件的名称,由服务器生成,以保证随机性和唯一性。它相当于一个随机密钥,以避免在握手或传输过程中暴露用户的真实密码。类似的设计思路在 SSO 和 OpenID 中也经常使用。

  再插入一个问题:为什么有些网站,关闭浏览器后,session就失效了?

  从上面可以看出,session一般是通过cookie来保存session id的。如果cookie设置为在浏览器关闭时过期,那么无论怎么设置会话超时机制,浏览器重启时都找不到原来的cookie。所以服务器只能重新分配会话 id 给它。

  cookie 和 session 的区别?

  session和cookie的目的是一样的,都是为了克服http协议的无状态缺陷,只是完成的方法不同。session通过cookie在客户端保存session id,在服务器的session对象中保存用户的其他session消息。相比之下,cookie需要保存客户端的所有信息。因此,cookies具有一定的安全风险。比如本地cookie中存储的用户名和密码被破译,或者cookie被其他网站采集(例如:1. appA主动设置域B cookie让域B cookie获取;2. XSS,在appA上通过javascript获取document.cookie,传递给你的appB)。

  我在写php App的时候就知道可以通过SSO从Session中获取userid,但是不知道为什么,所以遇到了一个奇怪的问题:在浏览器A标签的脚本执行过程中,打开B 标签访问同一个脚本,它会一直挂起,直到 A 被执行。原因是脚本执行了session_start(),php session_start()之后对session的写入是独占的。只有当脚本执行结束或显式执行 session_destroy() 时,才能释放会话文件锁。因为不知道session的工作原理,困扰了整整一个工作日!类似的问题是gbk和gb2312区别中的一些字符无法存储,因为他们不了解Lamp中字符编码的转换规则。

  因此,要知道为什么,我们还需要知道为什么。磨刀不误砍柴,教人钓鱼,在做web开发之前,一定要了解清楚一些必要的知识,以免在使用的时候被拉长,或者在调整bug的时候像无头苍蝇一样。做好自身建设,总比逐案被动满足要好。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线