[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

时间:2023-11-11 21:48:50

转载自:http://blog.csdn.net/eastmount/article/details/51231852

一. 文章介绍

源码下载地址:http://download.csdn.net/detail/eastmount/9501273
前一篇文章"[python爬虫] Selenium爬取新浪微博内容及用户信息"简单讲述了如何爬取新浪微博手机端用户信息和微博信息。
用户信息:包括用户ID、用户名、微博数、粉丝数、关注数等。
微博信息:包括转发或原创、点赞数、转发数、评论数、发布时间、微博内容等。

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

它主要通过从文本txt中读取用户id,通过"URL+用户ID" 访问个人网站,如柳岩:
        http://weibo.cn/guangxianliuya
因为手机端数据相对精简简单,所以采用输入用户的形式依次爬取各个明星的信息。
而这篇文章主要爬取客户端的微博信息,相对信息更多;同时登录微博后在输入框中搜索热点话题,然后依次爬取微博信息和对应的评论。这篇文章的输出如下图所示:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

PS:注意这篇文章爬取微博内容和评论的时候,由于它是动态加载的,故爬取失败,但思考可以参考。后面下篇会进行解决,如果实在不行只能爬取手机端的信息了。

二. 核心代码

这篇文章打算先给出完整代码,再进行讲解的方法:
1.LoginWeibo(username, password) 登录微博,自动输入用户名和密码
2.VisitPersonPage(user_id) 访问跟人网站,获取个人信息,通过如下网址访问柳岩:
      http://weibo.cn/guangxianliuyan
3.GetComment(key) 获取微博信息及评论信息,获取输入框按钮进行搜索
获取微博内容评论是注意翻页功能

  1. # coding=utf-8
  2. """
  3. Created on 2016-04-24 @author: Eastmount
  4. 功能: 爬取新浪微博用户的信息及微博评论
  5. 网址:http://weibo.cn/ 数据量更小 相对http://weibo.com/
  6. """
  7. import time
  8. import re
  9. import os
  10. import sys
  11. import codecs
  12. import shutil
  13. import urllib
  14. from selenium import webdriver
  15. from selenium.webdriver.common.keys import Keys
  16. import selenium.webdriver.support.ui as ui
  17. from selenium.webdriver.common.action_chains import ActionChains
  18. #先调用*面浏览器PhantomJS或Firefox
  19. #driver = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")
  20. driver = webdriver.Firefox()
  21. wait = ui.WebDriverWait(driver,10)
  22. #全局变量 文件操作读写信息
  23. inforead = codecs.open("SinaWeibo_List_best_1.txt", 'r', 'utf-8')
  24. infofile = codecs.open("SinaWeibo_Info_best_1.txt", 'a', 'utf-8')
  25. #********************************************************************************
  26. #                            第一步: 登陆weibo.cn
  27. #        该方法针对weibo.cn有效(明文形式传输数据) weibo.com见学弟设置POST和Header方法
  28. #                LoginWeibo(username, password) 参数用户名 密码
  29. #********************************************************************************
  30. def LoginWeibo(username, password):
  31. try:
  32. #输入用户名/密码登录
  33. print u'准备登陆Weibo.cn网站...'
  34. driver.get("http://login.sina.com.cn/")
  35. elem_user = driver.find_element_by_name("username")
  36. elem_user.send_keys(username) #用户名
  37. elem_pwd = driver.find_element_by_name("password")
  38. elem_pwd.send_keys(password)  #密码
  39. #elem_rem = driver.find_element_by_name("safe_login")
  40. #elem_rem.click()             #安全登录
  41. #重点: 暂停时间输入验证码(http://login.weibo.cn/login/ 手机端需要)
  42. time.sleep(20)
  43. #elem_sub = driver.find_element_by_xpath("//input[@class='smb_btn']")
  44. #elem_sub.click()              #点击登陆 因无name属性
  45. #如果登陆按钮采用动态加载 则采用输入回车键登陆微博
  46. elem_pwd.send_keys(Keys.RETURN)
  47. time.sleep(2)
  48. #获取Coockie 推荐资料:http://www.cnblogs.com/fnng/p/3269450.html
  49. print driver.current_url
  50. print driver.get_cookies()  #获得cookie信息 dict存储
  51. print u'输出Cookie键值对信息:'
  52. for cookie in driver.get_cookies():
  53. #print cookie
  54. for key in cookie:
  55. print key, cookie[key]
  56. #driver.get_cookies()类型list 仅包含一个元素cookie类型dict
  57. print u'登陆成功...'
  58. except Exception,e:
  59. print "Error: ",e
  60. finally:
  61. print u'End LoginWeibo!\n\n'
  62. #********************************************************************************
  63. #                  第二步: 访问个人页面http://weibo.cn/5824697471并获取信息
  64. #                                VisitPersonPage()
  65. #        编码常见错误 UnicodeEncodeError: 'ascii' codec can't encode characters
  66. #********************************************************************************
  67. def VisitPersonPage(user_id):
  68. try:
  69. global infofile       #全局文件变量
  70. url = "http://weibo.com/" + user_id
  71. driver.get(url)
  72. print u'准备访问个人网站.....', url
  73. print u'个人详细信息'
  74. #用户id
  75. print u'用户id: ' + user_id
  76. #昵称
  77. str_name = driver.find_element_by_xpath("//div[@class='pf_username']/h1")
  78. name = str_name.text        #str_name.text是unicode编码类型
  79. print u'昵称: ', name
  80. #关注数 粉丝数 微博数 <td class='S_line1'>
  81. str_elem = driver.find_elements_by_xpath("//table[@class='tb_counter']/tbody/tr/td/a")
  82. str_gz = str_elem[0].text    #关注数
  83. num_gz = re.findall(r'(\w*[0-9]+)\w*', str_gz)
  84. str_fs = str_elem[1].text    #粉丝数
  85. num_fs = re.findall(r'(\w*[0-9]+)\w*', str_fs)
  86. str_wb = str_elem[2].text    #微博数
  87. num_wb = re.findall(r'(\w*[0-9]+)\w*', str_wb)
  88. print u'关注数: ', num_gz[0]
  89. print u'粉丝数: ', num_fs[0]
  90. print u'微博数: ', num_wb[0]
  91. #文件操作写入信息
  92. infofile.write('=====================================================================\r\n')
  93. infofile.write(u'用户: ' + user_id + '\r\n')
  94. infofile.write(u'昵称: ' + name + '\r\n')
  95. infofile.write(u'关注数: ' + str(num_gz[0]) + '\r\n')
  96. infofile.write(u'粉丝数: ' + str(num_fs[0]) + '\r\n')
  97. infofile.write(u'微博数: ' + str(num_wb[0]) + '\r\n')
  98. except Exception,e:
  99. print "Error: ",e
  100. finally:
  101. print u'VisitPersonPage!\n\n'
  102. print '**********************************************\n'
  103. infofile.write('=====================================================================\r\n\r\n')
  104. #********************************************************************************
  105. #                  第三步: 访问http://s.weibo.com/页面搜索热点信息
  106. #                  爬取微博信息及评论,注意评论翻页的效果和微博的数量
  107. #********************************************************************************
  108. def GetComment(key):
  109. try:
  110. global infofile       #全局文件变量
  111. driver.get("http://s.weibo.com/")
  112. print u'搜索热点主题:', key
  113. #输入主题并点击搜索
  114. item_inp = driver.find_element_by_xpath("//input[@class='searchInp_form']")
  115. item_inp.send_keys(key)
  116. item_inp.send_keys(Keys.RETURN)    #采用点击回车直接搜索
  117. #内容
  118. #content = driver.find_elements_by_xpath("//div[@class='content clearfix']/div/p")
  119. content = driver.find_elements_by_xpath("//p[@class='comment_txt']")
  120. print content
  121. i = 0
  122. print u'长度', len(content)
  123. while i<len(content):
  124. print '微博信息:'
  125. print content[i].text
  126. infofile.write(u'微博信息:\r\n')
  127. infofile.write(content[i].text + '\r\n')
  128. i = i + 1
  129. #评论 由于评论是动态加载,爬取失败
  130. #Error:  list index out of range
  131. comment = driver.find_elements_by_xpath("//p[@class='list_ul']/dl/dd/div[0]")
  132. j = 0
  133. while j<10:
  134. print comment[j].text
  135. j = j + 1
  136. except Exception,e:
  137. print "Error: ",e
  138. finally:
  139. print u'VisitPersonPage!\n\n'
  140. print '**********************************************\n'
  141. #*******************************************************************************
  142. #                                程序入口 预先调用
  143. #         注意: 因为sina微博增加了验证码,但是你用Firefox登陆输入验证码
  144. #         直接跳转到明星微博那部分,即: http://weibo.cn/guangxianliuyan
  145. #*******************************************************************************
  146. if __name__ == '__main__':
  147. #定义变量
  148. username = '1520161****'             #输入你的用户名
  149. password = '*********'               #输入你的密码
  150. #操作函数
  151. LoginWeibo(username, password)       #登陆微博
  152. #在if __name__ == '__main__':引用全局变量不需要定义 global inforead 省略即可
  153. print 'Read file:'
  154. user_id = inforead.readline()
  155. while user_id!="":
  156. user_id = user_id.rstrip('\r\n')
  157. print user_id
  158. VisitPersonPage(user_id)         #访问个人页面http://weibo.cn/guangxianliuyan
  159. user_id = inforead.readline()
  160. #break
  161. #搜索热点微博 爬取评论
  162. key = u'欢乐颂'
  163. GetComment(key)
  164. infofile.close()
  165. inforead.close()

PS:后面是具体的实现过程分析讲解,如果你只需要代码,上面就是所有完整代码,但建议也看看后面的分析过程,虽然是傻瓜式爬虫,但至少能用,而且方法类似。

三. 登录入口

新浪微博登录常用接口:http://login.sina.com.cn/ 
对应主界面:http://weibo.com/
但是个人建议采用手机端微博入口:http://login.weibo.cn/login/  
对应主界面:http://weibo.cn/
通过比较下面两张图,分别是PC端和手机端,可以发现内容基本一致:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)
手机端下图所示,其中图片相对更小,同时内容更精简。

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

