本文实例讲述了Python实现爬取马云的微博功能。分享给大家供大家参考,具体如下:
分析请求
我们打开 Ajax 的 XHR 过滤器,然后一直滑动页面加载新的微博内容,可以看到会不断有Ajax请求发出。
我们选定其中一个请求来分析一下它的参数信息,点击该请求进入详情页面,如图所示:
可以发现这是一个 GET 请求,请求的参数有 6 个:display、retcode、type、value、containerid 和 page,观察这些请求可以发现只有 page 在变化,很明显 page 是用来控制分页的。
分析响应
如图所示:
它是一个 Json 格式,浏览器开发者工具自动为做了解析方便我们查看,可以看到最关键的两部分信息就是 cardlistInfo 和 cards,将二者展开,cardlistInfo 里面包含了一个比较重要的信息就是 total,经过观察后发现其实它是微博的总数量,我们可以根据这个数字来估算出分页的数目。
发现它又有一个比较重要的字段,叫做 mblog,继续把它展开,发现它包含的正是微博的一些信息。比如 attitudes_count 赞数目、comments_count 评论数目、reposts_count 转发数目、created_at 发布时间、text 微博正文等等,得来全不费功夫,而且都是一些格式化的内容,所以我们提取信息也更加方便了。
这样我们可以请求一个接口就得到 10 条微博,而且请求的时候只需要改变 page 参数即可。这样我们只需要简单做一个循环就可以获取到所有的微博了。
实战演练
在这里我们就开始用程序来模拟这些 Ajax 请求,将马云的所有微博全部爬取下来。
首先我们定义一个方法,来获取每次请求的结果,在请求时page 是一个可变参数,所以我们将它作为方法的参数传递进来,代码如下:
首先在这里我们定义了一个 base_url 来表示请求的 URL 的前半部分,接下来构造了一个参数字典,其中 display、retcode、 type、value、containerid 是固定的参数,只有 page 是可变参数,接下来我们调用了 urlencode() 方法将参数转化为 URL 的 GET请求参数,即类似于display=0&retcode=6102&type=uid&value=2145291155&containerid=1076032145291155&page=2 这样的形式,随后 base_url 与参数拼合形成一个新的 URL,然后我们用 Requests 请求这个链接,加入 headers 参数,然后判断响应的状态码,如果是200,则直接调用 json() 方法将内容解析为 Json 返回,否则不返回任何信息,如果出现异常则捕获并输出其异常信息。
随后我们需要定义一个解析方法,用来从结果中提取我们想要的信息,比如我们这次想保存微博的 正文、赞数、评论数、转发数这几个内容,那可以先将 cards 遍历,然后获取 mblog 中的各个信息,赋值为一个新的字典返回即可。
在这里我们借助于 PyQuery 将正文中的 HTML 标签去除掉。
最后我们遍历一下 page,将提取到的结果打印输出即可。
另外我们还可以加一个方法将结果保存到 本地 TXT 文件中。
代码整理