第一阶段代码说明

文件结构

  • 我们来简要说明一下我的文件结构:

  • 主文件夹下面只有两个文件 lab 和 main,lab 本来是做实验用的,我已经删掉了,因为团队合作大家都改的话有冲突。main 里面就是主函数,非常非常短,仅仅作为程序的入口。

commen

  • commen 里面放了基础的工具类。
  • myLog.py 定义了自己的日志文件,注意不要用这个类,已经在 init 里面生成了这个对象,直接使用 init 里面的变量
  • timer.py 是一个计时器,写了以后发现有 log,基本没啥用,大家可以无视

littleJiaQuanDB

  • 这里面是操作数据库的类。所有要操作数据库的方法和类都归在这里。
  • init 里面定义了指向数据库的指针。
  • zhiHuDB 定义了对知乎数据库的操作,本来是没有类的,但是发现操作比较多,就将每一个集合化成一个类,里面的方法都是静态方法,这样方便我们找到函数。

特别说明

  • 为了减少错误,比如打错数据库名称,这种代码通常就只写一遍,例如在 init 文件种:
import pymongo


DBName = 'littleJiaQuanDB'

myClient = pymongo.MongoClient()
myDB = myClient[DBName]
  • 这样,所有数据库,直接使用这里的变量 myDB,就不会出错。
  • 同理,在 zhiHuDB.py 中,各个集合的指针也单独提出来,避免每次使用新建一个指针

reader

  • 这里面存放了发出声音的类,目前只是一个壳子,还没怎么开发,大家先不用管。

seleniumWeb

  • 这里主要是在 init 里面存放了一个 seleniumBase 类。
  • 这里我思考了很久,因为 selenium 相当于一个浏览器,一个程序我们只要一个浏览器,但是可能有很多地方都会用到这个浏览器,比如爬天气需要,爬知乎需要。
  • 所以这个浏览器要是一个全局变量,就是要引用到一个变量上面来,所以我在 init 里面创建了 seleniumBase 类,这个抽象基类的变量会是同一个 web,这样我们所有基础这个虚基类的类,都可以拥有同样的一个变量。
from selenium import webdriver
from abc import ABC, abstractmethod
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

desired_capabilities = DesiredCapabilities.CHROME
desired_capabilities["pageLoadStrategy"] = "none"
chrome_opt = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_opt.add_experimental_option("prefs", prefs)
seleniumWeb = webdriver.Chrome(chrome_options=chrome_opt)


class SeleniumBase(ABC):
    def __init__(self):
        #	这里,所有的 web 都将指向这里的全局变量,第 10 行的 seleniumWeb
        self.web = seleniumWeb

    @abstractmethod
    def _visit(self):
        pass

    def _getSource(self):
        return self.web.page_source

    @abstractmethod
    def _processSource(self, source):
        pass

    def getData(self):
        self._visit()
        source = self._getSource()
        return self._processSource(source)
  • 之后,我们不同类对自己的 web 操作,都将在同一个模拟浏览器上进行。

trainModel

  • 这里是数学建模的文件夹,理论上和业务逻辑无关,还基本没有开始写。

zhiHu

  • 这个就是一个具体业务的文件夹了,这个包将完成所有的知乎业务。

  • zhiHuReader.py 定义了读取关于知乎内容的方法,里面用到了 reader 这个包,zhiHuScrap.py 定义了爬取知乎的类,这个类负责从互联网上爬取数据,将数据传出,zhiHuCore.py 定义了知乎的核心,总领 zhiHuReader、zhiHuScrap、zhiHuDB。

  • 简单来说,外部程序只会使用 zhiHuCore 这一个类进行操作,其他的每个模块尽量独立,比如 zhiHuScrap 不引用数据库。

  • 也想过把 zhiHuDB 放在这个包里,但是感觉数据库还有一些维护的操作,为了不污染这个业务逻辑包,就将所有数据库操作放在 littleJiaQuanDB 里面了。


本文章使用limfx的vsocde插件快速发布