BlankerL / DXY-COVID-19-Crawler

2019新型冠状病毒疫情实时爬虫及API | COVID-19/2019-nCoV Realtime Infection Crawler and API
https://lab.isaaclin.cn/nCoV/
MIT License
1.99k stars 400 forks source link

请求接口显示ssl校验错误,省份新闻接口新闻重复 #24

Closed hack-fang closed 4 years ago

hack-fang commented 4 years ago
  1. python requests请求接口显示ssl 校验错误,通过设置requests.get(url,verify=False),不校验证书临时解决

  2. 省份新闻返回重复(新闻来源一致,只是空格的问题), 图片 复现: https://lab.isaaclin.cn/nCoV/api/news?num=all&province=安徽省

可通过合并请求解决爬虫新闻重复保存 https://github.com/BlankerL/DXY-2019-nCoV-Crawler/pull/19

BlankerL commented 4 years ago

收到,感谢反馈。 SSL证书已经重新配置,测试证书已经能够通过校验,不需要加入verify=False也可以正常使用。 我会重新做一下数据清洗,应该是数字前后空格的有无不一致,导致新闻重复收录。

BlankerL commented 4 years ago

新闻不会重复保存,是之前有一部分新闻有遗漏,我重新写了一份爬虫没有使用相同的字符串匹配规则。个人认为本身就是轻量化的脚本,不需要再通过Docker来进行部署了。

hack-fang commented 4 years ago

新闻不会重复保存,是之前有一部分新闻有遗漏,我重新写了一份爬虫没有使用相同的字符串匹配规则。个人认为本身就是轻量化的脚本,不需要再通过Docker来进行部署了。

建议在保存前查询是否存在相同的sourceUrl而不是完整的数据来确定是否保存。

BlankerL commented 4 years ago

新闻不会重复保存,是之前有一部分新闻有遗漏,我重新写了一份爬虫没有使用相同的字符串匹配规则。个人认为本身就是轻量化的脚本,不需要再通过Docker来进行部署了。

建议在保存前查询是否存在相同的sourceUrl而不是完整的数据来确定是否保存。

sourceUrl匹配能够有效阻止相同新闻被收录两次,但是丁香园经常针对同一条新闻内容进行修改。比如数据库里储存的两条数据: 版本1:

{ 
    "_id" : ObjectId("5e31045e42f563465586cb0a"), 
    "id" : NumberInt(776), 
    "pubDate" : NumberLong(1580269944000), 
    "title" : "四川首例病例治愈", 
    "summary" : "患者杨某,男性,34岁,武汉某公司职员,1月21日,经国家疾控中心复核确诊为新型冠状病毒感染的肺炎,收入成都市公共卫生临床医疗中心隔离治疗,1月26日、28日经成都市疾控中心两次核酸检测阴性,符合解除隔离治疗标准。\n", 
    "infoSource" : "央视新闻", 
    "sourceUrl" : "http://m.weibo.cn/2656274875/4466038202767776", 
    "provinceId" : "51", 
    "provinceName" : "四川省", 
    "createTime" : NumberLong(1580270118000), 
    "modifyTime" : NumberLong(1580270118000), 
    "crawlTime" : NumberLong(1580270686061)
}

版本2:

{ 
    "_id" : ObjectId("5e31054f42f563465586cb0e"), 
    "id" : NumberInt(776), 
    "pubDate" : NumberLong(1580269944000), 
    "title" : "四川首例病例治愈", 
    "summary" : "四川省首例新型冠状病毒感染的肺炎确诊患者恢复情况良好,符合出院标准,于上午痊愈出院。患者杨某,男性,34岁,武汉某公司职员,1月21日,经国家疾控中心复核确诊为新型冠状病毒感染的肺炎,收入成都市公共卫生临床医疗中心隔离治疗,1月26日、28日经成都市疾控中心两次核酸检测阴性,符合解除隔离治疗标准。\n", 
    "infoSource" : "央视新闻", 
    "sourceUrl" : "http://m.weibo.cn/2656274875/4466038202767776", 
    "provinceId" : "51", 
    "provinceName" : "四川省", 
    "createTime" : NumberLong(1580270118000), 
    "modifyTime" : NumberLong(1580270118000), 
    "crawlTime" : NumberLong(1580270927709)
}

