爬虫学习之16:爬取简书网用户动态信息(异步加载页面的爬取)

       网上很多页面均采用异步加载,采用普通的request方法得不到结果。使用Chrome浏览器的Network选项卡可以查看网页加载过程中的所有文件信息,通过对这些文件的查看和筛选,就可以找出需抓取的数据,另外,异步加载网页的分页文件大部分在XHR(可扩展超文本传输请求)中,选中该选项,在向下滑动网页的过程中可以发现在加载文件,这些文件的header部分即为分页的URL,Response部分即为动态加载的网页的内容。以简书网某一用户的页面为例观察XHR 特点:

第一页:
    Request URL:https://www.jianshu.com/users/9104ebf5e177/timeline?_pjax=%23list-container   
    最后一个<li>id="feed-320645425"

第二页:
    Request URL:https://www.jianshu.com/users/9104ebf5e177/timeline?max_id=320645424&page=2   
    最后一个<li>id="feed-317062801"

第三页:
    Request URL:https://www.jianshu.com/users/9104ebf5e177/timeline?max_id=317062800&page=3   
    最后一个<li>id="feed-313597011"

第四页:
    Request URL:https://www.jianshu.com/users/9104ebf5e177/timeline?max_id=313597010&page=4   
    最后一个<li>id="feed-308010526"

从URL规律可以发现,其中的max_id是上一页的最后一个<li>标签的Id-1,文档中动态加载的内容以XML的方式进行异步加载,因此使用Request结合lxml爬取,并将数据存储到MongoDB中。代码如下:

import requests
from lxml import etree
import pymongo
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36'
}

client = pymongo.MongoClient('localhost',27017)
mydb = client['mydb']
timeline = mydb['timeline']

def get_time_info(url,page):
    #从链接获取用户id
    user_id = url.split('/')[4]
    if url.find('page='):
        page = page+1
    html = requests.get(url,headers=headers)
    selector = etree.HTML(html.text)
    infos = selector.xpath('//ul[@class="note-list"]/li')
    for info in infos:
        dd = info.xpath('div/div/div/span/@data-datetime')[0]
        type = info.xpath('div/div/div/span/@data-type')[0]
        timeline.insert_one({'data':dd,'type':type})

    id_infos =selector.xpath('//ul[@class="note-list/li/@id"]')
    if len(id_infos)>1:
        feed_id =id_infos[-1]
        max_id = feed_id.split('-')[1]
        next_url = 'https://www.jianshu.com/users/%s/timeline?max_id=%s&page=%s ' % (user_id,str(max_id-1),page)
        get_time_info(next_url,page)

if __name__=='__main__':
    get_time_info('https://www.jianshu.com/users/9104ebf5e177/timeline',1)


结果如下:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值