四. 分析-登录微博LoginWeibo

登录过程如下图所示,先通过函数获取用户名、密码、登录按钮结点,然后再自动输入信息并登录。如果需要输入验证码,也可以在手动输入。

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

对应源码:

  1. #********************************************************************************
  2. #                            第一步: 登陆weibo.cn
  3. #        该方法针对weibo.cn有效(明文形式传输数据) weibo.com见学弟设置POST和Header方法
  4. #                LoginWeibo(username, password) 参数用户名 密码
  5. #********************************************************************************
  6. def LoginWeibo(username, password):
  7. try:
  8. #输入用户名/密码登录
  9. print u'准备登陆Weibo.cn网站...'
  10. driver.get("http://login.sina.com.cn/")
  11. elem_user = driver.find_element_by_name("username")
  12. elem_user.send_keys(username) #用户名
  13. elem_pwd = driver.find_element_by_name("password")
  14. elem_pwd.send_keys(password)  #密码
  15. #elem_rem = driver.find_element_by_name("safe_login")
  16. #elem_rem.click()             #安全登录
  17. #重点: 暂停时间输入验证码(http://login.weibo.cn/login/ 手机端需要)
  18. time.sleep(20)
  19. elem_sub = driver.find_element_by_xpath("//input[@class='smb_btn']")
  20. elem_sub.click()              #点击登陆 因无name属性
  21. time.sleep(2)
  22. #获取Coockie 推荐资料:http://www.cnblogs.com/fnng/p/3269450.html
  23. print driver.current_url
  24. print driver.get_cookies()  #获得cookie信息 dict存储
  25. print u'输出Cookie键值对信息:'
  26. for cookie in driver.get_cookies():
  27. #print cookie
  28. for key in cookie:
  29. print key, cookie[key]
  30. #driver.get_cookies()类型list 仅包含一个元素cookie类型dict
  31. print u'登陆成功...'
  32. except Exception,e:
  33. print "Error: ",e
  34. finally:
  35. print u'End LoginWeibo!\n\n'

