51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2806|回复: 2
打印 上一主题 下一主题

[资料] 【干货】使用python和Selenium爬取新浪微博信息(上篇)

[复制链接]
  • TA的每日心情
    无聊
    2022-8-5 09:01
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2018-10-23 11:32:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 阿蛮的开心姐 于 2018-10-24 15:08 编辑

    相关作品链接:点击链接

    新浪微博现在是各个行业语料库中一个很重要的获取点,这篇文章就给大家介绍一种使用Python和Selenium爬取自定义的新浪微博语料。这种方式使用方法简单,但是速度比较慢,希望可以对你有所帮助。


    (1)Login Weibo 登陆微博
    登陆微博是因为,新浪微博很多数据如果没有登录是不能获取或者访问的,当点击下一页、个人详细信息等的超链接就会跳转到登录界面,这也是开发者对平台的保护措施。但是同时,每个公司都会提供API接口让开发者进行操作,但是本次我们操作是使用selenium模拟浏览器进行爬取的。
    函数login weibo(username, password) 实现,随后就会自动打开浏览器并且输入用户名和密码,同时在登录的过程中会涉及到验证码,所以建议大家暂停十五秒到二十秒,手动输入验证码后等时间到了就会自动点击登录。这一步的核心代码如下:
    driver.get("http://login.weibo.cn/login/")
    elem_user = driver.find_element_by_name("mobile")
    elem_user.send_keys(username)      #用户名
    elem_pwd = driver.find_element_by_xpath("/html/body/div[2]/form/div/input[2]")
    elem_pwd.send_keys(password)       #密码
    elem_sub = driver.find_element_by_name("submit")
    elem_sub.click()              #点击登陆

    登陆过程中也可称出现报错:WebDriverException: Message: "Can't load the profile. Profile Dir:
    这个可能是使用的Selenium、Python、Firefox版本不一致导致的。

    登录成功后会保存Cookies或Session信息,这时候就可以跳转访问了,否则就会出现重新跳转会登录界面。这里使用Selenium的driver.get(url)实现跳转。
    完整源码

    (2)VisitPersonPage(user_id) 访问跟人网站,获取个人信息
    很多网站设计都是 URL+用户名ID的访问链接,比如新浪微博中柳岩的链接:
    http://weibo.cn/guangxianliuyan
    所以我们定义一个TXT文件列表包含所有用户的ID信息,然后依次通过读取文件来爬取信息,核心代码:
    user_id = inforead.readline()
    while user_id!="":
        user_id = user_id.rstrip('\r\n')
        VisitPersonPage(user_id)         #访问个人页面
    user_id = inforead.readline()

    这样其中的用户ID列表就会在我们定义的SinaWeibo_List.txt 中了,效果如图:
    我们可以通过分析HTML源码,获取节点位置,然后通过Selenium函数定义位置获取信息,最后再通过正则表达式或字符串处理获取我们想要的值。
    如获取昵称:
    str_name = driver.find_element_by_xpath("//div[@class='ut']")
    #空格分隔 获取第一个值 "Eastmount 详细资料 设置 新手区"
    str_t = str_name.text.split(" ")
    num_name = str_t[0]     
    print u'昵称: ' + num_name
    再如括号之间数字内容:
    #微博[294] 关注[351] 粉丝[294] 分组[1] @他的
    str_gz = driver.find_element_by_xpath("//div[@class='tip2']/a[1]")
    guid = re.findall(pattern, str_gz.text, re.M)
    num_gz = int(guid[0])
    print u'关注数: ' + str(num_gz)





    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2022-8-5 09:01
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]测试小兵

    2#
     楼主| 发表于 2018-10-23 11:34:42 | 只看该作者
    本帖最后由 阿蛮的开心姐 于 2018-10-23 11:39 编辑



    之后我们点击"关注[516]"就可以获取关注列表,这里我们是需要爬取明星的资料,所以选择关注表而不是粉丝表,粉丝表信息太多不利于我们构建的关系网,而关注表就不一样了,关注表中覆盖的明星信息更多。

    (3)获取微博内容,同时http://weibo.cn/guangxianliuyan?filter=0&page=1实现翻页
    我们通过对 URL 链接的分析,可以发现 Page=n 就代表访问第n页的微博,从而实现微博的翻页跳转。
    Filter=1 时表示原创,这样我们可以分析它对应的开头的几种类型。
    我们可以通过下边的函数来获取内容:
    info = driver.find_elements_by_xpath("//div[@class='c']")
    我们可以设置,如果发布的微博以"转发了..."为开头的是转发微博,反之则是原创微博。代码:
    info.startswith(u'转发')
    我们也可以爬取微博的点转发数、点赞数等等,代码:
    str1 = info.split(u" 赞")[-1]
    if str1:
       val1 = re.match(, str1).groups()[0]
       print u'点赞数: ' + val1
       infofile.write(u'点赞数: ' + str(val1) + '\r\n')


    这样我们就可以获取了我们想要的数据,希望这篇文章可以对你有所帮助!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2022-8-5 09:01
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]测试小兵

    3#
     楼主| 发表于 2018-10-24 16:45:56 | 只看该作者
    有没有喜欢爬虫的,可以一起研究研究
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-18 02:29 , Processed in 0.068803 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表