想求一个高效查找算法
问题环境大概如下:用python或其他语言编写爬虫,从某网站上进行爬取。内容共两部分,一部分是idlist,另一部分是content,分别是两个不同的url,所以无法通过一次请求就将id和content请求出来。idlist的数据有16000+,content则是达到了10w。网站内容会随时更新,但看起来插入的顺序没有什么规律,并非直接在末尾增加,貌似也不是根据拼音。
在首次进行爬取时使用全部遍历的方式,但在后续更新内容的爬取逻辑上并没有什么高效的方式。只能先通过对idlist的网页将所有id请求下来,再和首次爬取的所有id做差集,得出新的id,形成新的id列表。再请求content网站,content网站有内容数量字段,通过对各id已有的内容数量和网站上更新的内容数量进行判断,相等则没有更新,判断下一个id;不相等则有更新,加入新id列表。如此反复,直到将所有id判断一遍,形成一个所有需要请求内容的id列表,最后统一进行content爬取。
我目前找不到网站的更新逻辑,不知道是依据什么来插入新内容的,所以只能通过遍历的方法进行。但是数据量很大,这么做效率实在太低,想求一个高效方法。或是能有兄台通过url找出了更新逻辑。最后附上爬取的网页地址。
我个人解析出的id请求网址:https://glxy.mot.gov.cn/company/自行删除getCompanyAptitude.do
content请求网址:https://glxy.mot.gov.cn/company/自行删除getCompanyAchieveList.do
需求是:抓取某单位的已建业绩的全部字段数据
id网址仅抓取id和name,conten抓取所有字段(

三部分都要
我觉得列表页没有规律不大可能吧?是不是你没有发现出来??最好还是再好好看看,找出列表页的更新规律出来。大部分是按照时间逆序排列的。。当然也有部分平台有历史文章的修改的,比如只是改了一个错别字。。
如果真的没有规律,那么大概需要缓存redis来实现了。建议可以存取列表页每个页面的hash值,通过hash值来匹配应该速度快一些。文章页面匹配也是如此。。然后将redis里面的hash序列跟刚刚抓取的进行匹配。
根据你的需求我觉得以下可以进行改善:
- 针对这里:“只能先通过对idlist的网页将所有id请求下来,再和首次爬取的所有id做差集,得出新的id,形成新的id列表”,这里可以通过redis做一个过滤器,在redis创建一个过滤集合set,每次爬取得到的id先插入集合中,如果能插入进去,那么说明此id为新id,可以进行后续的content的爬取,加入新id列表
- 针对这里:“通过对各id已有的内容数量和网站上更新的内容数量进行判断,相等则没有更新,判断下一个id;不相等则有更新”,既然已经拿到content的具体响应了,为什么还要判断数量,直接入库通过唯一索引把重复内容过滤掉
- 两个请求在第一次全量跑完后完全可以异步启动,两个搞成分布式任务通过多线程消费,10W+的数据量不算多,应该挺快能跑完
朋友,首先有个大前提:在P/NP问题里,复杂度为多项式的算法就认为是“高效”的
然后小前提:顺序查找的复杂度为多项式
得出结论:顺序查找是高效的
所以你问的有没有一种针对无序列表也可以高效的查找算法?
答案是“有”←_←
如果问题换成“有没有比O(n)复杂度更低的算法”,那参见其他人的答案吧……