转载自: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. 安装Ubuntu16.04失败

    原本安装的是Ubuntu14,但是在使用caffe时总是出错,所以干脆将Ubuntu从14升级到16,结果整出一堆麻烦.在解决这些麻烦的过程也学习了不少系统启动的细节.印证了那句话"如何没有 ...

  2. eclipse配置虚拟路径后,每次启动tomcat都会虚拟路径失效的问题解决

    由于,eclipse启动tomcat部署项目并不是直接把项目放到tomcat的webapps目录下的,而是从我们在eclipse配置的外部tomcat中取出二进制文件,在eclipse内部插件中作为t ...

  3. Win7如何分享局域网并设置共享文件夹账户和密码

    https://jingyan.baidu.com/article/ceb9fb10ddf6c08cad2ba017.html 在办公或者其他场所,我们需要分享自己的文件给朋友或者同事,但又不想同一局 ...

  4. Python3 的列表

    1:列表: Python的列表比C语言的数组强大的多,数组只能存放相同类型的数据,而列表则像一个大集装箱可以存放整形.浮点型.字符串.对象等 2:创建列表的方法 #创建一个普通列表 list1=[1, ...

  5. C#编写影院售票系统(A project with a higher amount of gold )

    项目需求: 影院售票系统 1.基础设施 放映厅 座位集合 2.一个海报------------>放映计划 3.售票设置----------->观影 领域模型:程序中提炼出的实体 4.从电影 ...

  6. Number()和new Number()的区别以及一种简单实现

    看MDN Beginners文档的时候注意到了这种用法 var n1 = Number(123); , 冒出的第一个疑问就是和 var n2 = new Number(123); 有什么区别呢? 首先 ...

  7. system进程占用80端口

    服务器规划:apache分配80,iis分配其他端口 理论上,只需要把iis 默认站点的80端口改成其他端口就可以了,可是发现改了apache80端口还是用不了, cmd查了下,发现system进程占 ...

  8. (1-1)SpringCloud-Eureka:服务的注册与发现

    SpringCloud Eureka是SpringCloud Netflix服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能.下面来做一个示例 ...

  9. _2_head_中标签

    创:20_3_2017修:5_4_2017 什么是title标签? --title   页面名(双) -- 整个html的页面名字,相当于一本书的书名 <title>北门吹雪</ti ...

  10. java1.8--1.8入门介绍

    在我之前的工作中,一直使用的是java6.所以即使现在java已经到了1.8,对于1.7增加的新特性我也基本没使用的.在整理一系列1.8的新特性的过程中,我也会添加上1.7增加的特性. 下面的整理可能 ...