一个简单的python网络爬虫程序

ekrhizoc的Python项目详细描述


github latest releasepypi latest packagedocker latest imageproject license

e6c CIe6c CDsecurity scanpre-commit

code coveragecode alertscode qualitycode style

叶根

ekrizoc(E6c):一个网络爬虫

目录

  1. Definition
  2. Use Case
  3. Configuration
  4. Development
  5. Testing
  6. Versioning
  7. Deployment
  8. Production

定义

εκρίζωση(希腊语) 根除,根除

也称为E6c。在

用例

一个简单的python网络爬虫程序的实现。
输入:URL(种子)。
输出:简单的文本站点地图(显示页面之间的链接)。在

要求

  • 爬虫程序仅限于one子域(不包括外部链接)。在
  • 不使用网络爬虫库/框架(如scrapy)。在
  • (可选)使用HTML处理库/框架。在
  • 生产就绪代码。在

假设

  • 每次运行时,输入URL(seed)仅限于一个。在
  • 目标URL是静态页面(不需要后端javascript解析)。在
  • 要从HTML锚点<a>元素提取的链接。在
  • 有效链接包括
    • 有效的URL
      • 非空的
      • 匹配有效的url模式
      • 不超过E6C_MAX_URL_LENGTH个字符的长度
      • 可以将相对url转换为完整url
    • 以前未访问链接
    • 链接不是被忽略的文件类型的一部分
    • 链接与种子url具有相同的域
    • 链接不受机器人.txt文件

设计

该项目实现了一个基于广度优先搜索图遍历的基本通用爬虫。在

配置

应用程序的行为可以通过环境变量进行配置。在

Environment VariableDescriptionTypeDefault Value
^{}Level of logging - overrides verbose/quiet flagstring-
^{}Directory to save logsstring-
^{}Directory to save any output (bin)stringbin
^{}File types of websites to ignore (e.g. ".filetype1,.filetype2")string".png,.pdf,.txt,.doc,.jpg,.gif"
^{}Time (in seconds) to wait per request (not to populate server with multiple requests)float0.1
^{}The maximum number of urls to fetch/crawlinteger10000
^{}The maximum length (character count) of a url to fetch/crawlinteger300

发展

配置本地开发

  • 在本地计算机上克隆repo
  • 安装^{}或{a21}
  • 创建本地项目环境(基于^{}^{}^{}):
    $ make env
  • (可选)现有项目:
    $ make env-update

本地运行

在终端上,运行以下命令(在项目的根目录上执行):

  • 激活项目环境:
    $ . ./scripts/helpers/environment.sh
  • 使用poetry:
    $ ekrhizoc

贡献

[不可用]

测试

(CI/CD的一部分)

[正在工作。。。]在

要运行测试,请打开终端并运行以下命令(在项目的根目录上执行):

  • 激活项目环境:
    $ . ./scripts/helpers/environment.sh
  • 运行pytest:
    $ make test
  • 检查测试覆盖率:
    $ make test-coverage

版本控制

增加版本号:
$ poetry version {bump rule}
其中有效的通气规则为:

  1. 补丁
  2. 小调
  3. 少校
  4. 预赛
  5. 普雷米诺
  6. 前主
  7. 预释放

变更日志

使用CHANGELOG.md跟踪此包的演变。
文件顶部的[UNRELEASED]标记应该一直在那里记录工作,直到发布发生。在

工作应记录在以下子标题之一下:

  • 已添加
  • 改变
  • 固定的
  • 已删除

在版本中,应将以下格式的版本添加到文件中所有当前未发布的更改。
## [major.minor.patch] - YYYY-MM-DD

部署

Pip包

在终端上,运行以下命令(在项目的根目录上执行):

  • 激活项目环境:
    $ . ./scripts/helpers/environment.sh
  • 构建pip包:
    $ make build-package
  • 要发布pip包(需要向PyPi提供凭据):
    $ make publish-package

Docker图像

在根目录下执行(在以下根目录上运行):

  • 激活项目环境环境:
    $ . ./scripts/helpers/environment.sh
  • 要构建docker映像:
    $ make build-docker

生产

对于生产,使用Docker映像。 {a25}公开发布。在

  • 第一次从docker hub拉取图像:
    $ docker pull nichelia/ekrhizoc:{version}
  • 通过docker运行执行CLI:
    $ docker run --rm -it -v ~/ekrhizoc_bin:/tmp/bin nichelia/ekrhizoc:{version} {command}
    此命令将应用程序的bin(结果)装载到ekrizoc_bin文件夹下的用户根目录中。在

其中version是已发布的应用程序版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
编译器构造为什么在Java中允许初始化对Null的引用?   java手动调用javax的actionPerformed。摆动计时器   使用git分支的java Maven版本控制   Java8句子流   java JPA OneToOne和OneToMany实体实例化/创建   java如何将值添加到列表<Map<String,Object>>?   java如何使用ComboBox在一个框架内更改JPanel。getSelectedIndex()   java在比较XML和xmlunit时忽略文本差异   java无法从其他pc连接到本地主机   Java中分配对象id的优雅方式   Java中静态变量的使用   java试图从Neteller获取OAuth访问令牌时产生错误:“服务器返回HTTP响应代码:401表示URL”   Java:基元类型是否会影响性能?   java可以让hasNext()不区分大小写吗?   基于AutoCompleteTextView建议属性或AutoCompleteTextView值的java Android搜索   java流文件到firefox浏览器有时无法打开应用程序对话框   在没有ArrayList的Java中返回数组中的搜索结果   复制java。木卫一。IOException:数据错误(CRC)   java为什么我在尝试删除Facebook测试用户时会出现“方法未实现”错误   java如何使用JNA调用SetProcessReliationPolicy