Croquemort Linkchecker

croquemort的Python项目详细描述


#croquemort

vision

本项目的目标是提供一种检查http资源的方法:搜索404、更新重定向等。

批量发送它的url并检索在后台获取的每个url的信息(目前状态代码和有用的头)。这样,他就可以知道死链接或过时的资源,并采取相应的行动。

语言是英语。所有的评论和文档都应该用英语书写,这样我们就不会使用"franglais"方法,这样我们就可以与世界各地的开发人员分享我们的经验了。



/>
我们从一开始就开放源代码,因为我们希望在开放环境中进行设计,并让公民和黑客参与我们的开发。



在安装和运行python包之前,您必须安装并启动这些依赖项。

-R需求/开发。pip
```

你很好去!


您可以使用以下命令运行它:

`` shell
$nameko run croquemort.http
启动服务:连接到amqp://guest:*@127.0.0.1:5672/
````



$nameko run croquemort.crawler
启动服务:url_crawler
连接到amqp://guest:*@127.0.0.1:5672/
`````

aml croquemort.crawler
``

您可以在配置文件中为crawler启用更多的worker(从10(默认值)到50):
```yaml
max撸u workers:50
````




一个漂亮的仪表板中的url集合,允许您按状态、内容类型、url方案、上次更新和/或域进行筛选。如果您想编写脚本,甚至可以将当前查看的数据导出为csv格式。



\e`以url作为参数:

`` shell
$http:8000/check/one url="https://www.data.gouv.fr/fr/"
http/1.1200 ok
连接:保持活动
内容长度:28
内容类型:文本/普通;字符集=utf-8
日期:2015年6月3日星期三14:21:50 GMT

{
"url散列":"u:fc6040cc5"
}
```


服务返回一个url散列,该散列将用于检索与该url相关的信息:

``shell
$http:8000/url/u:fc6040c5
http/1.1200 ok
连接:保持活动
内容长度:335
内容类型:文本/普通;字符集=utf-8
datE:2015年6月3日星期三14:22:57 GMT

{
"etag":",
"选中的URL":"https://www.data.gouv.fr/fr/",
"最终URL":"https://www.data.gouv.fr/fr/",
"内容长度":",
"内容处置":",
"内容-md5":",
"内容位置":",
"过期":"",
"最终状态代码":"200",
"更新":"2015-06-03T16:21:52.569974",
"最后修改":",
"内容编码":"gzip",
"内容类型":"text/html;charset=utf-8"
}
````

```shell
$http get:8000/url url url=https://www.data.gouv.fr/fr/
http/1.1200 ok
连接:保持活动
内容长度:335
内容类型:text/plain;charset=utf-8
日期:2015年6月3日星期三14:23:35 GMT

{
"etag":",
"选中的url":"https://www.data.gouv.fr/fr/",
"最终URL":"https://www.data.gouv.fr/fr/",
"内容长度":",
"内容处置":",
"内容MD5":",
"内容位置":",
"过期":",
"最终状态代码":"200",
"更新":"2015-06-03T16:21:52.569974",
"上次修改":",
"content encoding":"gzip"、
"content type":"text/html;charset=utf-8"
}
````

>两者返回的信息量相同。




rls和组名作为参数:

`` shell
$http:8000/check/many url:='["http s://www.data.gouv.fr/fr/","https://www.data.gouv.fr/s/images/2015-03-31/d2eb53b14c5f4e6690e150ea7be40a88/cover datafrance retina.png"]'group="datagouvfr"
http/1.1200 ok
连接:保持-alive
内容长度:30
内容类型:text/plain;charset=utf-8
日期:2015年6月3日星期三14:24:00 GMT

{
"组哈希":"g:efcf3897"
}
````

这次,服务返回一个组哈希,用于检索与该组相关的信息:

``` shell
$http:8000/group/g:efcf3897
http/1.1200 ok
连接:保持活动
内容长度:941
内容类型:文本/普通;字符集=utf-8
日期:2015年6月3日星期三14:26:04 GMT

{
"u:179d104f":{
"内容编码":",
"内容配置":",",","
"group":"g:efcf3897",
"last modified":"tue,2015年3月31日14:38:37 GMT",
"content-md5":",
"checked url":"https://www.data.gouv.fr/s/images/2015-03-31/d2eb53b14c5f4e6690e150ea7be40a88/cover datafrance retina.png",
"final url":"https://www.data.gouv.fr/s/images/2015-03-31/d2eb53b14c5f4e6690e150ea7be40a88/cover datafrance retina.png",
"最终状态代码":"200",
"过期",
"内容类型":"图像/png",
"内容长度":"280919",
"更新":"2015-06-03t16:24:00.405636",
"etag":"551ab16d-44957",
"content location":"
},
"name":"datagouvfr",
"u:fc6040c5":{
"content disposition":",
"content encoding":"gzip",
"group":"g:efcf3897",
"last modified":",
"content-md5":",
"content location":",
"content length",",
"expires":",
"content type":"text/html;charset=utf-8",
"final status code":"200",
"updated":"2015-06-03t16:24:02.398105",
"etag":",
"checked url":"https://www.data.gouv.fr/fr/"
"final url":"https://www.data.gouv.fr/fr/"
}
}
```

或者可以使用作为get参数传递的组名(不易出错):

```shell
$http get:8000/group/group=datagouvfr
http/1.1200 ok
连接:保持活动
内容长度:335
内容类型:文本/普通;字符集=utf-8
日期:周三,032015年6月14日格林尼治时间14:23:35"最终状态代码":"200",
"更新":"2015-06-03T16:21:52.569974",
"上次修改":",
"继续"tent encoding":"gzip",
"content type":"text/html;charset=utf-8"
}
````


两者返回的信息量相同。




首先,croquemort遵循到最终目的地的最终重定向("requests"库的"allow_redirects"选项)。此外,croquemort还存储了一些关于重定向的信息:第一个重定向代码和最后一个url。当遇到重定向时,json响应如下所示(注意"重定向url"和"重定向状态代码"):

``json
{
"选中url":"https://goo.gl/ovzb",
"最终url":"http://news.ycombinator.com",
"最终状态代码":"200",
"重定向url":"https:"//goo.gl/ovzb",
"重定向状态代码":"301",
"ETag":",
"内容长度":",
"内容处置":",
"内容MD5":",
"内容位置":",
"过期":",
"更新":"2015-06-03T16:21:52.569974",
"上次修改":",
"内容编码"din":"gzip",
"content type":"text/html;charset=utf-8"
}
````



`````过滤结果


="image/png"
http/1.1200好的
连接:保持活动
内容长度:539
内容类型:文本/普通;字符集=utf-8
日期:2015年6月3日星期三14:27:07 GMT

