用python写网络爬虫-爬取新浪微博评论

新浪微博须要登陆才能爬取,这里使用m.weibo.cn这个移动端网站便可实现简化操做,用这个访问能够直接获得的微博id。html

分析新浪微博的评论获取方式得知,其采用动态加载。因此使用json模块解析json代码python

单独编写了字符优化函数,解决微博评论中的嘈杂干扰字符web

本函数是用python写网络爬虫的终极目的,因此采用函数化方式编写,方便后期优化和添加各类功能json

# -*- coding:gbk -*-
import re
import requests
import json
from lxml import html
#测试微博4054483400791767
comments=[]

def get_page(weibo_id):
    url='https://m.weibo.cn/status/{}'.format(weibo_id)
    html=requests.get(url).text
    regcount=r'"comments_count": (.*?),'
    comments_count=re.findall(regcount,html)[-1]
    comments_count_number=int(comments_count)
    page=int(comments_count_number/10)
    return page-1

def opt_comment(comment):
    tree=html.fromstring(comment)
    strcom=tree.xpath('string(.)')
    reg1=r'回复@.*?:'
    reg2=r'回覆@.*?:'
    reg3=r'//@.*'
    newstr=''
    comment1=re.subn(reg1,newstr,strcom)[0]
    comment2=re.subn(reg2,newstr,comment1)[0]
    comment3=re.subn(reg3,newstr,comment2)[0]
    return comment3

def get_responses(id,page):
    url="https://m.weibo.cn/api/comments/show?id={}&page={}".format(id,page)
    response=requests.get(url)
    return response

def get_weibo_comments(response):
    json_response=json.loads(response.text)
    for i in range(0,len(json_response['data'])):
        comment=opt_comment(json_response['data'][i]['text'])
        comments.append(comment)


weibo_id=input("输入微博id,自动返回前5页评论:")
weibo_id=int(weibo_id)
print('\n')
page=get_page(weibo_id)
for page in range(1,page+1):
    response=get_responses(weibo_id,page)
    get_weibo_comments(response)

for com in comments:
    print(com)
print(len(comments))