前一段时间看了崔庆才老师的书,爬取微博信息,于是想写一个爬取微博信息的爬虫,这里爬一个我比较喜欢的女明星的微博,谭松韵。

首先说明一点,微博真的是坑,

https://www.weibo.com/

https://m.weibo.cn

差距是真的大

崔庆才老师是按下面的微博讲的,而我被上面一个微博盘了一下午,心态爆炸。

好了,先上代码,因为崔庆才老师的书虽然不算旧,但网站一直在变化,所以我在这里只是借鉴,代码差距还是很大的

import requests
import re
from pymongo import MongoClient

client = MongoClient()
db = client['weibo']
collection = db['weibo_t2']

headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 '
                   '(KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
    'Referer' : 'https://m.weibo.cn/u/1307418975?uid=1307418975&luicode='
                '10000011&lfid=100103type%3D1%26q%3D%E8%B0%AD%E6%9D%BE%E9'
                '%9F%B5&sudaref=m.weibo.cn&display=0&retcode=6102',
}
def parse_page(url):
    resp = requests.get(url , headers=headers)
    # print(resp.json())
    text = resp.json()
    items = text.get('data').get('cards')
    # print(items)
    # print(type(items))
    for itme in items:
        result = itme.get("card_style")
        if not result:
            itme = itme.get('mblog')
            # print(itme)
            weibo_t = {}
            weibo_t['id'] = itme.get('id')
            # print(itme.get('id'))
            text = itme.get('text')
            text = re.sub(r'<.*?>' , '' , text).strip()
            # print(text)
            weibo_t['text'] = text
            weibo_t['attitudes'] = itme.get('attitudes_count')
            # print(itme.get('attitudes_count'))
            weibo_t['comments'] = itme.get('comments_count')
            # print(itme.get('comments_count'))
            weibo_t['reposts'] = itme.get('reposts_count')
            # print(itme.get('reposts_count'))
            save_to_mongo(weibo_t)

def main():
    for x in range(1,10):
        url = 'https://m.weibo.cn/api/container/getIndex?uid=1307418975&luicode' \
              '=10000011&lfid=100103type%3D1%26q%3D%E8%B0%AD%E6%9D%BE%E9%9F%B5&su' \
              'daref=m.weibo.cn&display=0&retcode=6102&type=uid&value=1307418975&con' \
              'tainerid=1076031307418975&page={}'.format(x)
        parse_page(url)

def save_to_mongo(weibo_t):
    if collection.insert(weibo_t):
        print("存储完成")

if __name__ == '__main__':
    main()

代码不长,注释均为测试代码,这里有几点要说明。

一:请先启动数据库

二:这里爬取10页,如果按照崔庆才老师的代码爬取,在第一页就会报错,我们来看看为什么。首先我们进到谭松韵微博首页

python3爬虫学习之Ajax分析微博爬取储存mongo实战

我们注意到,春分十五是她的最新微博,然而,重点来了,下面有个她关注,就是这么个玩意,坑了我好久。我们来分析一下ajax

python3爬虫学习之Ajax分析微博爬取储存mongo实战

看0,1,2之间的区别,0,2都是微博,然而1却是类似广告的东西,它的格式也是不一样的,我们需要过滤掉。方法如下

result = itme.get("card_style")
if not result:

我们注意到,广告它虽然在我们请求的ajax页面里,但它多了一项card_style的东西,我们利用它就可以过滤掉。

三,我们还应该注意一点

第一页是微博主页,它是没有微博内容的,像这样:

python3爬虫学习之Ajax分析微博爬取储存mongo实战

那么剩下的就是很中规中矩的分析和爬取存储了,没什么好说的。

另外,大家如果不擅长分析ajax,利用json提取数据的话,还有另一种爬取方法,

我们应该注意到,在我们分析的ajax的json数据中

python3爬虫学习之Ajax分析微博爬取储存mongo实战

有这么一项,这个是微博详情页

python3爬虫学习之Ajax分析微博爬取储存mongo实战

我们也可以提取所有的scheme属性的链接,然后爬取详情页,通过xpath或者re等手段拿到我们想要的数据。

展示一下数据库

python3爬虫学习之Ajax分析微博爬取储存mongo实战

这里只是部分,可以加大页数,另外,我该安装compass了。

以上,记录我被微博盘到崩溃的两天。

相关文章:

  • 2021-05-21
  • 2021-12-04
  • 2021-11-28
  • 2021-12-18
  • 2021-11-08
  • 2021-10-25
  • 2021-06-07
  • 2021-08-15
猜你喜欢
  • 2021-07-12
  • 2021-04-04
  • 2021-12-26
  • 2021-08-07
  • 2021-12-09
  • 2022-12-23
  • 2021-06-19
相关资源
相似解决方案