{
"U:179D104F":{
"内容编码":",
"内容处理":",
"组":"G:EFCF3897",
"上次修改":"2015年3月31日星期二14:38:37 GMT",
"content-md5":",
"选中URL":"https://www.data.gouv.fr/s/images/2015-03-31/d2eb53b14c5f4e6690e150ea7be40a88/cover datafrance retina.png",
"最终URL":"https://www.data.gouv.fr/s/images/2015-03-31/d2eb53b14c5f4e6690E150EA7BE40A88/cover datafrance retina.png",
"最终状态代码":"200",
"过期",
"内容类型":"图像/png",
"内容长度":"280919",
"更新":"2015-06-03T16:24:00.405636",
"etag":"551ab16d-44957",
"内容位置":"
},
"name":"datagouvfr"
}
```

-长度:539
内容类型:text/plain;charset=utf-8
日期:2015年6月3日星期三14:27:58 GMT
{
"U:179D104F":{
"内容编码":",
"内容处理":",
"组":"G:EFCF3897",
"上次修改":"tue,2015年3月31日14:38:37 GMT",
"继续"ent-md5",",
"checked url":"https://www.data.gouv.fr/s/images/2015-03-31/d2eb53b14c5f4e6690e150ea7be40a88/cover datafrance retina.png",
"final url":"https://www.data.gouv.fr/s/images/2015-03-31/d2eb53b14c5f4e6690e150ea7be40a88/cover datafrance retina.png",
"final-status-c"ode":"200",
"expires",
"content type":"image/png",
"content length":"280919",
"updated":"2015-06-03t16:24:00.405636",
"etag","551ab16d-44957",
"content location":"
},
"name":"datagouvfr"
}
````

在这两种情况下,"http"和"crawler"服务都会返回有趣的日志信息以进行调试(如果将"--config config.yaml"选项传递给"run"命令)。



"example_csv.py"文件中有一个示例,它从csv文件中计算url(每行一个url)。

`` shell
$pythonpath=。python tests/example_CSV.py——csvfile path/to/your/file.csv--group groupname
group hash:g:2752262332
````


脚本返回一个组hash,您可以通过上面所述的http接口使用它。




在这种情况下,启动"timer"服务:

``shell
$nameko run croquemort.timer
启动服务:timer
连接到amqp://guest:*@127.0.0.1:5672/
````

nd通过shell:

`` shell
$pythonpath=。python示例_csv.py--csv file path/to/your/file.csv--group groupname--frequency hourly
group hash:g:2752262332
````

有三种可能:"hourly"、"daily"和"monthly"。如果不指定任何URL,则必须手动刷新URL检查。"Timer"服务将检查具有关联频率的组,并相应地刷新关联的URL。



\webhook

r/>
`` shell
$nameko run croquemort.webhook
启动服务:webhook_dispatcher
连接到amqp://guest:*@127.0.0.1:5672//
````

/检查/one url="https://www.data.gouv.fr/fr/"回调url="http://example.org/cb"
http/1.1200确定
连接:保持活动
内容长度:28
内容类型:文本/普通;字符集=utf-8
日期:2015年6月3日星期三14:21:50 GMT

{
"url散列":"u:fc6040c5"
}
````

检查完成后,应向"http://example.org/cb"发出带有检查元数据的"post"请求。webhook服务需要一个成功的(例如200)http状态代码。如果没有,它将重试(默认情况下)5次,在重试前的前10秒等待,然后在每次尝试时将延迟增加2倍。可以通过设置变量"webhook_nb_retry"、"webhook_delay_interval"和"webhook_backoff_factor"自定义这些值。

``json
{
"data":{
"checked url":"http://yahoo.fr"、
"final url":"http://yahoo.fr"、
"group":"g:a80c20d4"、
"frequen"cy":"每小时",
"最终状态代码":"200",
"更新":"2017-07-10T12:50:20.219819",
"etag",
"过期":"-1",
"上次修改",
"字符集":"utf-8",
"内容类型":"文本/html",
"内容长度",
"内容配置":",
"content-md5":",
"content encoding":"gzip",
"content location":"
}
}
````



Ting服务:迁移
连接到amqp://guest:*@127.0.0.1:5672//
`````

>现在可以运行nameko shell:

````shell
$nameko shell
>;>n.rpc.migrations.split_content_types()
>;>n.rpc.migrations.delete_urls_for('www.data.gouv.fr')
>;>;>;n.rpc.migrations.delete_urls_for('static.data.gouv.fr')
````

报告图表。

报告的NCE。

"从_1_迁移到_2"(元MIG"migrate_url_redirect"和"add_hash_prefixes"的比率用于将数据库从croquemort"v1"迁移到"v2"。在"v2"中,api json模式上的"v1"有一些更改,用于检查结果:
-`url`变为`checked url`
-`status`变为`final status code`

下面的e)。



即使你不是技术人员,也有很多方法可以做出贡献。

