Python+Selenium实现微博自动化爬虫

目的:

  利用python和selenium实现自动化爬虫

所需工具:

  1、python2.7

  2、selenium库(pip install selenium或者easy_install selenium进行安装)

  3、火狐浏览器

  安装好上述工具之后就可以开始微博爬虫啦!

  首先,打开你的python编辑器(本人使用的是sublime3),设置一下编码格式如下:

# -*- coding:utf-8 -*-

  然后导入所需要的库: 

from  selenium  import  webdriver
from  selenium.webdriver.common.keys  import  Keys
from  selenium.webdriver.common.action_chains  import  ActionChains
import  time

  利用如下代码,自动打开你的火狐浏览器并跳转到微博登录首页:

driver  =  webdriver.Firefox()
time.sleep( 3 )
driver.get( "http://weibo.com" )

  其中的time.sleep是让程序等候3秒后再接着运行,为了避免因为网速的影响而导致页面信息抓取错误。运行这段代码之后,就会发现你的浏览器已经跳转到微博登录首页了,这个时候需要让浏览器实现自动点击账号登录并输入账号和密码。代码如下:

left  =  driver.find_element_by_xpath(  ".//*[@id='pl_login_form']/div[2]/div[1]/div/a[2]" )
ActionChains(driver).double_click(left).perform()
time.sleep( 3 )
# 在账号输入框输入内容
driver.find_element_by_id( "loginname" ).send_keys( "***" )   # 在*处输入账号信息
# 在密码输入框输入密码
driver.find_element_by_name( "password" ).send_keys( "***" # 在*处输入密码信息
# 向密码框发送命令,按下回车键
driver.find_element_by_name( "password" ).send_keys(Keys.ENTER)

  运行上述代码之后,就会发现你已经自动登录微博了,然后需要跳转到你所要爬取微博内容所在的页面:

# 跳转url到指定页面
driver.get( "http://weibo.com/btvertaishidai?is_search=0&visible=0&is_all=1&is_tag=0&profile_ftype=1&page=2#feedtop" )

  然后就可以开始爬取你想要的信息啦,本人所要爬取的内容有微博的粉丝数量、每条微博的内容(包括点赞数、转发数、回复数)。因为这个页面需要拖动滑动条到网页最下面才能完全显示所有信息,所以在爬取内容之前应该先将滑动条拖到最下方,代码如下:

js  =  "var q=document.documentElement.scrollTop=30000"
for  in  range ( 3 ):
     driver.execute_script(js)
     time.sleep( 1 )

  运行上面的所有代码之后,就可以开始爬取内容了。

# 获取粉丝量
L_1  =  driver.find_element_by_xpath( ".//*[@id='Pl_Core_T8CustomTriColumn__3']/div/div/div/table/tbody/tr/td[2]/strong" ).text
data_text  =  []  # 保存微博内容
data_time  =  []  # 保存发布微博的时间
data_relay  =  []  # 转发量
data_comment  =  []  # 评论量
data_support  =  []  # 支持量
for  in  range ( 2 50 ):
     try :
         text  =  driver.find_element_by_xpath(
             "//*[@id='Pl_Official_MyProfileFeed__28']/div/div[%d]/div[1]/div[3]/div[3]"  %  i).text
         Time  =  driver.find_element_by_xpath(
             ".//*[@id='Pl_Official_MyProfileFeed__28']/div/div[%d]/div[1]/div[3]/div[2]/a[1]"  %  i).text
         relay  =  driver.find_element_by_xpath(
             ".//*[@id='Pl_Official_MyProfileFeed__28']/div/div[%d]/div[2]/div/ul/li[2]/a/span/span/span/em[2]"  %  i).text
         comment  =  driver.find_element_by_xpath(
             ".//*[@id='Pl_Official_MyProfileFeed__28']/div/div[%d]/div[2]/div/ul/li[3]/a/span/span/span/em[2]"  %  i).text
         support  =  driver.find_element_by_xpath(
             ".//*[@id='Pl_Official_MyProfileFeed__28']/div/div[%d]/div[2]/div/ul/li[4]/a/span/span/span/em"  %  i).text
         if  text:
             data_text.append(text)
             data_time.append(Time)
             data_relay.append(relay)
             data_comment.append(comment)
             data_support.append(support)
         else :
             pass
     except  :
         break

  上面的代码中,对于要爬取的信息并没有采用正则去匹配,而是采用Xpath(比Xpath更为精准定位的是css定位),对于Xpath不懂的可以百度一下。

  运行完上面所有代码之后,这一页所要爬的内容就以及全部爬下来并分别保存在L_1(粉丝数量)、data_text(微博内容)、data_time(微博发布的时间)、data_relay(微博内容转发数量)、data_comment(微博内容评论数量)、data_support(微博内容点赞数量),最后你就可以利用pandas将这些数据保存在csv中。

  上面的代码只是爬取了一个页面的所需内容,要是想爬取多个页面,稍微修改一下代码就可以了。如果有什么不明白的,可以给文章后面的邮箱发邮件。

  全部代码如下:

from  selenium  import  webdriver
from  selenium.webdriver.common.keys  import  Keys
from  selenium.webdriver.common.action_chains  import  ActionChains
import  time
 
driver  =  webdriver.Firefox()
time.sleep( 3 )
driver.get( "http://weibo.com" )
time.sleep( 5 )
left  =  driver.find_element_by_xpath(
     ".//*[@id='pl_login_form']/div[2]/div[1]/div/a[2]" )
ActionChains(driver).double_click(left).perform()
time.sleep( 3 )
# 在账号输入框输入内容
driver.find_element_by_id( "loginname" ).send_keys( "***" )
# 在密码输入框输入密码
driver.find_element_by_name( "password" ).send_keys( "***" )
# 向密码框发送命令,按下回车键
driver.find_element_by_name( "password" ).send_keys(Keys.ENTER)
time.sleep( 3 )
# 跳转url到指定页面
driver.get( "http://weibo.com/btvertaishidai?is_search=0&visible=0&is_all=1&is_tag=0&profile_ftype=1&page=2#feedtop" )
time.sleep( 3 )
# 获取粉丝量
L_1  =  driver.find_element_by_xpath( ".//*[@id='Pl_Core_T8CustomTriColumn__3']/div/div/div/table/tbody/tr/td[2]/strong" ).text
data_text  =  []  # 保存微博内容
data_time  =  []  # 保存发布微博的时间
data_relay  =  []  # 转发量
data_comment  =  []  # 评论量
data_support  =  []  # 支持量
# 拖动滚动条到最下方
js  =  "var q=document.documentElement.scrollTop=30000"
for  in  range ( 3 ):
     driver.execute_script(js)
     time.sleep( 1 )
# 开始爬取该页面所有微博内容以及相关信息 
for  in  range ( 2 50 ):
     try :
         text  =  driver.find_element_by_xpath(
             "//*[@id='Pl_Official_MyProfileFeed__28']/div/div[%d]/div[1]/div[3]/div[3]"  %  i).text
         Time  =  driver.find_element_by_xpath(
             ".//*[@id='Pl_Official_MyProfileFeed__28']/div/div[%d]/div[1]/div[3]/div[2]/a[1]"  %  i).text
         relay  =  driver.find_element_by_xpath(
             ".//*[@id='Pl_Official_MyProfileFeed__28']/div/div[%d]/div[2]/div/ul/li[2]/a/span/span/span/em[2]"  %  i).text
         comment  =  driver.find_element_by_xpath(
             ".//*[@id='Pl_Official_MyProfileFeed__28']/div/div[%d]/div[2]/div/ul/li[3]/a/span/span/span/em[2]"  %  i).text
         support  =  driver.find_element_by_xpath(
             ".//*[@id='Pl_Official_MyProfileFeed__28']/div/div[%d]/div[2]/div/ul/li[4]/a/span/span/span/em"  %  i).text
         if  text:
             data_text.append(text)
             data_time.append(Time)
             data_relay.append(relay)
             data_comment.append(comment)
             data_support.append(support)
         else :
             pass
     except  :
         break
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值