以下是对代码的优化建议:

  1. 提高代码的可读性:可以在代码中添加必要的注释,提高代码的可读性。

  2. 使用异常处理机制:可以使用异常处理机制来处理请求和匹配过程中出现的异常,从而避免程序因异常而中断。

  3. 使用列表推导式:可以使用列表推导式来简化代码,提高代码的可读性。

  4. 使用集合去重:可以使用集合去重,避免使用列表去重的方式。

  5. 将读写文件操作分离:可以将读写文件操作分离,使代码更清晰。

  6. 使用线程池:可以使用线程池来并发地执行请求,加快爬取速度。

  7. 使用异步编程:可以使用异步编程来提高爬取速度。

# -*- 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()

优化说明:

  1. 添加注释:在代码中添加了必要的注释,解释了代码的功能和逻辑。
  2. 异常处理:使用 try...except 语句处理了请求和匹配过程中的异常,避免程序因异常而中断。
  3. 列表推导式:使用了列表推导式简化了代码,提高了代码的可读性。
  4. 集合去重:使用了集合去重,避免使用列表去重的方式。
  5. 分离读写文件操作:将读写文件操作分离,使代码更清晰。
  6. 使用线程池:可以使用 ThreadPoolExecutor 来并发地执行请求,加快爬取速度。
  7. 使用异步编程:可以使用 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):
        # ... 发送请求,解析网页,提取链接 ...

# ... 其他代码 ...

注意:

  • 以上代码示例仅供参考,具体实现细节需要根据实际情况进行调整。
  • 使用线程池和异步编程需要注意并发控制和数据同步问题。
Python 代码优化:高效抓取政府和教育网站链接

原文地址: https://www.cveoy.top/t/topic/mBPc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录