我们使用臭名昭著的[简化github工作流](http://scottchacon.com/2011/08/31/github-flow.html)来接受修改(甚至是内部修改),基本上你必须:

*创建一个与问题相关的问题对于要修复的问题(有利于跟踪和交叉引用)
*分叉存储库
*创建分支(可以选择在名称中引用问题)
*hack hack hack
*使用可读和详细的提交消息增量提交
*提交拉取请求针对这个存储库的主分支

对于您遇到的问题。

如果您不熟悉开源工作流或我们的一组技术,请毫不犹豫地寻求帮助!我们可以指导您或提出好的第一个bug(在我们的问题中标记)。也欢迎将您的姓名添加到本文档的"信用"部分。



\请尽可能多地记录重现问题的步骤(使用屏幕截图更好)。



你好,黑客伙伴,很高兴有你在船上!我们计划在合理的将来实现这些功能,也可以随意选择您想要贡献的功能并为其声明问题:

*验证mimetype、扩展名、大小、缓存等
*定期获取
*报告一组url




r/>在提交任何拉取请求之前,必须确保测试通过。
您应该为任何新功能和/或错误修复添加测试。
您可以使用以下命令运行测试:
``shell
$python-m pytest tests/
````

st.

提供了一个"docker compose.yml"文件,以便快速准备:
``shell
$docker compose up-d
创建crokemotr_redis_1…
创建crokemotr_rabbitmq_1…
$python-m pytest测试/
```

ation,
可以将此配置作为py.test命令行参数传递:
``shell
python-m pytest tests/--redis uri=redis://myredis:6379/0--amqp uri=amqp://john:doe@myrabbit
``````

阅读py.test帮助以查看所有可用选项:
``shell
python-m pytest tests/--《帮助
````






版本编号遵循[语义版本控制](http://semver.org/)的方法。








<























=[dadavidlarlet](htt-david larlet](http://david larlet/>
T型
*[alexandre-bulté](http://alexandre.bulte.net/)


<






<2.1.0(2019-05-07)

-固定头超时处理[95](https://github.com/opendatateam/crquemort/pull/95)
-删除主页/仪表板[140](https://github.com/opendatateam/opendatateam/crokeemort/pull/95)
-删除主页/仪表板[140](http://github www.com/opendatateam/opendata问uemort/拉力/140)

2.0.4(2018-01-24)

>
-修复包装和其他增强功能[49](https://github.com/opendatateam/croquemort/pull/49)




《2.0.3(2018-01-08)2.0.3(2018-01-08)

-fix setup.py



-br/>-修复圆圈上的发布作业


2.0.1(2018-01-08)

-增加包装工作flow,在pypi上发布

2.0.0(2017-10-23)



>>gt;n.rpc.migrations.migration.migrate_从_1_1_迁移到_2()
````



35


-redis-redis-redis-redis-redis-redis-redis-redis-redis-redis-db
[/26(https://github.com/opendatateam/opendatateam/crquemort/issuemort/issue/26)/br/>-://吉特ub.com/opendatateam/croquemort/issues/1)
-关联迁移:`migragrate_urluurluurluurlu redirect`



<


>-webhook-webhook支持


/24(https://github www.com/opendatateam/opendatateam/croquemort/issuemort/issue/24 29)(https://github.com/opendatateam/croquemort/issues/29)

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

推荐PyPI第三方库


热门话题
java获取所有唯一的子字符串   在Java中转换图像。通过socket传输图像   java中缀到后缀未按预期工作   测试Hibernate@Check约束时,java无法生成约束冲突异常   java使用在IF语句中声明的变量   java Spring数据JPA未找到符合依赖项要求的bean   java CalendarArray获取两个日期之间的日期并跳过几个   数据结构如何在Java中实现n:m关系?   Java:ArrayIndexOutOfBoundException在数组中搜索整数值时发生   java Spring Pageable不翻译@Column name   带有sockJS MissingSessionUserException的java Spring WebSocket:消息中没有“用户”头   JAVA中如何在没有纯数组字符串类的情况下获取字符第二次或第n次出现的索引   使用FileReader时的java NumberFormatException   java什么会使安卓 4.1中的加载速度变慢。X,而不是4.2?   java Round双精度数据类型最多3位   关于客户端的javamysql设计   在java中生成随机文件名的字符串   java问题在Android studio的Android项目中添加jar文件   java单一责任原则与服务/存储库设计