我刚才确认了一下,相同新闻返回两次并不是爬虫的问题,而是丁香园先后发布了多个版本的新闻,并且除了主体部分以外,其他信息都完全一致。部分新闻是新闻主体内容发生变化,部分新闻只是标点符号发生改变。目前丁香园一共有483条新闻,而数据库内有668条新闻,说明新闻主体发生变化的新闻不在少数。

而如果使用sourceUrl来进行匹配,无法保证在新闻主体内容更新之后采集最新的新闻。

我打算修改后端API,针对相同的id只返回一条最新的信息。

hack-fang commented 4 years ago

新闻不会重复保存,是之前有一部分新闻有遗漏,我重新写了一份爬虫没有使用相同的字符串匹配规则。个人认为本身就是轻量化的脚本,不需要再通过Docker来进行部署了。

建议在保存前查询是否存在相同的sourceUrl而不是完整的数据来确定是否保存。

sourceUrl匹配能够有效阻止相同新闻被收录两次,但是丁香园经常针对同一条新闻内容进行修改。比如数据库里储存的两条数据: 版本1:

{ 
    "_id" : ObjectId("5e31045e42f563465586cb0a"), 
    "id" : NumberInt(776), 
    "pubDate" : NumberLong(1580269944000), 
    "title" : "四川首例病例治愈", 
    "summary" : "患者杨某,男性,34岁,武汉某公司职员,1月21日,经国家疾控中心复核确诊为新型冠状病毒感染的肺炎,收入成都市公共卫生临床医疗中心隔离治疗,1月26日、28日经成都市疾控中心两次核酸检测阴性,符合解除隔离治疗标准。\n", 
    "infoSource" : "央视新闻", 
    "sourceUrl" : "http://m.weibo.cn/2656274875/4466038202767776", 
    "provinceId" : "51", 
    "provinceName" : "四川省", 
    "createTime" : NumberLong(1580270118000), 
    "modifyTime" : NumberLong(1580270118000), 
    "crawlTime" : NumberLong(1580270686061)
}

版本2:

{ 
    "_id" : ObjectId("5e31054f42f563465586cb0e"), 
    "id" : NumberInt(776), 
    "pubDate" : NumberLong(1580269944000), 
    "title" : "四川首例病例治愈", 
    "summary" : "四川省首例新型冠状病毒感染的肺炎确诊患者恢复情况良好,符合出院标准,于上午痊愈出院。患者杨某,男性,34岁,武汉某公司职员,1月21日,经国家疾控中心复核确诊为新型冠状病毒感染的肺炎,收入成都市公共卫生临床医疗中心隔离治疗,1月26日、28日经成都市疾控中心两次核酸检测阴性,符合解除隔离治疗标准。\n", 
    "infoSource" : "央视新闻", 
    "sourceUrl" : "http://m.weibo.cn/2656274875/4466038202767776", 
    "provinceId" : "51", 
    "provinceName" : "四川省", 
    "createTime" : NumberLong(1580270118000), 
    "modifyTime" : NumberLong(1580270118000), 
    "crawlTime" : NumberLong(1580270927709)
}

我刚才确认了一下,相同新闻返回两次并不是爬虫的问题,而是丁香园先后发布了多个版本的新闻,并且除了主体部分以外,其他信息都完全一致。部分新闻是新闻主体内容发生变化,部分新闻只是标点符号发生改变。

新闻不会重复保存,是之前有一部分新闻有遗漏,我重新写了一份爬虫没有使用相同的字符串匹配规则。个人认为本身就是轻量化的脚本,不需要再通过Docker来进行部署了。

建议在保存前查询是否存在相同的sourceUrl而不是完整的数据来确定是否保存。

sourceUrl匹配能够有效阻止相同新闻被收录两次,但是丁香园经常针对同一条新闻内容进行修改。比如数据库里储存的两条数据: 版本1:

{ 
    "_id" : ObjectId("5e31045e42f563465586cb0a"), 
    "id" : NumberInt(776), 
    "pubDate" : NumberLong(1580269944000), 
    "title" : "四川首例病例治愈", 
    "summary" : "患者杨某,男性,34岁,武汉某公司职员,1月21日,经国家疾控中心复核确诊为新型冠状病毒感染的肺炎,收入成都市公共卫生临床医疗中心隔离治疗,1月26日、28日经成都市疾控中心两次核酸检测阴性,符合解除隔离治疗标准。\n", 
    "infoSource" : "央视新闻", 
    "sourceUrl" : "http://m.weibo.cn/2656274875/4466038202767776", 
    "provinceId" : "51", 
    "provinceName" : "四川省", 
    "createTime" : NumberLong(1580270118000), 
    "modifyTime" : NumberLong(1580270118000), 
    "crawlTime" : NumberLong(1580270686061)
}

