[Python3爬虫]爬取新浪微博用户信息及微博内容

[Python3爬虫]爬取新浪微博用户信息及微博内容

### [Python3爬虫]爬取新浪微博用户信息及微博内容
大数据时代,对于研究领域来说,数据已经成为必不可少的一部分。新浪微博作为新时代火爆的新媒体社交平台,拥有许多用户行为及商户数据,因此需要研究人员都想要得到新浪微博数据,But新浪微博数据量极大,获取的最好方法无疑就是使用Python爬虫来得到。网上有一些关于使用Python爬虫来爬取新浪微博数据的教程,但是完整的介绍以及爬取用户所有数据信息比较少,因此这里分享一篇主要通过selenium包来爬取新浪微博用户数据的文章。


##目标
爬取新浪微博用户数据,包括以下字段:id,昵称,粉丝数,关注数,微博数,每一篇微博的内容,转发数,评论数,点赞数,发布时间,来源,以及是原创还是转发。(本文以GUCCI(古驰)为例)
##方法
+使用selenium模拟爬虫
+使用BeautifulSoup解析HTML
##结果展示

##步骤分解
###1.选取爬取目标网址
首先,在准备开始爬虫之前,得想好要爬取哪个网址。新浪微博的网址分为网页端和手机端两个,大部分爬取微博数据都会选择爬取手机端,因为对比起来,手机端基本上包括了所有你要的数据,并且手机端相对于PC端是轻量级的。
下面是GUCCI的手机端和PC端的网页展示。
微博手机端
微博PC端

###2.模拟登陆
定好爬取微博手机端数据之后,接下来就该模拟登陆了。
模拟登陆的网址
登陆的网页下面的样子
模拟登陆网页
模拟登陆代码

    try:
   		print(u'登陆新浪微博手机端...')
   		##打开Firefox浏览器
    	browser = webdriver.Firefox()
    	##给定登陆的网址
        url = 'https://passport.weibo.cn/signin/login'
        browser.get(url)
        time.sleep(3)
        #找到输入用户名的地方,并将用户名里面的内容清空,然后送入你的账号
        username = browser.find_element_by_css_selector('#loginName')
        time.sleep(2)
        username.clear()
        username.send_keys('****')#输入自己的账号
        #找到输入密码的地方,然后送入你的密码
        password = browser.find_element_by_css_selector('#loginPassword')
        time.sleep(2)
        password.send_keys('ll117117')
        #点击登录
        browser.find_element_by_css_selector('#loginAction').click()
        ##这里给个15秒非常重要,因为在点击登录之后,新浪微博会有个九宫格验证码,下图有,通过程序执行的话会有点麻烦(可以参考崔庆才的Python书里面有解决方法),这里就手动
        time.sleep(15)
    except:
        print('########出现Error########')
    finally:
        print('完成登陆!')

类似这样的九宫格验证

###3.获取用户微博页码
在登录之后可以进入想要爬取的商户信息,因为每个商户的微博量不一样,因此对应的微博页码也不一样,这里首先将商户的微博页码爬下来。与此同时,将那些公用信息爬取下来,比如用户uid,用户名称,微博数量,关注人数,粉丝数目。
这里最大页码为361

	#本文是以GUCCI为例,GUCCI的用户id为‘GUCCI’
	id = 'GUCCI'
    niCheng = id
    #用户的url结构为 url = 'http://weibo.cn/' + id
    url = 'http://weibo.cn/' + id
    browser.get(url)
    time.sleep(3)
    #使用BeautifulSoup解析网页的HTML
    soup = BeautifulSoup(browser.page_source, 'lxml')
    #爬取商户的uid信息
    uid = soup.find('td',attrs={'valign':'top'})
    uid = uid.a['href']
    uid = uid.split('/')[1]
    #爬取最大页码数目
    pageSize = soup.find('div', attrs={'id': 'pagelist'})
    pageSize = pageSize.find('div').getText()
    pageSize = (pageSize.split('/')[1]).split('页')[0]
    #爬取微博数量
    divMessage = soup.find('div',attrs={'class':'tip2'})
    weiBoCount = divMessage.find('span').getText()
    weiBoCount = (weiBoCount.split('[')[1]).replace(']','')
     #爬取关注数量和粉丝数量
    a = divMessage.find_all('a')[:2]
    guanZhuCount = (a[0].getText().split('[')[1]).replace(']','')
    fenSiCount = (a[1].getText().split('[')[1]).replace(']', '')

