欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Selenium+Xpath爬取QQ空间好友说说

程序员文章站 2022-04-26 08:09:42
...

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+Xpath爬取QQ空间好友说说
我们需要selenium模拟用户点击“账号密码登录”按钮,来进去登陆页面

在页面中右击选择Inspect,点击之后可以看到网站的页面结构,我们找到“账号密码登录“按钮所对应部分的位置,可以看到当鼠标在Insepct部分移动到相应位置时,QQ首页账号密码部分变蓝
(当鼠标在Inspect部分移动的时候,可以看到页面对应的部分变蓝,我们先找到包含该按钮的部分,在一步步深入的点开的Inspect的各个结构,直至寻找到按钮相对应的部分)
Selenium+Xpath爬取QQ空间好友说说

按钮的位置可以说是比较深了,而且位于一个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账号密码输入界面

我们依旧可以定位到网页中账号密码对应的部分
Selenium+Xpath爬取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空间

Selenium+Xpath爬取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')

最终结果

Selenium+Xpath爬取QQ空间好友说说

部分结果遮挡了哈,保护个人信息

全部代码

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)

以及好多码农博客(没留下记录,嘤嘤嘤,如果有大佬能够看到,而且觉得某几句代码很像,在此表示崇高的感谢)

相关标签: python