【从零开始的python生活②】力扣爬虫改进方法(2)

简介: 【从零开始的python生活②】力扣爬虫改进方法(2)

四、多线程请求信息

此处感谢明佬的指导,省了不少麻烦事@小小明-代码实体

首先介绍一下ThreadPoolExecutor线程库:

导入:


from concurrent.futures import ThreadPoolExecutor


创建线程库:


with ThreadPoolExecutor(max_workers=10) as executor:


按照次序返回结果,并接收:


nums = executor.map(chaxun, df.力扣主页.str.extract(
           r"leetcode-cn.com/u/([^/]+)(?:/|$)", expand=False))


其中第二个参数就是传入的参数列表,并且.map可以按照输入顺序进行输出。

我们只要将返回的nums转化为list就可以按之前的顺序得到结果。

整体函数:



耗时:>得到的结果

五、web前端的书写

此处万分感谢明佬的辛勤劳动:@小小明-代码实体

pandas默认是可以直接生成html的文件的,我们稍加修饰就好了


1.默认的生成结果:



2.改变为整行的颜色显示

查看生成的样式表,我们需要把对应的值改掉#T_18e34_row0_col3变成.row0

53821bc48c174945a36933145613a416.png

利用正则表达式进行替换(这里我真的没看懂,还是求救的明佬,明佬yyds!!!)

4ed3aa0c1c5f4900b0fc6ec9d2bbc817.png


67ff3d420f074a51992ebf3f8bca4227.png

3.完善样式表

最后再加入自己想要定制的显示方式然后返回对应的html信息就好了。


1493b8003d574e38b54eac62d409c76c.png

六、其他补充

1.CSRF的获取

requests可以直接获取一个cookie,我们可以从cookies中提取出来
def int_csrf():
  global headers
  sess= requests.session()
  sess.head("https://leetcode-cn.com/graphql/")
  headers['x-csrftoken'] = sess.cookies["csrftoken"]


2.web服务器直接写入静态页面地址

cab48940bf1b46e1bacded1938a07959.png

可以直接写入对应网页的根目录直接访问,效果可以看手机版万人千题刷题榜单


3.电脑端的呈现页面

电脑和手机的分辨率不同,所以导致显示效果不同,就单独做了一些PC端的页面,使用内嵌的方式来进行数据的浏览。其实就是用ifame做嵌套,做了缩放。


