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

一. 文章介绍

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

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

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端和手机端,可以发现内容基本一致:

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

四. 分析-登录微博LoginWeibo

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

对应源码:

  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'

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

核心代码:
        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()                               #点击登陆

登录后跳转到下面页面:

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

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

代码如下所示:

  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的情况:

该部分输出如下图所示:

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

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

六. 分析-爬取微博和评论信息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/

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

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

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

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

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

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

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



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

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/ )

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

  1. 【Python项目】爬取新浪微博个人用户信息页

    微博用户信息爬虫 项目链接:https://github.com/RealIvyWong/WeiboCrawler/tree/master/WeiboUserInfoCrawler 1 实现功能 这个 ...

  2. Python爬虫项目--爬取自如网房源信息

    本次爬取自如网房源信息所用到的知识点: 1. requests get请求 2. lxml解析html 3. Xpath 4. MongoDB存储 正文 1.分析目标站点 1. url: http:/ ...

  3. 21天打造分布式爬虫-Selenium爬取拉钩职位信息(六)

    6.1.爬取第一页的职位信息 第一页职位信息 from selenium import webdriver from lxml import etree import re import time c ...

  4. Python爬虫项目--爬取某宝男装信息

    本次爬取用到的知识点有: 1. selenium 2. pymysql 3  pyquery 正文 1. 分析目标网站 1. 打开某宝首页, 输入"男装"后点击"搜索&q ...

  5. Python爬虫之爬取慕课网课程评分

    BS是什么? BeautifulSoup是一个基于标签的文本解析工具.可以根据标签提取想要的内容,很适合处理html和xml这类语言文本.如果你希望了解更多关于BS的介绍和用法,请看Beautiful ...

  6. from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)

    使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...

  7. python爬虫实战---爬取大众点评评论

    python爬虫实战—爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...

  8. Python爬虫之爬取淘女郎照片示例详解

    这篇文章主要介绍了Python爬虫之爬取淘女郎照片示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 本篇目标 抓取淘宝MM ...

  9. 初次尝试python爬虫,爬取小说网站的小说。

    本次是小阿鹏,第一次通过python爬虫去爬一个小说网站的小说. 下面直接上菜. 1.首先我需要导入相应的包,这里我采用了第三方模块的架包,requests.requests是python实现的简单易 ...

随机推荐

  1. 初窥React Native

    这两天在学习react native,被虐得布耀布耀的,运行一个hello world花了一天时间(手动捂脸). 由于是跟着官网走,所以一开始便是开发环境的搭建.其他的就不说了(详情见 React N ...

  2. 详解String类中的intern()方法

    我们用一个经典的例子来理解 package com.jvm.heap; public class MyTest { public static void main(String[] args) { S ...

  3. Union用法及说明:

    Union是用户合并多个select结果集的操作符,需要注意的是:select语句需要有相同的列数,类似的数据类型,且列的顺序相同,另外,UNION 结果集中的列名总是等于 UNION 中第一个 SE ...

  4. 如何制作gif图片

    制作Gif图片的方法很多,大多数情况下都会选择利用PS中的ImageReady插件来制作.其实还有其它更好的选择来制作Gift图片,其中一款软件就是利用Flash来实现.下面小编就给大家展示一下如何利 ...

  5. @synchronized(self)

    @synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改.这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其 它线程访问,起到线程的保护 ...

  6. Java XML 序列化和反序列化

    Utils 类: import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWr ...

  7. hive(II)--sql考查的高频问题

    在了解别人hive能力水平的时候,不管是别人问我还是我了解别人,有一些都是必然会问的东西.问的问题也大都大同小异.这里总结一下我遇到的那些hive方面面试可能涉及的问题 1.行转列(列转行) 当我们建 ...

  8. linux 从softnet_stat查看内核丢包信息

    1.从系统整体来考虑,通过netstat 查看: [root@localhost net]# netstat -s |grep drop 3168 outgoing packets dropped 1 ...

  9. 开始学习 Backbone

    [转]开始学习 Backbone 如何将模型-视图-控制器 (MVC) 架构引入 Ajax Web 应用程序 如何高效管理 Web 应用程序中的数目众多的 JavaScript 代码行是一个挑战.As ...

  10. python生产随机数案例

    法1: list =list(string.lowercase + string.uppercase) + [str(i) for i in range(10)]FH=('!','@','#','$' ...