分析一个爬虫的分页问题

接着这篇《Python爬取数据的分页分析》,最后的难点地方:滚动分页,不知道总页数的情况,如何确定爬虫的分页抓取。

以简书的“个人主页”-- “动态”为例来说明。

先看一下“个人动态”中有哪些数据:评论,喜欢,打赏,关注(作者、专题)(这些都指的是对他人的文章),发表文章(自己),还有一个重要数据“加入简书”(注册时间)。

            ## 用户行为类型 
            ## share_note 发表文章
            ## like_collection 关注专题
            ## comment_note 发表评论
            ## like_comment 赞了评论
            ## reward_note 打赏文章
            ## like_user 关注作者

再看一下网页结构,在个人主页下 看动态,是一个tab切换,有 文章 -- 动态 -- 最新评论 -- 热门,默认情况下,看到的是“文章”这个tab,切换到“动态”tab下,就可以看到用户在简书上一系列的行为操作和时间。不断下拉滚动条,看到所有记录,最后一条是用户的注册时间。

一个典型的滚动分页,不知道总页数。那爬虫如何确定分页的URL,抓取到所有数据呢?

特别注意,因为这个页面采用的框架页,进到用户主页,切换到“动态”tab,查看源代码,是看不到“动态”内容的源代码的。这个也给我们确定分页的URL中的参数造成难题。

还是用Chrome -- 检查 -- Network 工具来分析一下 第2页,第3页的URL,找找规律:

这是第2页URL:

http://www.jianshu.com/users/1441f4ae075d/timeline?max_id=97250697&page=2  

第3页URL:

http://www.jianshu.com/users/1441f4ae075d/timeline?max_id=94439065&page=3

基本可以确定,分页URL是userid/timeline?max_id=xxx&page=x,URL中需要这样两个参数:max_id和page,max_id是什么鬼,这个就是这里分页的最关键的地方,还有一共有多少页怎么确定,也就是爬虫需要递归调用多少次才结束。

还有一点,需要同时看一下,第2页、第3页分页返回的是xml数据(一段网页代码),也就是这时最大程度复用了页面,用的Ajax。

第一步,先确定max_id,还是要到页面源代码中找蛛丝马迹,如果按照一开始进到用户主页,切到“动态”tab,别说max_id找不到,就连页面的那些内容也找不到。陷入僵局的状态。这个max_id看名字就不像时间戳,而像是页面开始的数据id。

关键原因是框架页面挡住了我们的视线,把第2页、第3页的URL直接粘到地址栏回车,查看源代码,一切都有了。

把刚刚分页URL中的那个max_id搜一下,有木有。我的猜想是最后一个id。顺着这个思路往下就比较好弄了。关键是拿出

<li class="" id="feed-93167794">

当中的id去构造一个分页URL就行了,然后顺序往下翻,直到最后一页为止。

不细说了,如何确定max_id,如何提取max_id,如何确定最后一页。

好啦,我直接上源码:

#coding=utf-8
import requests
from lxml import etree

## 抓取用户timeline数据
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}

def get_info(url,page):

    uid   = url.split('/')
    uid   = uid[4]

    if url.find('page='):
        page = page+1

    html = requests.get(url,headers=headers).content
    selector = etree.HTML(html)

    infos2 = selector.xpath('//ul[@class="note-list"]/li/@id')

    infos = selector.xpath('//ul[@class="note-list"]/li')
    for info in infos:
        name = info.xpath('div/div/div/a/text()')[0]
        dd = info.xpath('div/div/div/span/@data-datetime')[0]
        type = info.xpath('div/div/div/span/@data-type')[0]
        print type
        print dd

    if len(infos) > 1:
        tid = infos2[len(infos2) - 1]
        tid = int(filter(str.isdigit, tid)) - 1
        print tid

        next_url = 'http://www.jianshu.com/users/%s/timeline?max_id=%s&page=%s' % (uid, tid, page)

        
        get_info(next_url,page)


get_info('http://www.jianshu.com/users/54b5900965ea/timeline',1)


Github: https://github.com/ppy2790/author/, 可以比较一下Scrapy 和直接用 requests 两种方式的代码有什么不同。

经验:大胆设想,小心求证,简化处理,认真查找,反复折腾

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,815评论 25 707
  • 结婚后,我时常忘了自己几岁。 博爸也是,有一次,我说到一个朋友,说她比我小,才三十出头,年轻就是好,充满活力。 博...
    小时光阁楼阅读 198评论 0 3
  • 《假如生活欺骗了你》是俄国诗人普希金于1825年流放南俄敖德萨同当地总督发生冲突后,被押送到其父亲的领地米哈伊洛夫...
    A1ex马杰阅读 582评论 0 0
  • 不知何时开始,我害怕阅读的人。就像我们不知道冬天从哪天开始,只会感觉夜的黑越来越漫长。 我...
    小富婆儿Amber阅读 709评论 0 0