爬虫 | 蓝桥社区热搜点赞器

发布时间 2023-07-31 12:09:13作者: 张Zong在修行

本实验首先为大家介绍了爬虫必备的知识 cookie,掌握 cookie 的使用场景之后,再结合爬虫思想实现了两款实用工具,自动点赞器与自动签到器,为大家扩展了爬虫编写工具的新思路。本节实验的最后会向大家简单介绍爬虫未来的学习方向。

知识点

  • cookie 与爬虫
  • 实验楼社区点赞器
  • 实验楼签到器
  • 爬虫未来学习方向

cookie 是网站存储在用户本地的数据,主要用途是辨别用户身份。在爬虫编写的过程中,程序员经常要使用 cookie 模拟当前登录用户信息,因为我们的目标数据,很多时候是登录状态下才可以看到的。

通过之前的实验,你应该已经知道 HTTP 协议本身是无状态的,即无法识别用户身份,但是咱碰到的网站很有记住用户名和密码功能,例如实验楼网站,它们背后的实现技术就是 cookie。cookie 是一小段文本信息(Key-Value 格式),当客户端向服务器发起请求之后,如果需要记录用户状态,那服务器会向客户端发送一段 cookie 文本,然后客户端会将其存储在本地,当浏览器再次请求该网站时,客户端浏览器会自动将该 cookie 发送到服务器,服务器即可通过该 cookie 判断用户状态。

本地查阅 cookie 也是通过开发者工具实现的,以我的蓝桥个人主页为例:

注意,在任何时候都要保护好自己的 cookie 信息,防止泄露。

上图获取的是该网站所有的 cookie,你可以只获取某一请求的 cookie,具体查阅方式如下图所示:

你也可以直接在 Headers 或者消息头选项卡中查看字符串格式的 cookie :

在打开的开发者工具中,可以看到 cookie 内容的构成。如果你只编写爬虫,那只需关注 名称 / Name 列与 值 / Value 列即可:

接下来我们将通过 cookie 完成两个案例,以下两个案例也属于爬虫应用范畴。

实验楼社区点赞器

现在很多社区类网站都有点赞功能,该功能完全可以自动化处理,学习本案例之后,你可以完成针对任意网站的自动点赞器。

首先在实验楼社区随意找一个帖子,例如 测试帖子,找到点赞入口。

通过鼠标点击,触发点赞操作,点赞之后得到如下内容。

# 数据接口
https://www.lanqiao.cn/api/v2/questions/6512/like/
# 请求方式
PUT
# 请求参数
无
# 请求返回数据格式
无

发现请求方式是 PUT,一个在之前实验没有碰到的请求方式,不过 requests 库已经给我们提供了对应的方法,与 GETPOST 没有区别。

接下来,快速实现一下点赞代码。

import requests
import re

headers = {
    "origin": "https://www.lanqiao.cn",
    "referer": "https://www.lanqiao.cn/questions/6512/",
    "user-agent": ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/"
              "537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36")
}

# 点赞
def like(question_id):
    url = "https://www.lanqiao.cn/api/v2/questions/{question_id}/like/".format(
        question_id=question_id)
    r = requests.put(url, headers=headers)
    print(r.json())

if __name__ == "__main__":
    # 传入固定的问题 ID
    like("6512")

运行代码之后,得到如下结果,提示 身份认证信息未提供。

该错误提示和刚才学习的 cookie 主要用途一致,恰好错误提示是缺少 cookie 相关内容,接下来将通过两种办法设置 cookie。

1. 通过请求头 headers 设置 cookie

将开发者工具中 cookie 参数复制到代码中,复制区域如下图所示。

得到的字符串如下(重要部分使用 ****** 替换):