分析网页结点如下图所示:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

核心代码:
        elem_user = driver.find_element_by_name("username")
        elem_user.send_keys(username)     #用户名
        elem_pwd = driver.find_element_by_name("password")
        elem_pwd.send_keys(password)      #密码
        elem_sub = driver.find_element_by_xpath("//input[@class='smb_btn']")
        elem_sub.click()                               #点击登陆

登录后跳转到下面页面:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

五. 分析-爬取用户个人信息VisitPersonPage

通过URL+用户ID的形式访问信息,访问页面如下图所示:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

代码如下所示:

  1. #********************************************************************************
  2. #                  第二步: 访问个人页面http://weibo.cn/5824697471并获取信息
  3. #                                VisitPersonPage()
  4. #        编码常见错误 UnicodeEncodeError: 'ascii' codec can't encode characters
  5. #********************************************************************************
  6. def VisitPersonPage(user_id):
  7. try:
  8. global infofile       #全局文件变量
  9. url = "http://weibo.com/" + user_id
  10. driver.get(url)
  11. print u'准备访问个人网站.....', url
  12. print u'个人详细信息'
  13. #用户id
  14. print u'用户id: ' + user_id
  15. #昵称
  16. str_name = driver.find_element_by_xpath("//div[@class='pf_username']/h1")
  17. name = str_name.text        #str_name.text是unicode编码类型
  18. print u'昵称: ', name
  19. #关注数 粉丝数 微博数 <td class='S_line1'>
  20. str_elem = driver.find_elements_by_xpath("//table[@class='tb_counter']/tbody/tr/td/a")
  21. str_gz = str_elem[0].text    #关注数
  22. num_gz = re.findall(r'(\w*[0-9]+)\w*', str_gz)
  23. str_fs = str_elem[1].text    #粉丝数
  24. num_fs = re.findall(r'(\w*[0-9]+)\w*', str_fs)
  25. str_wb = str_elem[2].text    #微博数
  26. num_wb = re.findall(r'(\w*[0-9]+)\w*', str_wb)
  27. print u'关注数: ', num_gz[0]
  28. print u'粉丝数: ', num_fs[0]
  29. print u'微博数: ', num_wb[0]
  30. #文件操作写入信息
  31. infofile.write('=====================================================================\r\n')
  32. infofile.write(u'用户: ' + user_id + '\r\n')
  33. infofile.write(u'昵称: ' + name + '\r\n')
  34. infofile.write(u'关注数: ' + str(num_gz[0]) + '\r\n')
  35. infofile.write(u'粉丝数: ' + str(num_fs[0]) + '\r\n')
  36. infofile.write(u'微博数: ' + str(num_wb[0]) + '\r\n')
  37. except Exception,e:
  38. print "Error: ",e
  39. finally:
  40. print u'VisitPersonPage!\n\n'
  41. print '**********************************************\n'

