☘前言☘
读完这篇博客,你可以学到什么?
excel的读取和写入方式
获取接口的方式
多线程提高爬虫效率
云端服务器部署web服务实时更新
这篇博客里,我将在上一篇文章的基础上进一步来发掘网站接口api提高访问速度,进一步多线程发掘更快的速度,最后部署到web服务器来实现实时更新排行榜的访问。
没有读过上一篇文章没有基础的同学可以先看一下之前的文章【从零开始的python生活①】手撕爬虫扒一扒力扣的用户刷题数据
全文大约阅读时间: 20min
🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
主要内容
☘前言☘
一、改进原因
🚨1.时间效率
2.资源占用
二、接口的获取
1.找到查询信息
2.确定传入参数
2.1确定头部信息
2.2确定传输参数
三、数据的读入与查询写回
1.数据读入查询
2.数据的写回
四、多线程请求信息
五、web前端的书写
1.默认的生成结果:
2.改变为整行的颜色显示
3.完善样式表
六、其他补充
1.CSRF的获取
2.web服务器直接写入静态页面地址
3.电脑端的呈现页面
4.数据的定时更新
七、写在最后
一、改进原因
上一篇的文章代码改进(主要是使用无头模式,不显示画面来提高速度):
ch_options = webdriver.ChromeOptions() # 为Chrome配置无头模式 ch_options.add_argument("--headless") ch_options.add_argument('--no-sandbox') ch_options.add_argument('--disable-gpu') ch_options.add_argument('--disable-dev-shm-usage') ch_options.add_argument('log-level=3') ch_options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging']) ch_options.add_experimental_option('useAutomationExtension', False) ch_options.add_argument("--disable-blink-features=AutomationControlled") driver = webdriver.Chrome(options=ch_options) driver.implicitly_wait(10)
🚨1.时间效率
下图是我在树莓派4B上运行的时间截图。900s,这在服务器上是不可接受的
2.资源占用
这是我电脑运行时的资源占用,如果服务器运行的话直接炸裂。。。可能会导致我本身的web服务停止反应。
二、接口的获取
1.找到查询信息
首先访问自己的主页并按f12进入开发者工具
按ctrl+f查找自己的刷题数目
可以成功找到对应的关键字为acTotal并且对应的请求就是看标头。
2.确定传入参数
2.1确定头部信息
可以发现标头的地址就是https://leetcode-cn.com/graphql/,那我们虎一点直接post一下看看反馈。上图告诉我们我没没有给他CSRF校验。
我们正常的请求参数是在这里,其实就是在头部。一般这种网站还需要申请网站信息,所以我们可以将对应的头部信息传给它。
现在我们就成功给到了标头,提示我们传参错误,我们压根没传参,233
2.2确定传输参数
查看payload可以发现主要的传输数据 我们把它拷贝出来作为数据传给对应的网址:
错误信息告诉我variables不符合要求,啊这???其实是需要把variables的值变成字符串:
嗯,这就拿到了我们需要的数据,但是这也太复杂了,可以发现查询结果全靠query字段。我们对它进行一些精简:
在不破坏层级的条件下精简到了极致,返回信息只有我们想要的数据了
我们再修改一下返回数据的值就完美了。
为了方便,我们把根据名字查询信息封装成函数并做验证
三、数据的读入与查询写回
1.数据读入查询
其实上一次已经完成了相关数据的读入,但是这一次我们只需要用户的名称。所以我们有一点改变。我们读入数据,如果不符合要求直接输出0
符合要求的我们需要从其中找到用户名,分析链接发现/u/{用户名}/,所以我们可以用正则表达式提取出对应的用户名
此时已经可以输出对应的数据了
2.数据的写回
一开始为了复制回腾讯文档我直接使用了txt作为输出,很简单:
可以发现在这种情况下,cpu负载极低,速度也有极大的提升,但是我们知道requests是访问网络资源,限制时间的主要问题在于网络等待,所以我们更希望用多线程并发请求来达到提高程序速度的要求。