爬取微博条目

首先当然是成果镇楼

 

流程图

1.打开网页

2.得到个人微博数量并计算微博页数

3.爬取某一页

4.解析某一个

5.重复3-4直至全部完成

 

准备工作

​打开https://m.weibo.cn,然后随便搜一个名人,爬取名人的微博比较好,因为他们微博数量多嘛.粉丝也多.然后如下

你一直往下拉是不是会发现有很多新的蹦出来,别怕那不是怪兽,那是Ajax.这就是传说的动态网页.随便点开一个,你能发现url的构造方式,如下

然后再点preview,如下.数据是以json形式传输的,那么就在下图里面啦.

是不是很清晰明了啊.好了.从cards里面你就可以发现所有你想要的啦.接下来我们就开始爬啦.

 

需要的库

import requests
from fake_useragent import *
from urllib.parse import urlencode
from pyquery import PyQuery as pq
from pymongo import MongoClient
from requests.exceptions import ConnectionError


得到最大页

def getPageNumber(html):
    if html.get('data').get('cardlistInfo'):
        data = html.get('data').get('cardlistInfo')
        number = int(data.get('total'))
        pageNumber = number // 10 + 1
    return pageNumber

最大页数在页码传回来的字典里面.而每一页包含十条微博内容,那么页码就是总微博条数除以10,在加上1.

爬取某一页

def openPage(page):
    base_url = 'https://m.weibo.cn/api/container/getIndex?'
    ua = UserAgent()
    headers = {
        'User-Agent': ua.random
    }
    params = {
        'type': 'uid',
        'value': '1826792401',
        'containerid': '1076031826792401',
        'page': page
    }
    url = base_url + urlencode(params)
    try:
        response = requests.get(url,headers)
        if response.status_code == 200:
            return response.json()
    except ConnectionError:
        return None

首先是传入基础url,这里的基础url是指url里面不会变化的那部分,然后构造请求头.这里我用了fake_useragent库来随机得到一个headers.params是构造网页的参数.上面的Ajax里面都是网页,网页有四个参数,我们将page传入函数构造url.然后就是用requests请求爬取页码,然后传回json数据.

解析某一页

def parsePage(html):
    data = html.get('data').get('cards')
    for item in data:
        if item.get('card_type') == 9:
            message = {}
            message['rawText'] = item.get('mblog').get('raw_text')
            message['text'] = pq(item.get('mblog').get('text')).text()
            message['commentsCount'] = item.get('mblog').get('comments_count')
            message['attitudesCount'] = item.get('mblog').get('attitudes_count')
            message['repostsCount'] = item.get('mblog').get('reposts_count')
            message['source'] = item.get('mblog').get('source')
            yield message

parsePage()函数只有一个参数,这个参数就是页面代码.这里是字典形式返回的.然后存入一个字典.然后循环提取.

保存

def saveToMongo(item):
    if collection.insert(item):
        print('Save Successful')

def saveToFile(item):
    with open('weibo.txt', 'a', encoding='utf-8') as f:
        f.write('='*50 + '\n')
        if item.get('rawText') == None:
            item['rawText'] = ''
        f.write(item.get('text') + item.get('rawText')+ '\n')
        f.write('评论:' + str(item.get('commentsCount')) + '\n')
        f.write('转发:' + str(item.get('repostsCount')) + '\n')
        f.write('点赞:' + str(item.get('attitudesCount')) + '\n')

第一个函数是存入数据库,第二个是存入txt文档.存入txt文档的时候处理了一下,如最开始的镇楼图.rawText保存的是转发的内容.text里面保存的才是作者发的内容.

 

总结

接下来就是用一个for循环,循环爬取所有的微博信息.想要源代码的记得留言.

向上的Lennox是我的微信公众号,想要学爬虫的大佬们,我们可以一起.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值