其中SinaWeibo_List_best_1.txt中仅包含两个用户id的情况:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

该部分输出如下图所示:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

分析页面DOM树结构如下图所示:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

同时这里只获取简单的信息,详细信息还可以自动点击"查看更多"进行获取:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

六. 分析-爬取微博和评论信息GetComment

该部分代码如下:

  1. #********************************************************************************
  2. #                  第三步: 访问http://s.weibo.com/页面搜索热点信息
  3. #                  爬取微博信息及评论,注意评论翻页的效果和微博的数量
  4. #********************************************************************************
  5. def GetComment(key):
  6. try:
  7. global infofile       #全局文件变量
  8. driver.get("http://s.weibo.com/")
  9. print u'搜索热点主题:', key
  10. #输入主题并点击搜索
  11. item_inp = driver.find_element_by_xpath("//input[@class='searchInp_form']")
  12. item_inp.send_keys(key)
  13. item_inp.send_keys(Keys.RETURN)    #采用点击回车直接搜索
  14. #内容
  15. #content = driver.find_elements_by_xpath("//div[@class='content clearfix']/div/p")
  16. content = driver.find_elements_by_xpath("//p[@class='comment_txt']")
  17. print content
  18. i = 0
  19. print u'长度', len(content)
  20. while i<len(content):
  21. print '微博信息:'
  22. print content[i].text
  23. infofile.write(u'微博信息:\r\n')
  24. infofile.write(content[i].text + '\r\n')
  25. i = i + 1
  26. #评论 由于评论是动态加载,爬取失败
  27. #Error:  list index out of range
  28. comment = driver.find_elements_by_xpath("//p[@class='list_ul']/dl/dd/div[0]")
  29. j = 0
  30. while j<10:
  31. print comment[j].text
  32. j = j + 1
  33. except Exception,e:
  34. print "Error: ",e
  35. finally:
  36. print u'VisitPersonPage!\n\n'
  37. print '**********************************************\n'

通过访问该URL进行热点搜索:http://s.weibo.com/

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

再通过核定代码输入主题如“欢乐颂”并点击回车键,分析节点方法与前面类似:
        item_inp = driver.find_element_by_xpath("//input[@class='searchInp_form']")
        item_inp.send_keys(key)
        item_inp.send_keys(Keys.RETURN)    #采用点击回车直接搜索

自动返回搜索结果如下图所示:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

分析DOM树结构如下,右键浏览器"审查元素":

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

