天天看点

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

在进行自然语言处理、文本分类聚类、推荐系统、舆情分析等研究中,通常需要使用新浪微博的数据作为语料,这篇文章主要介绍如果使用python和selenium爬取自定义新浪微博语料。因为网上完整的语料比较少,而使用selenium方法有点简单、速度也比较慢,但方法可行,同时能够输入验证码。希望文章对你有所帮助~

爬取结果

首先可以爬取用户id、用户名、微博数、粉丝数、关注数及微博信息。其中微博信息包括转发或原创、点赞数、转发数、评论数、发布时间、微博内容等等。如下图所示:

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

同时也可以爬取微博的众多用户的详细信息,包括基本信息、关注人id列表和粉丝id列表等等。如下图所示:

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

登录入口

其原因是手机端数据相对更轻量型,同时基本数据都齐全,可能缺少些个人基本信息,如"个人资料完成度"、"个人等级"等,同时粉丝id和关注id只能显示20页,但完全可以作为语料进行大部分的验证。

通过比较下面两张图,分别是pc端和手机端,可以发现内容基本一致:

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

手机端下图所示,其中图片相对更小,同时内容更精简。

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

完整源码

下面代码主要分为三部分:

1.loginweibo(username, password) 登录微博

2.visitpersonpage(user_id) 访问跟人网站,获取个人信息

3.获取微博内容,同时http://weibo.cn/guangxianliuyan?filter=0&page=1实现翻页

ps:发现csdn编辑器的bug,只要包含( 

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

) 如:r'\[(.*?)\]'就会自动换行 (⊙o⊙)

登录页面

首先,为什么需要登录呢?

因为新浪微博很多数据如果不登录是不能获取或访问的,如微博的粉丝列表、个人详细信息、微博下一页等等,当你点击这些超链接时就会自动跳转到登录界面,这是开发者对其进行的保护措施。同时,各个公司都会提供api接口让开发者进行操作,但此处我是使用selenium模拟浏览器操作进行爬取的。

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

其中登录如上图所示,函数loginweibo(username, password) 实现,它会自动打开浏览器并输入用户名和密码。在登录过程中由于会涉及到验证码,所以我采用暂停20秒,当用户手动输入验证码并且时间到后会自动点击按钮登录。核心代码如下:

driver.get("http://login.weibo.cn/login/")

elem_user = driver.find_element_by_name("mobile")

elem_user.send_keys(username)      #用户名

elem_pwd = driver.find_element_by_xpath("/html/body/div[2]/form/div/input[2]")

elem_pwd.send_keys(password)       #密码

elem_sub = driver.find_element_by_name("submit")

elem_sub.click()              #点击登陆

如果你登陆过程中python报错:

webdriverexception: message: "can't load the profile. profile dir:

猜测是firefox版本问题,升级后出现的该问题,建议下载相对较老的版本,总体感觉只要selenium、python、firefox版本一致就不会报错,可从下面链接中安装该版本firefox。

那么,登录成功后,为什么就能访问或跳转到不同的页面呢?

因为登录成功后会保存cookies或session信息,此时用户就可以任意跳转访问了,否则会重新跳转会登录界面。这里使用selenium的driver.get(url)实现跳转。

获取个人信息

故定义一个txt文件列表包含,所有用户id信息,依次通过读取文件爬取其微博信息:

user_id = inforead.readline()

while user_id!="":

    user_id = user_id.rstrip('\r\n')

    visitpersonpage(user_id)         #访问个人页面

    user_id = inforead.readline()

其中用户id列表在sinaweibo_list.txt 中,如下所示:(明星)

通过分析html源码,获取节点位置,通过selenium函数定义位置获取信息,然后再通过正则表达式或字符串处理获取想要的值。如获取昵称:

str_name = driver.find_element_by_xpath("//div[@class='ut']")

#空格分隔 获取第一个值 "eastmount 详细资料 设置 新手区"

str_t = str_name.text.split(" ")

num_name = str_t[0]     

print u'昵称: ' + num_name

再如括号之间数字内容:

#微博[294] 关注[351] 粉丝[294] 分组[1] @他的 

str_gz = driver.find_element_by_xpath("//div[@class='tip2']/a[1]")

guid = re.findall(pattern, str_gz.text, re.m)

num_gz = int(guid[0])

print u'关注数: ' + str(num_gz)

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

资料url:http://weibo.cn/1644461042/info

关注url:http://weibo.cn/1644461042/follow

粉丝url:http://weibo.cn/1644461042/fans

但是手机端只能显示20页粉丝列表和关注列表。

点击"资料"可以获取个人详细信息、点击"关注[516]"可以获取关注列表,如果需要建立不同用户之间的关注网,个人建议通过关注表而不是粉丝表,因为关注表覆盖明星更大,而粉丝太多,构建的图太稀疏。个人信息如下图所示:

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

获取微博

微博url:http://weibo.cn/guangxianliuyan?filter=0&page=1

通过分析如下url链接,可以发现page=n 表示访问第n页微博,从而实现跳转。filter=1表示原创,可以分析它对应的开头几个类型。再通过函数获取内容:

info = driver.find_elements_by_xpath("//div[@class='c']")

然后如果发布的微博以"转发了..."开头表示转发的微博,否则为原创微博,代码:

info.startswith(u'转发')

同时获取微博点赞数、转发数、时间等,其中因为转发会包括点赞数,故获取最后一个"赞[xxx]",然后通过正则表达式i获取括号之间内容。

str1 = info.split(u" 赞")[-1]

if str1: 

   val1 = re.match(

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

, str1).groups()[0]

   print u'点赞数: ' + val1

   infofile.write(u'点赞数: ' + str(val1) + '\r\n')

微博都是以class='c'节点,故获取是有这类值,再进行字符串处理即可。

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

ps:最后希望文章对你有所帮助!其实方法很简单,希望你能理解这种思想,如何分析html源码及dom树结构,然后动态获取自己需要的信息。