版本2:

{ 
    "_id" : ObjectId("5e31054f42f563465586cb0e"), 
    "id" : NumberInt(776), 
    "pubDate" : NumberLong(1580269944000), 
    "title" : "四川首例病例治愈", 
    "summary" : "四川省首例新型冠状病毒感染的肺炎确诊患者恢复情况良好,符合出院标准,于上午痊愈出院。患者杨某,男性,34岁,武汉某公司职员,1月21日,经国家疾控中心复核确诊为新型冠状病毒感染的肺炎,收入成都市公共卫生临床医疗中心隔离治疗,1月26日、28日经成都市疾控中心两次核酸检测阴性,符合解除隔离治疗标准。\n", 
    "infoSource" : "央视新闻", 
    "sourceUrl" : "http://m.weibo.cn/2656274875/4466038202767776", 
    "provinceId" : "51", 
    "provinceName" : "四川省", 
    "createTime" : NumberLong(1580270118000), 
    "modifyTime" : NumberLong(1580270118000), 
    "crawlTime" : NumberLong(1580270927709)
}

我刚才确认了一下,相同新闻返回两次并不是爬虫的问题,而是丁香园先后发布了多个版本的新闻,并且除了主体部分以外,其他信息都完全一致。部分新闻是新闻主体内容发生变化,部分新闻只是标点符号发生改变。目前丁香园一共有483条新闻,而数据库内有668条新闻,说明新闻主体发生变化的新闻不在少数。

而如果使用sourceUrl来进行匹配,无法保证在新闻主体内容更新之后采集最新的新闻。

我打算修改后端API,针对相同的id只返回一条最新的信息。

相同sourceUrl的新闻经过编辑最终一定是一条新闻,如存在相同sourceUrl的新闻数据可更新覆盖,感觉同一sourceUrl来源的新闻存储多条是没有必要的。丁香园编辑多次,但是来源新闻是没有发生变化的。

BlankerL commented 4 years ago

相同sourceUrl的新闻经过编辑最终一定是一条新闻,如存在相同sourceUrl的新闻数据可更新覆盖,感觉同一sourceUrl来源的新闻存储多条是没有必要的。丁香园编辑多次,但是来源新闻是没有发生变化的。

是的,相同的sourceUrl的新闻是同一条新闻,但是丁香园的前后版本有出入,最好还是以最新版本为准。如果按照你提供的pull request,遇到相同sourceUrl的新闻直接跳过,而并没有检查是否有更新。

更新覆盖也是一个方案,在此处find_one之后,检查titlesummary内容是否一致,无法仅用sourceUrl就完成匹配。

我刚才已经完成了后端的返回规则,针对同一新闻id,只返回最新的那条新闻。现在可以调用API进行测试,应该已经能够实现新闻去重了。

但每一次调用API都要去重确实可能在API请求量增大之后造成一定影响,目前服务器压力并不太大。如果未来没有人对新闻信息的变动感兴趣,会考虑针对一条新闻只保留一个版本。

hack-fang commented 4 years ago

相同sourceUrl的新闻经过编辑最终一定是一条新闻,如存在相同sourceUrl的新闻数据可更新覆盖,感觉同一sourceUrl来源的新闻存储多条是没有必要的。丁香园编辑多次,但是来源新闻是没有发生变化的。

是的,相同的sourceUrl的新闻是同一条新闻,但是丁香园的前后版本有出入,最好还是以最新版本为准。如果按照你提供的pull request,遇到相同sourceUrl的新闻直接跳过,而并没有检查是否有更新。

更新覆盖也是一个方案,在此处find_one之后,检查titlesummary内容是否一致,无法仅用sourceUrl就完成匹配。

我刚才已经完成了后端的返回规则,针对同一新闻id,只返回最新的那条新闻。现在可以调用API进行测试,应该已经能够实现新闻去重了。

测试成功