【从零开始的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


相关文章
|
9天前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
10天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
11天前
|
数据采集 Web App开发 监控
高效爬取B站评论:Python爬虫的最佳实践
高效爬取B站评论:Python爬虫的最佳实践
|
18天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
60 6
WK
|
22天前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
68 36
|
12天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
17天前
|
数据采集 JSON 测试技术
Python爬虫神器requests库的使用
在现代编程中,网络请求是必不可少的部分。本文详细介绍 Python 的 requests 库,一个功能强大且易用的 HTTP 请求库。内容涵盖安装、基本功能(如发送 GET 和 POST 请求、设置请求头、处理响应)、高级功能(如会话管理和文件上传)以及实际应用场景。通过本文,你将全面掌握 requests 库的使用方法。🚀🌟
36 7
|
19天前
|
数据采集 Web App开发 前端开发
Python爬虫进阶:Selenium在动态网页抓取中的实战
【10月更文挑战第26天】动态网页抓取是网络爬虫的难点,因为数据通常通过JavaScript异步加载。Selenium通过模拟浏览器行为,可以加载和执行JavaScript,从而获取动态网页的完整内容。本文通过实战案例,介绍如何使用Selenium在Python中抓取动态网页。首先安装Selenium库和浏览器驱动,然后通过示例代码展示如何抓取英国国家美术馆的图片信息。
38 6
|
16天前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
16天前
|
数据采集 存储 XML
Python实现网络爬虫自动化:从基础到实践
本文将介绍如何使用Python编写网络爬虫,从最基础的请求与解析,到自动化爬取并处理复杂数据。我们将通过实例展示如何抓取网页内容、解析数据、处理图片文件等常用爬虫任务。
100 1