_ga=GA1.2.******576; gr_user_id=60a6276f******bd; MEIQIA_TRACK_ID=1Xndxdu******Vhd; MEIQIA_VISIT_ID=1lC4X******P0exenE; Hm_lvt_56f68d******3560ae56=160******68961; _gid=GA1.2.1671391212.1609068962; lqtoken=07CA9******D3D6CCCE68E; comet=eyJ0eXAi******dwU3PLLSs2ylO0AP5EsGhc; session=a429a5fd-******xjXfEEM; Hm_lpvt_56f68d0377761a87e16266ec3560ae56=160******08

上文以及提及了 cookie 是以 Key-Value 格式存在的,所以复制出的字符串格式为 Name=Value 形式,并且每个键值对后面都存在一个 ;

将得到的 cookie 值,直接设置到代码中的 headers 字典部分,具体如下:

headers = {
    "origin": "https://www.lanqiao.cn",
    "referer": "https://www.lanqiao.cn/questions/6512/",
    "accept":"application/json, text/plain, */*",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
    "cookie":"你刚才得到的 cookie 字符串"
}

然后把代码中 like 函数的最后一行改为:

        print(r.ok)

程序运行结果:

代码运行完毕,在网页上刷新一下,看到确实新增了一个赞,由于实验楼的验证与显示机制,这里面赞按钮的颜色没有变化,你可以在网页上在点击一次,刷新页面之后发现依旧是 9 赞(橡皮擦在实验的时间是 9 赞,你看到时可能已经增加)。

对于刚才获取的 cookie 字符串,可以逐个键值对进行删减,获取到最重要的 cookie 值。因为服务器在判断的时候,可能只依据几个关键 cookie 参数进行身份验证,经过删减之后得到的关键 cookie 如下:

# 只有一个 session
session= 你的 cookie 值;

通过这一个 cookie,服务器就可判断出你的身份。

2. 通过请求头 requests.put 方法的 cookie 参数

上文是通过设置请求头中的 cookie,向服务器发送客户端身份数据。

第二种方式是通过 requests 方法中的 cookie 参数进行设置,具体代码如下:

import requests
import re

headers = {
    "origin": "https://www.lanqiao.cn",
    "referer": "https://www.lanqiao.cn/questions/6512/",
    "accept": "application/json, text/plain, */*",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36"
}

# 设置 cookie 字典
cookie_dict = {
    "session": "你的 cookie 值"
}

# 点赞
def like(question_id):
    url = "https://www.lanqiao.cn/api/v2/questions/{question_id}/like/".format(
        question_id=question_id)
    r = requests.put(url, headers=headers, cookies=cookie_dict)
    ret = r.text
    # 注意,点赞成功返回空,没有任何状态标识。
    print(ret)

if __name__ == "__main__":
    like("6512")

通过上述两种方式,都可以向服务器发送 cookie,掌握任何一种都可以。

以上案例有两个扩展点,大家可以继续完善下去。

  1. 实验中采用了一个固定的问题 ID,你可以先爬取问题列表,然后进行批量点赞;
  2. cookie 值是从开发者工具直接复制的,你可以尝试通过代码获取。

本案例最终实现的是爬虫应用非常多的一个场景,自动点赞器。市面上所有的自动化点赞工具思路基本一致,都是通过特定的用户标识去定向点赞,你可以将思路在扩展一下,在点赞的基础之上,其实可以尝试实现一款自动评论器。

实验楼自动签到器

有了点赞器与评论器之后,还可以实现一种自动化的工具,也属于爬虫应用范畴,自动签到器。

本案例由于比较费账号,因为每个账号每天只能签到一次,实验测试一下就结束了~

只提供思路与关键参数。

通过开发者工具捕获到请求信息如下:

# 请求地址
https://www.lanqiao.cn/api/v2/user/checkin/
# 请求方式
POST
# 请求参数
无
# 请求成功返回
{"beans":1}

核心代码如下,与自动点赞器基本一致。将如下代码写入 /home/project/demo4.py 文件:

import requests
import re

headers = {
    "origin": "https://www.lanqiao.cn",
    "referer": "https://www.lanqiao.cn/questions/6512/",
    "accept": "application/json, text/plain, */*",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36"
}

