爬虫练习-爬取简书网用户动态信息(应对AJAX)

前言:

应对AJAX动态加载,爬取简书网用户动态信息,并将爬取的数据存储于MongoDB数据库中

本文为整理代码,梳理思路,验证代码有效性——2020.1.21


环境:
Python3(Anaconda3)
PyCharm
Chrome浏览器

主要模块: 后跟括号内的为在cmd窗口安装的指令
requests(pip install requests)
lxml(pip install lxml)
pymongo(pip install pymongo )

1

首先简单介绍一下异步加载(AJAX),它其实就是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。1

在网页里的体现如截图所示,在点击"文章"和点击"动态"后,它们的网址url都没有发生变化,这里就是所谓的使用了异步加载(AJAX)。
在这里插入图片描述
在这里插入图片描述

2

那么在爬虫爬取信息时,我们要如何应对呢,打开开发者工具F12,切换至Network界面并选择XHR文件,点击一下动态,这时开发者工具界面应该如截图所示,有一个名为timeline?_pjax=%23list-container的文件生成,这就是第一步,找到动态文件,并获取真实请求的URL(框起来了)。
在这里插入图片描述

3

这时我们要尝试简化删除这个URL里不必要的一些参数。

# 原URL
https://www.jianshu.com/users/c5a2ce84f60b/timeline?_pjax=%23list-container

# 精简后
https://www.jianshu.com/users/c5a2ce84f60b/timeline

这样我们就可以通过精简后的URL构造其他的URL了。

4

当我们想找其他页时,发现并没有那种分页条,简书网的分页也是通过异步加载实现的,那么让我们滑动页面,看看加载了哪些文件。
在这里插入图片描述
这里先异想天开的就留一个page的参数如:https://www.jianshu.com/users/c5a2ce84f60b/timeline?page=2,然而并没有这么简单。
在这里插入图片描述
不错,这里是访问到了界面,BUT,这个界面和第一页的界面是一毛一样啊/(ㄒoㄒ)/~~,说明另一个参数max_id也是一个重要参数,那么接下来就考虑怎么获取max_id。

5

这里需要一双亮闪闪的大眼睛,我们通过各种寻找,发现了这些XHR文件中最后一个li元素标签的id属性值即为下一页的max_id+1。OK,顺利解决问题。
在这里插入图片描述

6

之前的2-6步就是应对简书网AJAX的方法,而该方法称为逆向工程方法。应对完这种‘反爬虫’后,接下来的工作就是获取信息并插入到MongoDB数据库中。
我们需要爬取的信息为动态类型(如下,“like_note”的意思为“喜欢了文章”)及动态发布时间。
在这里插入图片描述

7

这里具体的网页分析我就不多说了,详见完整代码,代码相对简单,而且我每块都给注释起来了,还有什么无法理解的地方,评论请留言或私信我。

完整代码

# url = "https://www.jianshu.com/users/c5a2ce84f60b/timeline?_pjax=%23list-container"
# 导入库
import requests
from lxml import etree
import pymongo

# 连接MongoDB数据库
client = pymongo.MongoClient('localhost', 27017)

# 创建数据库和数据集合
mydb = client['mydb']
timeline = mydb['timeline']

# 加入请求头
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                        'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}


def get_time_info(url, page):
    # 对url进行拆分,获取用户id,url如:https://www.jianshu.com/users/c5a2ce84f60b/timeline
    user_id = url.split('/')
    user_id = user_id[4]

    # 如果是第一页后的url,其中会包含'page='的字样,让它进行翻页
    if url.find('page='):
        page = page+1

    html = requests.get(url=url, headers=headers)
    selector = etree.HTML(html.text)
    print(url, html.status_code)

	# 首先将它分为许多个li块,方便后续解析数据
    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]
        
        # 以json或者说是字典的格式 插入数据
        timeline.insert_one({'date': dd, 'type': type})
        print({'date': dd, 'type': type})

    # 获取id,以达到构造动态页面的url的目的
    id_infos = selector.xpath('//ul[@class="note-list"]/li/@id')
    if len(infos) > 1:
        feed_id = id_infos[-1]
        # feed-id的原样例如:feed-578127155,需手工切分
        max_id = feed_id.split('-')[1]
        # 构造动态页面的url
        next_url = 'http://www.jianshu.com/users/%s/timeline?max_id=%s&page=%s' % (user_id, max_id, page)
        # 递归调用,爬取下一页的信息
        get_time_info(next_url, page)


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

  1. ajax (Ajax 开发) ↩︎

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
scrapy是一个用于网站抓取和数据提取的Python框架,而微博和简书分别是一个社交媒体平台和一个知识分享平台。要使用scrapy爬取微博评论简书,可以按照以下步骤进行: 首先,需要安装好Python和scrapy框架。可以通过安装Python的pip包管理工具,并使用pip安装scrapy。 然后,对于微博,可以通过登录微博开放平台,注册一个开发者账号,并创建一个应用。获取到应用的App Key和Secret Key,以便进行API调用。在scrapy项目的settings.py文件中添加好相应的key。 接下来,使用scrapy创建一个新的项目。可以使用命令行工具执行以下命令:scrapy startproject weibo 在项目的spiders目录下,创建一个新的spider。可以使用命令行工具执行以下命令:scrapy genspider weibo_spider "weibo.com" 编辑新创建的spider,编写爬取微博评论的代码。可以使用weibo API提供的接口进行评论的爬取。 然后,启动爬虫,执行以下命令:scrapy crawl weibo_spider 在简书的情况下,可以使用简书提供的API接口进行评论的抓取。首先,需要注册一个账号,并通过简书的开发者平台获取到相应的API Key。然后,使用获取到的API Key进行API调用。 创建一个新的spider来实现对简书评论的爬取,类似于上述微博的爬虫。 最后,启动爬虫,执行相应的命令来抓取简书评论。 总之,使用scrapy爬取微博评论简书可以通过利用它提供的网页抓取和数据提取功能,结合微博和简书的API进行相应的数据获取。通过上述步骤的操作,可以简单实现这个目标。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值