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

系统 153 0

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

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

[Python3爬虫]爬取新浪微博用户信息及微博内容_第1张图片

目标

爬取新浪微博用户数据,包括以下字段:id,昵称,粉丝数,关注数,微博数,每一篇微博的内容,转发数,评论数,点赞数,发布时间,来源,以及是原创还是转发。(本文以GUCCI(古驰)为例)

方法

  • 使用selenium模拟爬虫
  • 使用BeautifulSoup解析HTML

结果展示

[Python3爬虫]爬取新浪微博用户信息及微博内容_第2张图片

步骤分解

1.选取爬取目标网址
首先,在准备开始爬虫之前,得想好要爬取哪个网址。新浪微博的网址分为网页端和手机端两个,大部分爬取微博数据都会选择爬取手机端,因为对比起来,手机端基本上包括了所有你要的数据,并且手机端相对于PC端是轻量级的。
下面是GUCCI的手机端和PC端的网页展示。
[Python3爬虫]爬取新浪微博用户信息及微博内容_第3张图片
[Python3爬虫]爬取新浪微博用户信息及微博内容_第4张图片

2.模拟登陆
定好爬取微博手机端数据之后,接下来就该模拟登陆了。
模拟登陆的网址
登陆的网页下面的样子
[Python3爬虫]爬取新浪微博用户信息及微博内容_第5张图片
模拟登陆代码

            
                  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('完成登陆!')

            
          

[Python3爬虫]爬取新浪微博用户信息及微博内容_第6张图片

3.获取用户微博页码
在登录之后可以进入想要爬取的商户信息,因为每个商户的微博量不一样,因此对应的微博页码也不一样,这里首先将商户的微博页码爬下来。与此同时,将那些公用信息爬取下来,比如用户uid,用户名称,微博数量,关注人数,粉丝数目。
[Python3爬虫]爬取新浪微博用户信息及微博内容_第7张图片

            
              	#本文是以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
最后的结果显示在上面展示啦!!!!
到这里完整的微博爬虫就解决啦!!!


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请请扫描上面二维码支持博主1元、2元、5元等您想捐的金额吧,狠狠点击下面给点支持吧

发表我的评论
最新评论 总共0条评论