接著這篇《Python爬取數(shù)據(jù)的分頁(yè)分析》,最后的難點(diǎn)地方:滾動(dòng)分頁(yè)帮寻,不知道總頁(yè)數(shù)的情況旺订,如何確定爬蟲(chóng)的分頁(yè)抓取弄企。
以簡(jiǎn)書的“個(gè)人主頁(yè)”-- “動(dòng)態(tài)”為例來(lái)說(shuō)明。
先看一下“個(gè)人動(dòng)態(tài)”中有哪些數(shù)據(jù):評(píng)論区拳,喜歡拘领,打賞,關(guān)注(作者樱调、專題)(這些都指的是對(duì)他人的文章)约素,發(fā)表文章(自己),還有一個(gè)重要數(shù)據(jù)“加入簡(jiǎn)書”(注冊(cè)時(shí)間)笆凌。
## 用戶行為類型
## share_note 發(fā)表文章
## like_collection 關(guān)注專題
## comment_note 發(fā)表評(píng)論
## like_comment 贊了評(píng)論
## reward_note 打賞文章
## like_user 關(guān)注作者
再看一下網(wǎng)頁(yè)結(jié)構(gòu)圣猎,在個(gè)人主頁(yè)下 看動(dòng)態(tài),是一個(gè)tab切換乞而,有 文章 -- 動(dòng)態(tài) -- 最新評(píng)論 -- 熱門送悔,默認(rèn)情況下,看到的是“文章”這個(gè)tab爪模,切換到“動(dòng)態(tài)”tab下欠啤,就可以看到用戶在簡(jiǎn)書上一系列的行為操作和時(shí)間。不斷下拉滾動(dòng)條屋灌,看到所有記錄洁段,最后一條是用戶的注冊(cè)時(shí)間。
一個(gè)典型的滾動(dòng)分頁(yè)共郭,不知道總頁(yè)數(shù)祠丝。那爬蟲(chóng)如何確定分頁(yè)的URL,抓取到所有數(shù)據(jù)呢落塑?
特別注意纽疟,因?yàn)檫@個(gè)頁(yè)面采用的框架頁(yè),進(jìn)到用戶主頁(yè)憾赁,切換到“動(dòng)態(tài)”tab污朽,查看源代碼,是看不到“動(dòng)態(tài)”內(nèi)容的源代碼的龙考。這個(gè)也給我們確定分頁(yè)的URL中的參數(shù)造成難題蟆肆。
還是用Chrome -- 檢查 -- Network 工具來(lái)分析一下 第2頁(yè),第3頁(yè)的URL晦款,找找規(guī)律:
這是第2頁(yè)URL:
http://www.reibang.com/users/1441f4ae075d/timeline?max_id=97250697&page=2
第3頁(yè)URL:
http://www.reibang.com/users/1441f4ae075d/timeline?max_id=94439065&page=3
基本可以確定炎功,分頁(yè)URL是userid/timeline?max_id=xxx&page=x
,URL中需要這樣兩個(gè)參數(shù):max_id和page缓溅,max_id是什么鬼蛇损,這個(gè)就是這里分頁(yè)的最關(guān)鍵的地方,還有一共有多少頁(yè)怎么確定,也就是爬蟲(chóng)需要遞歸調(diào)用多少次才結(jié)束淤齐。
還有一點(diǎn)股囊,需要同時(shí)看一下,第2頁(yè)更啄、第3頁(yè)分頁(yè)返回的是xml數(shù)據(jù)(一段網(wǎng)頁(yè)代碼)稚疹,也就是這時(shí)最大程度復(fù)用了頁(yè)面,用的Ajax祭务。
第一步内狗,先確定max_id,還是要到頁(yè)面源代碼中找蛛絲馬跡义锥,如果按照一開(kāi)始進(jìn)到用戶主頁(yè)柳沙,切到“動(dòng)態(tài)”tab,別說(shuō)max_id找不到缨该,就連頁(yè)面的那些內(nèi)容也找不到偎行。陷入僵局的狀態(tài)。這個(gè)max_id看名字就不像時(shí)間戳贰拿,而像是頁(yè)面開(kāi)始的數(shù)據(jù)id蛤袒。
關(guān)鍵原因是框架頁(yè)面擋住了我們的視線,把第2頁(yè)膨更、第3頁(yè)的URL直接粘到地址欄回車妙真,查看源代碼,一切都有了荚守。
把剛剛分頁(yè)URL中的那個(gè)max_id搜一下珍德,有木有。我的猜想是最后一個(gè)id矗漾。順著這個(gè)思路往下就比較好弄了锈候。關(guān)鍵是拿出
<li class="" id="feed-93167794">
當(dāng)中的id去構(gòu)造一個(gè)分頁(yè)URL就行了,然后順序往下翻敞贡,直到最后一頁(yè)為止泵琳。
不細(xì)說(shuō)了,如何確定max_id誊役,如何提取max_id获列,如何確定最后一頁(yè)。
好啦蛔垢,我直接上源碼:
#coding=utf-8
import requests
from lxml import etree
## 抓取用戶timeline數(shù)據(jù)
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.reibang.com/users/%s/timeline?max_id=%s&page=%s' % (uid, tid, page)
get_info(next_url,page)
get_info('http://www.reibang.com/users/54b5900965ea/timeline',1)
Github: https://github.com/ppy2790/author/击孩, 可以比較一下Scrapy 和直接用 requests 兩種方式的代碼有什么不同。
經(jīng)驗(yàn):大膽設(shè)想鹏漆,小心求證巩梢,簡(jiǎn)化處理创泄,認(rèn)真查找,反復(fù)折騰且改。