###4.根据爬取的最大页码,循环爬取所有数据
在得到最大页码之后,直接通过循环来爬取每一页数据。抓取的数据包括,微博内容,转发数量,评论数量,点赞数量,发微博的时间,微博来源,以及是原创还是转发。

#通过循环来抓取每一页数据
 for i in range(1, pageSize+1):  # pageSize+1
 		#每一页数据的url结构为 url = 'http://weibo.cn/' + id + ‘?page=’ + i
        url = 'https://weibo.cn/GUCCI?page=' + str(i)
        browser.get(url)
        time.sleep(1)
        #使用BeautifulSoup解析网页的HTML
        soup = BeautifulSoup(browser.page_source, 'lxml')
        body = soup.find('body')
        divss = body.find_all('div', attrs={'class': 'c'})[1:-2]
        for divs in divss:
            # yuanChuang : 0表示转发,1表示原创
            yuanChuang = '1'#初始值为原创,当非原创时,更改此值
            div = divs.find_all('div')
            #这里有三种情况,两种为原创,一种为转发
            if (len(div) == 2):#原创,有图
           		 #爬取微博内容
                content = div[0].find('span', attrs={'class': 'ctt'}).getText()
                aa = div[1].find_all('a')
                for a in aa:
                    text = a.getText()
                    if (('赞' in text) or ('转发' in text) or ('评论' in text)):
                    	#爬取点赞数
                        if ('赞' in text):
                            dianZan = (text.split('[')[1]).replace(']', '')
                        #爬取转发数
                        elif ('转发' in text):
                            zhuanFa = (text.split('[')[1]).replace(']', '')
                         #爬取评论数目
                        elif ('评论' in text):
                            pinLun = (text.split('[')[1]).replace(']', '')    
                 #爬取微博来源和时间   
                span = divs.find('span', attrs={'class': 'ct'}).getText()
                faBuTime = str(span.split('来自')[0])
                laiYuan = span.split('来自')[1]

			#和上面一样
            elif (len(div) == 1):#原创,无图
                content = div[0].find('span', attrs={'class': 'ctt'}).getText()
                aa = div[0].find_all('a')
                for a in aa:
                    text = a.getText()
                    if (('赞' in text) or ('转发' in text) or ('评论' in text)):
                        if ('赞' in text):
                            dianZan = (text.split('[')[1]).replace(']', '')
                        elif ('转发' in text):
                            zhuanFa = (text.split('[')[1]).replace(']', '')
                        elif ('评论' in text):
                            pinLun = (text.split('[')[1]).replace(']', '')
                span = divs.find('span', attrs={'class': 'ct'}).getText()
                faBuTime = str(span.split('来自')[0])
                laiYuan = span.split('来自')[1]
				
			#这里为转发,其他和上面一样
            elif (len(div) == 3):#转发的微博
                yuanChuang = '0'
                content = div[0].find('span', attrs={'class': 'ctt'}).getText()
                aa = div[2].find_all('a')
                for a in aa:
                    text = a.getText()
                    if (('赞' in text) or ('转发' in text) or ('评论' in text)):
                        if ('赞' in text):
                            dianZan = (text.split('[')[1]).replace(']', '')
                        elif ('转发' in text):
                            zhuanFa = (text.split('[')[1]).replace(']', '')
                        elif ('评论' in text):
                            pinLun = (text.split('[')[1]).replace(']', '')
                span = divs.find('span', attrs={'class': 'ct'}).getText()
                faBuTime = str(span.split('来自')[0])
                laiYuan = span.split('来自')[1]
        time.sleep(2)
        print(i)

###4.在得到所有数据之后,可以写到csv文件,或者excel
最后的结果显示在上面展示啦!!!!
到这里完整的微博爬虫就解决啦!!!

欢迎关注微信公众号:516数据工作室
516数据工作室

猜你喜欢

转载自blog.csdn.net/Asher117/article/details/82793091
今日推荐