Closed hack-fang closed 4 years ago
收到,感谢反馈。
SSL证书已经重新配置,测试证书已经能够通过校验,不需要加入verify=False
也可以正常使用。
我会重新做一下数据清洗,应该是数字前后空格的有无不一致,导致新闻重复收录。
新闻不会重复保存,是之前有一部分新闻有遗漏,我重新写了一份爬虫没有使用相同的字符串匹配规则。个人认为本身就是轻量化的脚本,不需要再通过Docker来进行部署了。
新闻不会重复保存,是之前有一部分新闻有遗漏,我重新写了一份爬虫没有使用相同的字符串匹配规则。个人认为本身就是轻量化的脚本,不需要再通过Docker来进行部署了。
建议在保存前查询是否存在相同的sourceUrl而不是完整的数据来确定是否保存。
新闻不会重复保存,是之前有一部分新闻有遗漏,我重新写了一份爬虫没有使用相同的字符串匹配规则。个人认为本身就是轻量化的脚本,不需要再通过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只返回一条最新的信息。
新闻不会重复保存,是之前有一部分新闻有遗漏,我重新写了一份爬虫没有使用相同的字符串匹配规则。个人认为本身就是轻量化的脚本,不需要再通过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
来源的新闻存储多条是没有必要的。丁香园编辑多次,但是来源新闻是没有发生变化的。
相同
sourceUrl
的新闻经过编辑最终一定是一条新闻,如存在相同sourceUrl
的新闻数据可更新覆盖,感觉同一sourceUrl
来源的新闻存储多条是没有必要的。丁香园编辑多次,但是来源新闻是没有发生变化的。
是的,相同的sourceUrl
的新闻是同一条新闻,但是丁香园的前后版本有出入,最好还是以最新版本为准。如果按照你提供的pull request,遇到相同sourceUrl的新闻直接跳过,而并没有检查是否有更新。
更新覆盖也是一个方案,在此处find_one
之后,检查title
和summary
内容是否一致,无法仅用sourceUrl
就完成匹配。
我刚才已经完成了后端的返回规则,针对同一新闻id
,只返回最新的那条新闻。现在可以调用API进行测试,应该已经能够实现新闻去重了。
但每一次调用API都要去重确实可能在API请求量增大之后造成一定影响,目前服务器压力并不太大。如果未来没有人对新闻信息的变动感兴趣,会考虑针对一条新闻只保留一个版本。
相同
sourceUrl
的新闻经过编辑最终一定是一条新闻,如存在相同sourceUrl
的新闻数据可更新覆盖,感觉同一sourceUrl
来源的新闻存储多条是没有必要的。丁香园编辑多次,但是来源新闻是没有发生变化的。是的,相同的
sourceUrl
的新闻是同一条新闻,但是丁香园的前后版本有出入,最好还是以最新版本为准。如果按照你提供的pull request,遇到相同sourceUrl的新闻直接跳过,而并没有检查是否有更新。更新覆盖也是一个方案,在此处
find_one
之后,检查title
和summary
内容是否一致,无法仅用sourceUrl
就完成匹配。我刚才已经完成了后端的返回规则,针对同一新闻
id
,只返回最新的那条新闻。现在可以调用API进行测试,应该已经能够实现新闻去重了。
测试成功
python requests请求接口显示ssl 校验错误,通过设置requests.get(url,verify=False),不校验证书临时解决
省份新闻返回重复(新闻来源一致,只是空格的问题), 复现: https://lab.isaaclin.cn/nCoV/api/news?num=all&province=安徽省
可通过合并请求解决爬虫新闻重复保存 https://github.com/BlankerL/DXY-2019-nCoV-Crawler/pull/19