V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
bb2018
V2EX  ›  Python

scrapy 采集百度贴吧入库 mysql 后。入库数据时间是混乱的,有什么办法可以按百度贴吧发贴时间顺序入库不?

  •  
  •   bb2018 · 2017-04-30 15:14:44 +08:00 · 3647 次点击
    这是一个创建于 2747 天前的主题,其中的信息可能已经有所发展或是发生改变。
    scrapy 采集百度贴吧入库 mysql 后。入库数据时间是混乱的,有什么办法可以按百度贴吧发贴时间顺序入库不?

    如图:

    https://static.oschina.net/uploads/space/2017/0430/125704_3lK4_2628079.png


    后面的这一列时间。是我采集的百度贴吧楼主发贴的时间。入库后发现这个好混乱。

    如果想把百度贴吧发贴的时间顺序入库。

    请问实现这个需要什么思路?
    24 条回复    2017-05-02 11:04:39 +08:00
    sunchen
        1
    sunchen  
       2017-04-30 16:15:26 +08:00
    我的天,不能 order by 一下吗
    iyaozhen
        2
    iyaozhen  
       2017-04-30 16:24:40 +08:00 via Android
    为什么要保证数据库里是顺序的?
    chinvo
        3
    chinvo  
       2017-04-30 16:26:51 +08:00
    爬的时候把百度输出的 发帖 /回复 时间也爬了,然后按时间排序呗
    bb2018
        4
    bb2018  
    OP
       2017-04-30 17:11:29 +08:00
    @sunchen insert into 数据库没法 order by 吧?

    我是想实现这样的功能:
    比如贴子时间分别是:2010 年 5 月 2011 年 5 月 2012 年 5 月 2013 年 5 月 2014 年 5 月 2015 年 5 月 的六个贴子。

    现在用 scrapy 采集到 item 里入库 mysql 的时候。这个时间是混乱的。有可能 id 对应的时间是 2015 年的, 也有可能是 2013 年的。
    而我想实现的功能是:id 1 对应的是最早的贴子 2010 年 5 月的 id 2 对应的次早的贴子 2011 年 5 月的 最大的 id 6 对应的是 2015 年的贴子,这样我调用出来的时候显示的才是最新的。

    不知道这个是怎么排序的? 是入库前在 scrapy 的 item 里就排好了序? 还是在入库 mysql 的时候排? 还是都不行。只能在用代码调用数据的时候排数据? 而不管这个 id 是多少?
    tttty
        5
    tttty  
       2017-04-30 17:13:55 +08:00
    插入排序
    bb2018
        6
    bb2018  
    OP
       2017-04-30 17:14:28 +08:00
    @iyaozhen 因为如果那时间是混乱的。 第一条数据 id 1 可能对应的是最新的贴子,而最大的 id 也就是最后入库的那个贴子有可能是是几年前的最老的那个贴子。 这样很不好吧?
    bb2018
        7
    bb2018  
    OP
       2017-04-30 17:16:47 +08:00
    @tttty 这样? INSERT INTO tbl_name (a1 , a2 , a3) VALUES (b1, b2, b3 ) order by b3 desc;
    b3 是百度发贴的时间
    这样吗? 好像不行。
    CosimoZi
        8
    CosimoZi  
       2017-04-30 17:18:31 +08:00
    。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。为什么要保证 id 是按顺序的。你加个发帖时间字段不行吗。
    bb2018
        9
    bb2018  
    OP
       2017-04-30 17:21:31 +08:00
    @CosimoZi 加个发贴时间。那入库的时间就是新的发贴时间了。我是想保留原发贴时间。就用原发贴时间。最好原发贴时间与 id 对应。
    em70
        10
    em70  
       2017-04-30 17:25:47 +08:00 via Android
    你直接说你的根本需求,大家帮你出主意。你的解决方案完全是无意义的,没有讨论价值
    CosimoZi
        11
    CosimoZi  
       2017-04-30 18:47:20 +08:00
    @bb2018 感觉你完全不懂 sql。。。
    mozutaba
        12
    mozutaba  
       2017-04-30 18:51:06 +08:00
    那你别用自增 id 呗。
    bb2018
        13
    bb2018  
    OP
       2017-04-30 19:45:44 +08:00
    @CosimoZi 是的。新手正在边查资料边试验。只会最基本的几条语句
    bb2018
        14
    bb2018  
    OP
       2017-04-30 19:46:51 +08:00
    @em70
    这样的需求。不知道这样描述,能表达清楚不:

    我是想实现这样的功能:
    比如贴子时间分别是:2010 年 5 月 2011 年 5 月 2012 年 5 月 2013 年 5 月 2014 年 5 月 2015 年 5 月 的六个贴子。

    现在用 scrapy 采集到 item 里入库 mysql 的时候。这个时间是混乱的。有可能 id 对应的时间是 2015 年的, 也有可能是 2013 年的。
    而我想实现的功能是:id 1 对应的是最早的贴子 2010 年 5 月的 id 2 对应的次早的贴子 2011 年 5 月的 最大的 id 6 对应的是 2015 年的贴子,这样我调用出来的时候显示的才是最新的。

    不知道这个是怎么排序的? 是入库前在 scrapy 的 item 里就排好了序? 还是在入库 mysql 的时候排? 还是都不行。只能在用代码调用数据的时候排数据? 而不管这个 id 是多少?
    xjx0524
        15
    xjx0524  
       2017-04-30 19:58:49 +08:00
    “加个发贴时间。那入库的时间就是新的发贴时间了。我是想保留原发贴时间。就用原发贴时间。最好原发贴时间与 id 对应。”

    搞不懂你这前半句什么意思,既然能爬到发帖时间,就把这个时间存到一个字段里,需要 select 的时候按这个字段排序不就完了
    gdtv
        16
    gdtv  
       2017-04-30 20:25:22 +08:00
    我明白楼主的意思,楼主采用的采集框架或者别人的采集代码把最后回复时间当成了帖子时间,这个很简单啊,自己想办法抓取到主帖的发帖时间就行了啊。
    PS:我前不久也做了百度贴吧采集。
    Famio
        17
    Famio  
       2017-04-30 20:28:32 +08:00
    说真的,我也不会去关心入库的顺序,反正读的时候 order by
    em70
        18
    em70  
       2017-04-30 20:36:21 +08:00
    @bb2018 有个名词叫时间戳,具体含义可以去百度下,你抓到的 2017-1-24 10:31 这样的时间数据都可以很方便的转换为一个唯一的时间戳数字,把这个数字保存到一个字段,查询时候用这个数字排序即可
    wwqgtxx
        19
    wwqgtxx  
       2017-04-30 20:49:55 +08:00
    为啥要管插入顺序,select 的时候排个序不就好了
    至于时间,直接把网页上的时间转成时间戳保存进数据库不就行了
    changwei
        20
    changwei  
       2017-05-01 00:48:47 +08:00 via Android
    首先看到你的时间前面带 u,说明你时间还是 str 类型的,其次百度贴吧 tid 帖子号是时间递增的,直接用正则表达式分割出 url 里面 p 后面的数字,然后 order by 一下就可以,另外客户端接口可以直接抓取到时间戳

    我的 github.com/cw1997,里面有几个贴吧相关的爬虫项目,php 的 py 的都有,你可以找找看。zhuanlan.zhihu.com/codes 近期也会发布相关文章,欢迎持续关注。
    julyclyde
        21
    julyclyde  
       2017-05-01 07:30:52 +08:00
    原作的根本问题在于,情感上不愿意接受:sql 数据库本身不提供顺序,顺序必须用一个字段的排序来描述,这个事实
    “现在真是什么人都能写爬虫了”
    mcwanderer
        22
    mcwanderer  
       2017-05-01 09:23:15 +08:00
    我猜,楼主是处女座~
    msg7086
        23
    msg7086  
       2017-05-01 12:23:17 +08:00
    你对数据的 id 有多执着?
    你只是要显示的时候按照时间排序而已,这管 id 什么事?你直接进数据库把整个 id 列给砍了也不影响你的需求啊。
    10 楼就是问你到底需求是什么,还在那拼命扯 id 的问题,你到底是要看帖子还是要看 id 啦?
    flyingghost
        24
    flyingghost  
       2017-05-02 11:04:39 +08:00
    1,id 只唯一标识一条数据,除此之外什么作用都不应该有,包括顺序。改天换成 UUID,还怎么保证有序?
    2,数据插入的顺序,不代表 select 出的顺序。要想有序,必须 order by。
    3,原帖时间就应该是原帖时间,既不是回帖时间也不是抓取时间。如果不存在,请自己抓出、创建字段,并依此排序。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3990 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:19 · PVG 18:19 · LAX 02:19 · JFK 05:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.