新手求教,刚学爬虫,想写个简单的抓新闻热点的练练手。
在存入 mysql 时,每小时爬取一次,爬取完先 delete 表里的数据,再插入新的数据。
如果想存下历史记录,会有个重复问题。这个时候该如何处理呢? 新建个历史表,每次插入最新的榜单之前,判断每条的标题是否历史库中已经存在,如果存在就将历史库中的删除。历史数据多了,不知道这个过程会不会很慢。。。
想问下各位大哥,上面的想法是否正确,有没有更好的方式,谢谢
1
vitozyf 2020-03-04 17:50:24 +08:00
不用 delete 吧,按热度设置一个 id,每次回来批量更新进去就行了
|
2
kiracyan 2020-03-04 18:00:02 +08:00
一个缓存表,爬的数据进这个表
一个历史表,一个小时的时间随你怎么洗数据了 |
3
shellus 2020-03-04 18:01:17 +08:00
每个数据都有它的主键,例如你爬 https://www.v2ex.com/t/649832#reply1 这个帖子,那么它的主键就是 649832,你下次再爬到这个帖子的时候,就用 update 而不是 inster 就行了
|
4
xkeyideal 2020-03-04 18:09:18 +08:00
用 mongodb,mysql 没有 upsert 原语,有时候不知道该 insert 还是 update,这涉及到并发
|
5
Sanko 2020-03-04 19:30:48 +08:00 via Android
select for update
|
6
lake325 2020-03-04 20:03:57 +08:00
为什么要 delete 呢? 一直 insert 不好吗? select 的时候按照时间排序 limit 1
|
7
wzwwzw 2020-03-04 23:12:19 +08:00
不 delete 直接 insert 记录好每次的时间。
|
8
also24 2020-03-04 23:26:01 +08:00
说明你抓新闻的时候,只关注了新闻的标题和内容,没有关注那条新闻的其它数据。
判断是否同一条新闻,未必要通过新闻标题内容,应当尽量使用其它更方便索引的信息来判断。 例如: 这个新闻是否有 id ? 如果没有 id,是否有唯一的 url 参数? |
9
crella 2020-03-05 09:03:18 +08:00 via Android
数据量少的话,把所有 mysql 里面的数据读取到 python 里面,再在 python 的词典里修改,然后 mysql 删除表下所有内容,打开事务,写入到 mysql 表里。
我大概 3000 多条招聘信息,目前没什么性能问题。 |
10
crella 2020-03-05 09:17:28 +08:00 via Android
我那个用 sqlite3 数据库,而且希望整理数据的时间在十秒内。如果你对整理数据的速度要求不高的话,慢慢来就好,楼上几位大佬都有建议
|
11
lostpupil 2020-03-05 09:41:41 +08:00
如果是 帖子 ID,你还是需要帖子的来源,这两个放在一起才能避免 A 平台的 ID 和 B 平台 ID 重复的问题。
如果存 历史数据,你在爬出来的时候可以对数据标题和内容进行摘要,把摘要值写进数据库去。 回到第一条,不要用帖子 ID,标题作为主键,应该对于标题或者内容进行摘要,这样你既能快速的判断内容是否一致,也能方便的存储历史版本。 |
12
CatTom 2020-03-05 09:44:29 +08:00 1
每一条新闻热点都会有一个独一的属性 ID,抓到这个属性后当做你的主键 ID 存数据库。然后不用 delete,MySQL 有一条很方便的 sql 可以让我们对数据操作时通过特定的属性来进行 insert 或 update。例:inerty into test(t1,t2,t3) value(t1,t2,t3) on duplicate key update t1 = values(t1)
|
13
RangerWolf 2020-03-05 09:45:35 +08:00
楼上正解 ~ MySQL 非常好用的 feature 之一
|
14
l3n641 2020-03-05 10:00:06 +08:00
热点放 redis 里面设置一个小时自动过期.然后历史库的数据只要保存历史的数据就可以了.
|
15
luzihang 2020-03-05 10:10:40 +08:00
redis 用 set 去重。
绝对去重,比如新闻更新:使用布隆过滤器或者 redis set 标题+发布时间+更新时间计算一个 hash 值 模糊去重,去除不同渠道互相抄袭的新闻:es 或者 simhash 新闻标题+正文内容 |
17
luzihang 2020-03-05 10:21:57 +08:00
实际操作过 12 楼的方法,新闻正文这种长文本,各种转义,SQL 字符串拼接是个头疼的问题,没有成功过。
|
26
hushao 2020-04-09 18:35:54 +08:00
如果保留历史记录,那么就只需要插入而不需要删除 /更新,取出的时候按照时间戳取最新结果就行。
如果需要按标题判断,可以直接按标题建 unique key,然后 insert into on duplicate update...,另外标题可以做 md5 之类优化。 另外 sqlite 直接可以 insert or update 吧。 |
27
hushao 2020-04-09 18:37:01 +08:00
。。。没看完回复,发现有人说过了,不好意思😂
|