简单的微博评论内容和全文的抓取
in 爬虫 with 0 comment

简单的微博评论内容和全文的抓取

in 爬虫 with 0 comment

准备工作

基本上就需要一个requests就能开始干活了

分析

我想要抓取某人微博上的全文以及文章下面的评论,据说使用手机端对新手更友好,不需要考虑太多东西,所以我们就以m.weibo.cn为目标站进行抓取。

打开一个用户的一篇微博,这里以我的一位微博好友为例子(主要是算是我的微博好友里面发布微博比较多的一个了。

![TIM截图20180209214755.png](TIM截图20180209214755.png)

右键打开开发者工具

TIM截图20180209214928.png
TIM截图20180209215227.png

通过分析我们猜测

https://m.weibo.cn/statuses/extend?id=4160007676626094

https://m.weibo.cn/api/comments/show?id=4160007676626094&page=1

这两个url就是获取文章详情和微博评论的两个地址,我们只需要找到id这个参数就可以了。

我们打开该用户的首页

TIM截图20180209212629.png

我们右键点击检查,打开network选项卡

TIM截图20180209213622.png

点击这个东西,然后点击preview

TIM截图20180209215516.png

咦?好像这个id很熟悉哈,回过头看看是不是很像前面的参数哇?

但是我们怎么能够将所有的id都获取到呢?emmm我们可以一篇一篇这样重复操作就可以获取到啦!是不是很聪明!(手动狗头

当然不可以这样子找,那样我们还不如自己复制内容和评论呢

继续观察

我们会发现他的Request URL是有规律的,所以我们可以构建一个url,访问这个url得到每一篇微博的概括(因为是看不了全文的)每一个url都是固定的后面的只有page在变化

type=uid&value=3645904761&containerid=1076033645904761&page=2

type=uid&value=3645904761&containerid=1076033645904761&page=3

TIM图片20180209214041.png

所以呢,我们大体上的思路就是通过https://m.weibo.cn/api/container/getIndex?type=uid&value=你的value&containerid=这个id&page=1中的page不断增加,遍历出所有的文章id,然后我们再通过这个id

https://m.weibo.cn/statuses/extend?id=你的id https://m.weibo.cn/api/comments/show?id=你的id&page=1来获得评论内容和所有文章详情

总结

今天在编写这个的时候遇到一个很坑的东西,我爬取出来id以后,发现程序跑到特定的一篇文章以后竟然出错了!最后搞了好久,才发现原来这条微博在没有登陆的情况下进行访问会出现该微博已经被删除,但是如果你登陆了就能正常查看,所以我们在使用requests.get()时加上自己的cookies就可以了。

放上自己都不忍直视的代码,好歹也是能正常运行的嘛~

import requests
from bs4 import BeautifulSoup
import time
from urllib.parse import urlencode


headers={
    'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) '
             'Chrome/64.0.3282.140 Mobile Safari/537.36',
    'X-Requested-With':'XMLHttpRequest'
    }
cookies={
    'cookies':'这里换上你自己的cookies'
    }
def get_page(page):
    url_bash = 'https://m.weibo.cn/api/container/getIndex?'
    params = {
        'type':'uid',
        'value':'6065805301',
        'containerid':'1076036065805301',
        'page':page
    }
    url = url_bash+urlencode(params)
    response = requests.get(url,headers=headers)
    try:
        if response.status_code==200:
            return response.json()
    except  Exception as e:
        print('Error',e.args)

def prase_page(json):
    if json:
        items = json.get('data').get('cards')
        for item in items:
            item = item.get('mblog')
            id=[]
            if item:
                id = item.get('id')
                yield id


def get_detail(id):
    url_bash = 'https://m.weibo.cn/statuses/extend?'
    params={
        'id':id
    }
    url = url_bash+urlencode(params)
    detail_response = requests.get(url,headers=headers)
    try:
        if detail_response.status_code==200:
            json = detail_response.json()
            if json:
                detail_page = BeautifulSoup(json.get('data').get('longTextContent'),'lxml').text
                time.sleep(1)
                return detail_page
    except Exception as e:
        print('Error',e.args)

def get_comment(id):
    url_bash ='https://m.weibo.cn/api/comments/show?'
    i = 1
    params={
        'id':id,
        'page':i
    }
    url = url_bash+urlencode(params)
    max_page_response = requests.get(url=url,headers=headers,cookies=cookies)
    if max_page_response.json().get('msg')=='数据获取成功':
        max_page_num = max_page_response.json().get('data').get('max')
        for i in range(1,max_page_num+1):
            params={
                'id':id,
                'page':i
            }
            url = url_bash + urlencode(params)
            comment_response=requests.get(url=url, headers=headers, cookies=cookies)
            try:
                if comment_response.json():
                    comments = comment_response.json().get('data').get('data')
                    for comment in comments:
                        comment1=[]
                        comment_content = BeautifulSoup(comment.get('text'),'lxml').text
                        comment_user = comment.get('user').get('screen_name')
                        comment1 = comment_user +  ': ' + comment_content
                        time.sleep(1)
                        yield comment1
            except Exception as e:
                print('Error', e.args)

if __name__=='__main__':
    for page in range(1,20):
        json = get_page(page)
        results = prase_page(json)
        for result in results:
            detail = get_detail(result)
            print(detail)
            print('---'*5)
            comments = get_comment(result)
            for comment in comments:
                print(comment)
            print('**********************')

最后为了偷懒,只是打印出来了而已,并没有保存在本地。

Responses