Selenium+Xpath爬取QQ空间好友说说
Selenium+Xpath爬取QQ空间好友说说
由于对于爬虫技术的好奇,自己买了一本北大出版社刘延安林的《python网络爬虫开发从入门到精通》,逐渐学习了request、selenium、Xpath、等等很好用的爬虫库。
书中有一个很有趣的利用Selenium+Xpath来爬取简书的例子,我看到之后发现简书的界面实际上很类似于QQ空间的界面,于是开始尝试能否在QQ空间爬取到好友说说
需要的库
这个小爬虫需要用到selenium、time、lxml、xlwt等库,各个模块的安装方法都可以在网络上搜索得到。
(安装之前做好一定的心理准备,可能进坑)
进入QQ首页
我们也需要安装一个浏览器驱动,(这里是一个谷歌Chrome的浏览器驱动)在配合selenium中的webdriver库可以模拟浏览器登录我们想要的网址。
代码中绿色的部分就是我的QQ空间网址(*****部分是我的QQ号,大家可以进入自己的QQ号直接复制过来)。2409927923,欢迎加好友哈
time.sleep(5)表示webdriver加载网页之后,暂停5秒,等待网络将页面全部加载完。
#打开QQ首页
driver=webdriver.Chrome()
driver.get('https://user.qzone.qq.com/**********')
time.sleep(5)
模拟用户登录QQ
进入到页面之后,我们看到的情形
我们需要selenium模拟用户点击“账号密码登录”按钮,来进去登陆页面
在页面中右击选择Inspect,点击之后可以看到网站的页面结构,我们找到“账号密码登录“按钮所对应部分的位置,可以看到当鼠标在Insepct部分移动到相应位置时,QQ首页账号密码部分变蓝
(当鼠标在Inspect部分移动的时候,可以看到页面对应的部分变蓝,我们先找到包含该按钮的部分,在一步步深入的点开的Inspect的各个结构,直至寻找到按钮相对应的部分)
按钮的位置可以说是比较深了,而且位于一个iframe大框架之下,我们需要先定位到iframe的位置,可以看到iframe的name id 均是’login_frame’,之后我们找到账号密码登录模块,其id是’switcher_plogin’(页面结构的id class等都可以用来定位,使用相应的语句)
.click是找到元素之后模拟用户点击,点击之后,再给浏览器5秒的时间加载数据。
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
time.sleep(5)
进入QQ账号密码输入界面
我们依旧可以定位到网页中账号密码对应的部分
寻找到对应的id,实例化一个login_username,然后使用send_keys语句,将账号和密码发送给页面(****的部分就是我隐去的账号和密码)。然后,找到登录模块的id,.click点击,给浏览器10s的时间加载。
家里网确实不太好哈,哈哈哈哈哈哈哈
login_username=driver.find_element_by_id('u')
login_username.send_keys('**********')
login_password=driver.find_element_by_id('p')
login_password.send_keys('********')
driver.find_element_by_id('login_button').click()
time.sleep(10)
进入到自己的QQ空间
同样的模式,page_source访问页面资源,然后使用xpath找到好友说说所在大位置,好友所发的说说都在这个路径之下(Xpath是一个可以在网页结构中按照自己规定的节点寻找元素的方法,具体语法可以网页就可以搜到)
page_text = driver.page_source
tree = etree.HTML(page_text)
li_list = tree.xpath('//ul[@id="feed_friend_list"]/li')
使用循环语句遍历输出li_list中的各个li内容(每一个li都对应一个好友),然后再次按照li中的Xpath路径寻找到好友昵称以及说说的位置,text()表示输出其中的文本。
内容暂存在user_name_list,text_list中,之后再使用语句写入到excel。(先创建好excel文件,见下一块)
i=0
for li in li_list:
user_name_list = li.xpath(".//div[@class='user-info']/div[@class='f-nick']/a/text()")
data_sheet.write(i, 0, user_name_list)
text_list = li.xpath('.//div[@class="f-info"]/text()|.//div[@class="f-info"]//text()')
data_sheet.write(i, 1, text_list)
i=i+1
workbook.save( 'qq_zone0.xls')
创建excel文件
workbook = xlwt.Workbook(encoding='utf-8')
data_sheet = workbook.add_sheet('qq_zone0')
最终结果
部分结果遮挡了哈,保护个人信息
全部代码
from selenium import webdriver
import time
from lxml import etree
import pymysql
import xlwt
#打开QQ首页driver=webdriver.Chrome()
driver.get('https://user.qzone.qq.com/2409927923')
time.sleep(5)
#输入账号密码并打开driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
time.sleep(5)
login_username=driver.find_element_by_id('u')
login_username.send_keys('2409927923') login_password=driver.find_element_by_id('p')
login_password.send_keys('********') driver.find_element_by_id('login_button').click()
time.sleep(10)
#定位
page_text = driver.page_source
tree = etree.HTML(page_text)
li_list=tree.xpath('//ul[@id="feed_friend_list"]/li')
#新建excel 寻找并存储数据
workbook = xlwt.Workbook(encoding='utf-8')
data_sheet = workbook.add_sheet('qq_zone0')
i=0
for li in li_list:
user_name_list = li.xpath(".//div[@class='user-info']/div[@class='f-inck']/a/text()")
data_sheet.write(i, 0, user_name_list)
text_list = li.xpath('.//div[@class="f-info"]/text()|.//div[@class="f-info"]//text()')
data_sheet.write(i, 1, text_list)
i=i+1
workbook.save( 'qq_zone0.xls')print(u'创建qq_zone0.xls文件成功')
参考书籍:《python网络爬虫开发从入门到精通》北大出版社 刘延林编著(319~325)
以及好多码农博客(没留下记录,嘤嘤嘤,如果有大佬能够看到,而且觉得某几句代码很像,在此表示崇高的感谢)