# 设置 cookie 字典
cookie_dict = {
    "session": "你的 cookie 值"
}

# 签到
def checkin():
    url = "https://www.lanqiao.cn/api/v2/user/checkin/"
    r = requests.post(url, headers=headers, cookies=cookie_dict)
    ret = r.text
    print(ret)

if __name__ == "__main__":
    checkin()

该内容可以部署在服务器之上,每天定时运行一次,与上一实验热榜相同,每日都可自动帮你签到,防止遗忘。

执行结果如下:

爬虫未来学习方向(重点)

本课程的实验就结束了,接下来的学习方向是从基础部分提高,到爬虫框架,到手机 APP 爬虫,再到分布式爬虫,每个领域都需要投入精力去学习与研究。为了不让你迷失到爬虫世界里,橡皮擦为你梳理了一条最简单、最直接的技术线。

多线程爬虫与常见反爬手段

本系列课程主要为大家介绍的是爬虫入门相关知识,9 讲过后你已经可以编写常见的爬虫程序,但现在我们学习的爬虫都称之为单线程或单进程爬虫,效率非常低,如果你想让你的爬虫程序效率成倍提升,那首先要学习的就是多线程或多进程爬虫。

多线程与多进程爬虫需要学习的相关技术点如下(包含但不仅限于)。

  1. Python threading 模块;
  2. Python Queue 模块;
  3. Python multiprocessing 模块;
  4. Python asyncio 模块。

以上内容学习之后,对爬虫程序运行的效率会有极大的提升。

基础部分除了爬虫效率外,还需要了解常见的反爬手段。之前的课程只提及了最简单的反爬手段,UA 判断,除了它以外,常见的反爬方式如下。

  1. 验证码,需要掌握验证码识别技术;
  2. IP 限制,需要学习代理相关知识;
  3. 字体反爬,JS 加密,需要学习前端加密相关知识。

以上内容为爬虫基础部分需要提高的相应技术点,可以作为重点去针对性学习。

爬虫框架

在实际编码中 requests 只是最简单与最常用的爬虫库,在工作中还有 2 个常用爬虫框架需要掌握。

  1. scrapy
  2. pyspider

以上两款框架也属于爬虫编写者必备的技能栈,在后续的学习过程也需要逐步掌握。

关于它们的相关资料非常多,在搜索引擎输入关键字即可检索。

手机 APP 爬虫

本课程中所有实验都是针对 Web 端 PC 站点进行爬取,但这只是爬虫的一个方向。

随着移动互联网时代的兴起,手机 APP 爬取,也成为了爬虫工程师日常工作之一。

如何爬取手机 APP 内容,可以从下述内容开始学习。

  1. Fiddler 工具的使用;
  2. Charles 工具的使用;
  3. mitmproxy 与 mitmdump;
  4. Appium。

更高阶的 APP 反编译涉及法律问题,学习可以但不建议应用。

分布式爬虫

当目标数据量大到一定程序时,单台电脑已经无法满足要求,此时就要针对性的去学习分布式爬虫相关技术了,可以从下述内容入手学习。

  1. Scrape-Redis
  2. Celery

学习到分布式爬虫之后,爬虫才真正的领域为你展开,你将面对海量的数据,真正进入大数据时代。

实验总结

爬虫除了获取数据以外,存在很多的应用场景,例如本实验中提及的自动化操作,通过爬虫程序可以大幅度低重复性劳动,甚至很多群发器都是基于爬虫逻辑实现。

获取数据,存储数据爬虫最基础的应用,也是前 8 个实验的内容,本实验希望可以让你感受到爬虫在自动化领域的使用价值,再次丰富你对爬虫的认识。

云计算与大数据的时代已经来临,爬虫技术作为数据挖掘的一条分支,被越来越多的人重视起来,依旧如第一讲所说,在当今时代,在互联网任何领域,如果你掌握爬虫技术,都会极大地提高你的职场竞争力,为你技术之路加分。