<style>
  .iframe-body-sty{position: relative;overflow: hidden;height:700px;width: 500px;background-color:#FFF;}
  .iframe-body-sty>#iframe-shrink{position: absolute;transform:scale(0.43);left: -620px;top: -550px;height:1900px;max-width:1600px;width: 1600px;}
</style>
<div class="iframe-body-sty">
  <iframe id="iframe-shrink" src="https://www.xingleigao.top/score.html"></iframe>
</div>


最终效果可以看:PC端万人千题刷题榜单


4.数据的定时更新

利用sh进行对应的操作


cd /home/leetcode
date >> log.txt
python3 leetcode.py >> log.txt 2>&1


利用cron进行定时任务


crontab -e




七、写在最后

这次的整个优化流程还算是比较顺利,其中也学到了很多东西,算是从一个啥也不懂的小白写出来的。如有问题还请大家批评指正。奉上完整代码:


"""
兴磊的代码
CSDN主页:https://blog.csdn.net/qq_17593855
"""
__author__ = '兴磊'
__time__ = '2022/1/27'
import pandas as pd
import re
import time
from urllib.parse import urlencode
import requests
import json
from concurrent.futures import ThreadPoolExecutor
headers={
    "x-csrftoken":'',
    "Referer":"https://leetcode-cn.com",
}
utf = '''
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?f114c8d036eda9fc450e6cbc06a31ebc";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>
'''
payload = {"operation_name": "userPublicProfile",
    "query": '''query userPublicProfile($userSlug: String!) {
userProfilePublicProfile(userSlug: $userSlug) {
    submissionProgress {
        acTotal
    }
}
}
''',
    "variables": '{"userSlug":"kingley"}'
}
def int_csrf():
    global headers
    sess= requests.session()
    sess.head("https://leetcode-cn.com/graphql/")
    headers['x-csrftoken'] = sess.cookies["csrftoken"]
def chaxun(username):
    payload['variables'] = json.dumps({"userSlug" : f"{username}"})
    res= requests.post("https://leetcode-cn.com/graphql/"+"?"+urlencode(payload),headers = headers)
    if res.status_code != 200:
        return -1
    return res.json()['data']['userProfilePublicProfile']['submissionProgress']['acTotal']
def get_html(df,cmap="Set3"):
    df.sort_values("力扣题数", ascending=False, inplace=True)
    del df['力扣主页']
    del df['CSDN主页']
    del df['''B站主页
(主要用于发奖励的时候找得到对应的人)''']
    r = (
        df.style.hide_index()
            .background_gradient(cmap=cmap, subset=["力扣题数"])
    )
    #print(r.render())
    html = '<div>' + r.render() + '</div>'
    html = re.sub("#T_.+?(row\d+)_col\d+", r".\1", html)
    with open("style.css") as f:
        css = "<style>" + f.read() + "</style>"
    css = css.format(fontsize=28, justify="center")
    html = utf + css + html
    return html
if __name__ == '__main__':
    int_csrf()
    df = pd.read_excel('111.xlsx')
    #读取一整列的数据
    start = time.time()
    with ThreadPoolExecutor(max_workers=10) as executor:
        nums = executor.map(chaxun, df.力扣主页.str.extract(
            r"leetcode-cn.com/u/([^/]+)(?:/|$)", expand=False))
    df['力扣题数']=list(nums)
    with open("/www/xxxx/score.html", 'w', encoding="u8") as f:
        f.write(get_html(df))
    print("耗时:", time.time() - start)


最后,非常感谢明佬!!yyds


相关文章
|
4天前
|
数据采集 存储 JavaScript
构建你的第一个Python网络爬虫
【9月更文挑战第34天】在数字信息泛滥的时代,快速有效地获取和处理数据成为一项重要技能。本文将引导读者通过Python编写一个简易的网络爬虫,实现自动化地从网页上抓取数据。我们将一步步走过代码的编写过程,并探讨如何避免常见陷阱。无论你是编程新手还是想扩展你的技术工具箱,这篇文章都将为你提供有价值的指导。
41 18
|
4天前
|
数据采集 存储 数据挖掘
深入探索 Python 爬虫:高级技术与实战应用
本文介绍了Python爬虫的高级技术,涵盖并发处理、反爬虫策略(如验证码识别与模拟登录)及数据存储与处理方法。通过asyncio库实现异步爬虫,提升效率;利用tesseract和requests库应对反爬措施;借助SQLAlchemy和pandas进行数据存储与分析。实战部分展示了如何爬取电商网站的商品信息及新闻网站的文章内容。提醒读者在实际应用中需遵守法律法规。
118 66
|
3天前
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
31 16
|
8天前
|
数据采集 存储 XML
构建高效的Python爬虫系统
【9月更文挑战第30天】在数据驱动的时代,掌握如何快速高效地获取网络信息变得至关重要。本文将引导读者了解如何构建一个高效的Python爬虫系统,从基础概念出发,逐步深入到高级技巧和最佳实践。我们将探索如何使用Python的强大库如BeautifulSoup和Scrapy,以及如何应对反爬措施和提升爬取效率的策略。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在信息收集的海洋中航行得更远、更深。
24 6
|
7天前
|
数据采集 数据挖掘 数据处理
Python中实现简单爬虫并处理数据
【9月更文挑战第31天】本文将引导读者理解如何通过Python创建一个简单的网络爬虫,并展示如何处理爬取的数据。我们将讨论爬虫的基本原理、使用requests和BeautifulSoup库进行网页抓取的方法,以及如何使用pandas对数据进行清洗和分析。文章旨在为初学者提供一个易于理解的实践指南,帮助他们快速掌握网络数据抓取的基本技能。
18 3
|
10天前
|
数据采集 JSON 数据格式
Python:南京地铁每日客流数据的爬虫实现
Python:南京地铁每日客流数据的爬虫实现
23 1
|
11天前
|
数据采集 Python
Python:某市公交线路站点的爬虫实现
Python:某市公交线路站点的爬虫实现
11 1
|
2天前
|
机器学习/深度学习 开发者 Python
Python中进行特征重要性分析的9个常用方法
在Python机器学习中,特征重要性分析是理解模型预测关键因素的重要步骤。本文介绍了九种常用方法:排列重要性、内置特征重要性(如`coef_`)、逐项删除法、相关性分析、递归特征消除(RFE)、LASSO回归、SHAP值、部分依赖图和互信息。这些方法适用于不同类型模型和场景,帮助识别关键特征,指导特征选择与模型解释。通过综合应用这些技术,可以提高模型的透明度和预测性能。
18 0
|
9天前
|
数据采集 Linux 网络安全
python 爬虫遇到的aiohttp证书错误解决办法
python 爬虫遇到的aiohttp证书错误解决办法
30 0
|
10天前
|
机器学习/深度学习 PyTorch TensorFlow
Python实现深度学习学习率指数衰减的方法与参数介绍
学习率指数衰减提供了一种高效的动态调整学习率的手段,帮助模型在不同训练阶段以不同的学习速度优化,有利于提升模型性能和训练效率。通过合理设置衰减策略中的参数,可以有效地控制学习率的衰减过程,实现更加精确的模型训练调优。
13 0