zoukankan      html  css  js  c++  java
  • [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

    转载自: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) 获取微博信息及评论信息,获取输入框按钮进行搜索
    获取微博内容评论是注意翻页功能

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


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



    三. 登录入口


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



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





    四. 分析-登录微博LoginWeibo


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


    对应源码:

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


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


    核心代码:
            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的形式访问信息,访问页面如下图所示:


    代码如下所示:

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

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


    该部分输出如下图所示:

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



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



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


    该部分代码如下:

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

    通过访问该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树结构,然后动态获取自己需要的信息。
    关于如何动态爬取评论部分我还在研究当中,实在不行可能只能通过手机端进行爬取了。同时因为最近太忙,只能写写这种效率很低的傻瓜式爬虫,后面毕业了会深入研究爬虫知识。但至少代码能运行,可以爬取信息,当前阶段就非常不错了。不喜勿喷,加油~

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

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



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

  • 相关阅读:
    4-结对开发地铁
    第五周学习进度博客
    mybatis的使用
    从写json作业谈起
    工作中慢慢明白的道理
    从参与公司开发到离职
    这也是风云变幻的年代
    学习的习惯和方法跟得上时代要求
    公司中springcloud项目遇到的问题
    实习生在公司的成长
  • 原文地址:https://www.cnblogs.com/c-x-a/p/8448631.html
Copyright © 2011-2022 走看看