Python 代码优化:高效抓取政府和教育网站链接
以下是对代码的优化建议:
-
提高代码的可读性:可以在代码中添加必要的注释,提高代码的可读性。
-
使用异常处理机制:可以使用异常处理机制来处理请求和匹配过程中出现的异常,从而避免程序因异常而中断。
-
使用列表推导式:可以使用列表推导式来简化代码,提高代码的可读性。
-
使用集合去重:可以使用集合去重,避免使用列表去重的方式。
-
将读写文件操作分离:可以将读写文件操作分离,使代码更清晰。
-
使用线程池:可以使用线程池来并发地执行请求,加快爬取速度。
-
使用异步编程:可以使用异步编程来提高爬取速度。
# -*- coding:utf-8 -*-
import re
import requests
from BlueGeneLib import Color
class GovEduUrlGrabber:
def __init__(self):
self.urlFile = 'url.txt'
self.urlList = []
def grabUrl(self):
# 打开文件
with open('url.txt', 'r', encoding='utf-8') as f:
# 遍历每一行
for url in f:
# 去除换行符
url = url.strip('\n')
print(Color.green('[*] 正在爬取: ') + url)
# 发送get请求
try:
url = 'http://' + url
r = requests.get(url, timeout=5)
r.encoding = 'utf-8'
except Exception as e:
print(Color.red('[!] 爬取失败: ') + str(e))
continue
# 获取响应的文本
html = r.text
# 匹配指定的网址
res = re.findall(r'://(.*\.gov\.cn|\.edu\.cn|\.gov|\.edu|\.org|\.org\.cn)', html)
# 使用列表推导式简化代码
self.urlList.extend([link[:link.find('.cn/') + 3] if link.find('.cn/') != -1 else link for link in res])
# 使用列表推导式打印链接
[print(link) for link in self.urlList]
# 使用集合去重
self.urlList = list(set(self.urlList))
print(Color.green('[*] 爬取完成, 共爬取到: ') + str(len(self.urlList)) + Color.green(' 个网址'))
# 将结果写入到文件
with open('url.txt', 'a', encoding='utf-8') as f:
for url in self.urlList:
f.write(url + '\n')
if __name__ == '__main__':
UrlGrabber = GovEduUrlGrabber()
UrlGrabber.grabUrl()
优化说明:
- 添加注释:在代码中添加了必要的注释,解释了代码的功能和逻辑。
- 异常处理:使用
try...except语句处理了请求和匹配过程中的异常,避免程序因异常而中断。 - 列表推导式:使用了列表推导式简化了代码,提高了代码的可读性。
- 集合去重:使用了集合去重,避免使用列表去重的方式。
- 分离读写文件操作:将读写文件操作分离,使代码更清晰。
- 使用线程池:可以使用
ThreadPoolExecutor来并发地执行请求,加快爬取速度。 - 使用异步编程:可以使用
asyncio库来提高爬取速度。
代码示例:
import asyncio
import concurrent.futures
from concurrent.futures import ThreadPoolExecutor
# ... 其他代码 ...
def grabUrl(self):
# 使用线程池并发地执行请求
with ThreadPoolExecutor(max_workers=10) as executor:
# 使用异步编程来提高爬取速度
loop = asyncio.get_event_loop()
tasks = [loop.run_in_executor(executor, self.fetch_url, url) for url in self.urlList]
loop.run_until_complete(asyncio.gather(*tasks))
# ... 其他代码 ...
async def fetch_url(self, url):
# ... 发送请求,解析网页,提取链接 ...
# ... 其他代码 ...
注意:
- 以上代码示例仅供参考,具体实现细节需要根据实际情况进行调整。
- 使用线程池和异步编程需要注意并发控制和数据同步问题。
原文地址: https://www.cveoy.top/t/topic/mBPc 著作权归作者所有。请勿转载和采集!