分析具体的信息如下所示:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

但爬取博客过程中,总显示空值,不知道为什么,怀疑是动态加载的。
content = driver.find_elements_by_xpath("//div[@class='content clearfix']/div/p")
content = driver.find_elements_by_xpath("//p[@class='comment_txt']")

评论信息需要点击"评论1897"才能进行加载:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

对应源码如下所示,它是动态进行加载的:

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

如图,审查元素点击"评论"可以发现它是通过JavaScript加载,这就比较头疼了。

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

PS:最后希望文章对你有所帮助!其实方法很简单,希望你能理解这种思想,如何分析HTML源码及DOM树结构,然后动态获取自己需要的信息。
关于如何动态爬取评论部分我还在研究当中,实在不行可能只能通过手机端进行爬取了。同时因为最近太忙,只能写写这种效率很低的傻瓜式爬虫,后面毕业了会深入研究爬虫知识。但至少代码能运行,可以爬取信息,当前阶段就非常不错了。不喜勿喷,加油~

记录一段可运行代码,帮娜姐爬取数据使用,注意需要手动填写验证码:

  1. # coding=utf-8
  2. """
  3. Created on 2016-05-23 @author: Eastmount
  4. 功能: 爬取新浪微博用户的信息
  5. 信息:用户ID 用户名 注册时间 性别 地址(城市) 是否认证 用户标签(明星、搞笑等信息)
  6. 个人资料完成度 粉丝数 关注数 微博数 粉丝ID列表 关注人ID列表 特别关注列表
  7. 网址:http://weibo.cn/ 数据量更小 相对http://weibo.com/
  8. """
  9. import time
  10. import re
  11. import os
  12. import sys
  13. import codecs
  14. import shutil
  15. import urllib
  16. from selenium import webdriver
  17. from selenium.webdriver.common.keys import Keys
  18. import selenium.webdriver.support.ui as ui
  19. from selenium.webdriver.common.action_chains import ActionChains
  20. '''''
  21. 版本过低
  22. pip install -U selenium
  23. WebDriverException: Message: Can't load the profile.
  24. Profile Dir: %s If you specified a log_file in the FirefoxBinary constructor,
  25. check it for details.
  26. '''
  27. #先调用*面浏览器PhantomJS或Firefox
  28. #driver = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")
  29. driver = webdriver.Firefox()
  30. #options = webdriver.ChromeOptions()
  31. #options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors"])
  32. #driver = webdriver.Chrome(chrome_options=options)
  33. wait = ui.WebDriverWait(driver,10)
  34. #全局变量 文件操作读写信息
  35. inforead = codecs.open("SinaWeibo_List_best_1.txt", 'r', 'utf-8')
  36. infofile = codecs.open("SinaWeibo_Info_best_1.txt", 'a', 'utf-8')
  37. #********************************************************************************
  38. #                  第一步: 登陆weibo.cn 获取新浪微博的cookie
  39. #        该方法针对weibo.cn有效(明文形式传输数据) weibo.com见学弟设置POST和Header方法
  40. #                LoginWeibo(username, password) 参数用户名 密码
  41. #        https://www.zhihu.com/question/21451510
  42. #        http://www.cnblogs.com/fnng/p/3606934.html
  43. #                             验证码暂停时间手动输入
  44. #********************************************************************************
  45. def LoginWeibo(username, password):
  46. try:
  47. #**********************************************************************
  48. # 直接访问driver.get("http://weibo.cn/5824697471")会跳转到登陆页面 用户id
  49. #
  50. # 用户名<input name="mobile" size="30" value="" type="text"></input>
  51. # 密码 "password_4903" 中数字会变动,故采用绝对路径方法,否则不能定位到元素
  52. #
  53. # 勾选记住登录状态check默认是保留 故注释掉该代码 不保留Cookie 则'expiry'=None
  54. #**********************************************************************
  55. #输入用户名/密码登录
  56. print u'准备登陆Weibo.cn网站...'
  57. driver.get("http://login.weibo.cn/login/")
  58. elem_user = driver.find_element_by_name("mobile")
  59. elem_user.send_keys(username) #用户名
  60. elem_pwd = driver.find_element_by_xpath("/html/body/div[2]/form/div/input[2]")
  61. elem_pwd.send_keys(password)  #密码
  62. #elem_rem = driver.find_element_by_name("remember")
  63. #elem_rem.click()             #记住登录状态
  64. #重点: 暂停时间输入验证码
  65. #pause(millisenconds)
  66. time.sleep(20)
  67. elem_sub = driver.find_element_by_name("submit")
  68. elem_sub.click()              #点击登陆
  69. time.sleep(2)
  70. #获取Coockie 推荐 http://www.cnblogs.com/fnng/p/3269450.html
  71. print driver.current_url
  72. print driver.get_cookies()  #获得cookie信息 dict存储
  73. print u'输出Cookie键值对信息:'
  74. for cookie in driver.get_cookies():
  75. #print cookie
  76. for key in cookie:
  77. print key, cookie[key]
  78. #driver.get_cookies()类型list 仅包含一个元素cookie类型dict
  79. print u'登陆成功...'
  80. except Exception,e:
  81. print "Error: ",e
  82. finally:
  83. print u'End LoginWeibo!\n\n'
  84. #********************************************************************************
  85. #                  第二步: 访问个人页面http://weibo.cn/5824697471并获取信息
  86. #                                VisitPersonPage()
  87. #        编码常见错误 UnicodeEncodeError: 'ascii' codec can't encode characters
  88. #********************************************************************************
  89. def VisitPersonPage(user_id):
  90. try:
  91. global infofile
  92. print u'准备访问个人网站.....'
  93. #原创内容 http://weibo.cn/guangxianliuyan?filter=1&page=2
  94. driver.get("http://weibo.cn/" + user_id)
  95. #**************************************************************************
  96. # No.1 直接获取 用户昵称 微博数 关注数 粉丝数
  97. #      str_name.text是unicode编码类型
  98. #**************************************************************************
  99. #用户id
  100. print u'个人详细信息'
  101. print '**********************************************'
  102. print u'用户id: ' + user_id
  103. #昵称
  104. str_name = driver.find_element_by_xpath("//div[@class='ut']")
  105. str_t = str_name.text.split(" ")
  106. num_name = str_t[0]      #空格分隔 获取第一个值 "Eastmount 详细资料 设置 新手区"
  107. print u'昵称: ' + num_name
  108. #微博数 除个人主页 它默认直接显示微博数 无超链接
  109. #Error:  'unicode' object is not callable
  110. #一般是把字符串当做函数使用了 str定义成字符串 而str()函数再次使用时报错
  111. str_wb = driver.find_element_by_xpath("//div[@class='tip2']")
  112. pattern = r"\d+\.?\d*"   #正则提取"微博[0]" 但r"(\[.*?\])"总含[]
  113. guid = re.findall(pattern, str_wb.text, re.S|re.M)
  114. print str_wb.text        #微博[294] 关注[351] 粉丝[294] 分组[1] @他的
  115. for value in guid:
  116. num_wb = int(value)
  117. break
  118. print u'微博数: ' + str(num_wb)
  119. #关注数
  120. str_gz = driver.find_element_by_xpath("//div[@class='tip2']/a[1]")
  121. guid = re.findall(pattern, str_gz.text, re.M)
  122. num_gz = int(guid[0])
  123. print u'关注数: ' + str(num_gz)
  124. #粉丝数
  125. str_fs = driver.find_element_by_xpath("//div[@class='tip2']/a[2]")
  126. guid = re.findall(pattern, str_fs.text, re.M)
  127. num_fs = int(guid[0])
  128. print u'粉丝数: ' + str(num_fs)
  129. #页数
  130. str_page = driver.find_element_by_xpath("//div[@id='pagelist']")
  131. guid = re.findall(pattern, str_page.text, re.M)
  132. numPage = int(guid[1])
  133. print u'页数: ', str_page.text, numPage
  134. #***************************************************************************
  135. # No.2 文件操作写入信息
  136. #***************************************************************************
  137. infofile.write('=====================================================================\r\n')
  138. infofile.write(u'用户: ' + user_id + '\r\n')
  139. infofile.write(u'昵称: ' + num_name + '\r\n')
  140. infofile.write(u'微博数: ' + str(num_wb) + '\r\n')
  141. infofile.write(u'关注数: ' + str(num_gz) + '\r\n')
  142. infofile.write(u'粉丝数: ' + str(num_fs) + '\r\n')
  143. infofile.write(u'微博内容: ' + '\r\n\r\n')
  144. #***************************************************************************
  145. # No.3 获取关注人列表
  146. # http://weibo.cn/guangxianliuyan?filter=0&page=1
  147. # 其中filter=0表示全部 =1表示原创
  148. #***************************************************************************
  149. print '\n'
  150. print u'获取微博内容信息'
  151. num = 1
  152. #num = numPage
  153. while num <= 5:
  154. url_wb = "http://weibo.cn/" + user_id + "?filter=0&page=" + str(num)
  155. print url_wb
  156. driver.get(url_wb)
  157. #info = driver.find_element_by_xpath("//div[@id='M_DiKNB0gSk']/")
  158. info = driver.find_elements_by_xpath("//div[@class='c']")
  159. for value in info:
  160. print value.text
  161. info = value.text
  162. #跳过最后一行数据为class=c
  163. #Error:  'NoneType' object has no attribute 'groups'
  164. if u'设置:皮肤.图片' not in info:
  165. if info.startswith(u'转发'):
  166. print u'转发微博'
  167. infofile.write(u'转发微博\r\n')
  168. else:
  169. print u'原创微博'
  170. infofile.write(u'原创微博\r\n')
  171. #获取最后一个点赞数 因为转发是后有个点赞数
  172. str1 = info.split(u" 赞")[-1]
  173. if str1:
  174. val1 = re.match(r'\[(.*?)\]', str1).groups()[0]
  175. print u'点赞数: ' + val1
  176. infofile.write(u'点赞数: ' + str(val1) + '\r\n')
  177. str2 = info.split(u" 转发")[-1]
  178. if str2:
  179. val2 = re.match(r'\[(.*?)\]', str2).groups()[0]
  180. print u'转发数: ' + val2
  181. infofile.write(u'转发数: ' + str(val2) + '\r\n')
  182. str3 = info.split(u" 评论")[-1]
  183. if str3:
  184. val3 = re.match(r'\[(.*?)\]', str3).groups()[0]
  185. print u'评论数: ' + val3
  186. infofile.write(u'评论数: ' + str(val3) + '\r\n')
  187. str4 = info.split(u" 收藏 ")[-1]
  188. flag = str4.find(u"来自")
  189. print u'时间: ' + str4[:flag]
  190. infofile.write(u'时间: ' + str4[:flag] + '\r\n')
  191. print u'微博内容:'
  192. print info[:info.rindex(u" 赞")]  #后去最后一个赞位置
  193. infofile.write(info[:info.rindex(u" 赞")] + '\r\n')
  194. infofile.write('\r\n')
  195. print '\n'
  196. else:
  197. print u'跳过', info, '\n'
  198. break
  199. else:
  200. print u'next page...\n'
  201. infofile.write('\r\n\r\n')
  202. num += 1
  203. print '\n\n'
  204. print '**********************************************'
  205. except Exception,e:
  206. print "Error: ",e
  207. finally:
  208. print u'VisitPersonPage!\n\n'
  209. print '**********************************************\n'
  210. #*******************************************************************************
  211. #                                程序入口 预先调用
  212. #*******************************************************************************
  213. if __name__ == '__main__':
  214. #定义变量
  215. username = '15201615157'             #输入你的用户名
  216. password = '013579yxz'               #输入你的密码
  217. #user_id = '2778357077'              #用户id url+id访问个人
  218. #user_id = 'renzhiqiang'
  219. #user_id = 'guangxianliuyan'
  220. #'renzhiqiang' 任志强
  221. #username = '1685256697@qq.com'
  222. #password = '1.74.109.1.440'
  223. #操作函数
  224. LoginWeibo(username, password)      #登陆微博
  225. #driver.add_cookie({'name':'name', 'value':'_T_WM'})
  226. #driver.add_cookie({'name':'value', 'value':'c86fbdcd26505c256a1504b9273df8ba'})
  227. #注意
  228. #因为sina微博增加了验证码,但是你用Firefox登陆一次输入验证码,再调用该程序即可,因为Cookies已经保证
  229. #会直接跳转到明星微博那部分,即: http://weibo.cn/guangxianliuyan
  230. #在if __name__ == '__main__':引用全局变量不需要定义 global inforead 省略即可
  231. print 'Read file:'
  232. user_id = inforead.readline()
  233. while user_id!="":
  234. user_id = user_id.rstrip('\r\n')
  235. VisitPersonPage(user_id)         #访问个人页面
  236. user_id = inforead.readline()
  237. #break
  238. infofile.close()
  239. inforead.close()

(By:Eastmount 2016-04-24 早上7点半  http://blog.csdn.net/eastmount/ )