抱歉,你查看的文章不存在

Python爬虫入门实战七:使用Selenium--以抓取QQ空间好友说说为例

Selenium抓取QQ空间好友说说

前面我们接触到的,都是使用requests+BeautifulSoup组合对静态网页进行请求和数据解析,若是JS生成的内容,也介绍了通过寻找API借口来获取数据。 但是有的时候,网页数据由JS生成,API借口又死活找不着或者是API借口地址随机变换,时间不等人。那就只能使用Selenium了。

一、Selenium简介

Selenium是一个用于Web应用的功能自动化测试工具,Selenium 直接运行在浏览器中,就像真正的用户在操作一样。 由于这个性质,Selenium也是一个强大的网络数据采集工具,其可以让浏览器自动加载页面,获取需要的数据,甚至页面截图,或者是判断网站上某些动作是否发生。 Selenium自己不带浏览器,需要配合第三方浏览器来使用。支持的浏览器有Chrome、Firefox、IE、Phantomjs等。 如果使用Chrome、FireFox或IE,我们可以看得到一个浏览器的窗口被打开、打开网站、然后执行代码中的操作。 但是,让程序在后台中运行更符合我们爬虫的气质,所以自己多使用Phantomjs作为浏览器载体,本篇文章也以Phantomjs作介绍 Phantomjs是一个“无头”浏览器,也就是没有界面的浏览器,但是功能与普通的浏览器无异。

二、在Python中使用Selenium获取QQ空间好友说说

之前使用pip安装好了selenium,直接在代码中import即可。 下面我们以一个实际的例子——获取一个QQ空间好友的说说信息,来简单讲解一下Selenium+Phantomjs的使用。 我们需要爬取的页面时这样的:

QQ空间好友说说的链接为 : http://user.qzone.qq.com/{好友QQ号}/311 我们抓取他发的说说的时间和内容。 依旧先上代码:

获取到的数据截图如下:

接下来我们通过讲解代码,稍微了解一下Selenium的使用

三、代码简析

1.照例,导入需要使用的模块:

from bs4 import BeautifulSoup
from selenium import webdriver
import time

2.使用Selenium的webdriver实例化一个浏览器对象,在这里使用Phantomjs:

driver = webdriver.PhantomJS(executable_path="D:\\phantomjs.exe")

3.设置Phantomjs窗口最大化:

driver.maximize_window()

4.主函数部分

使用get()方法打开待抓取的URL:

driver.get('http://user.qzone.qq.com/{}/311'.format(qq))

等待5秒后,判断页面是否需要登录,通过查找页面是否有相应的DIV的id来判断:

    try:
        driver.find_element_by_id('login_div')
        a = True
    except:
        a = False

如果页面存在登录的DIV,则模拟登录:

    driver.switch_to.frame('login_frame') #切换到登录ifram
    driver.find_element_by_id('switcher_plogin').click()
    driver.find_element_by_id('u').clear()#选择用户名框
    driver.find_element_by_id('u').send_keys('QQ号')
    driver.find_element_by_id('p').clear()#选择密码框
    driver.find_element_by_id('p').send_keys('QQ密码')
    driver.find_element_by_id('login_button').click()#点击登录按钮
    time.sleep(3)

接着,判断好友空间是否设置了权限,通过判断是否存在元素ID:QM_OwnerInfo_Icon

  try:
        driver.find_element_by_id('QM_OwnerInfo_Icon')
        b = True
    except:
        b = False

如果有权限能够访问到说说页面,那么定位元素和数据,并解析:

if b == True:
    driver.switch_to.frame('app_canvas_frame')
    content = driver.find_elements_by_css_selector('.content')
    stime = driver.find_elements_by_css_selector('.c_tx.c_tx3.goDetail')
    for con,sti in zip(content,stime):
        data = {
            # 'qq':qq,
            'time':sti.text,
            'shuos':con.text
        }
        print(data)

除了在Selenium中解析数据,我们还可以将当前页面保存为源码,再使用BeautifulSoup来解析:

pages = driver.page_source
soup = BeautifulSoup(pages,'lxml')

最后,我们尝试一下获取Cookie,使用get_cookies():

   cookie = driver.get_cookies()
    cookie_dict = []
    for c in cookie:
        ck = "{0}={1};".format(c['name'],c['value'])
        cookie_dict.append(ck)
    i = ''
    for c in cookie_dict:
        i += c
    print('Cookies:',i)

另外,再介绍两个Selenium的常用方法: 保存屏幕截图:

driver.save_screenshot('保存的文件路径及文件名')

执行JS脚本:

driver.execute_script("JS代码")

对于Selenium更加详细的操作和使用,推荐一本书《selenium webdriver(python)第三版》网上可以搜索到;

本章就到这里。

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2017-01-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

州的先生

4 篇文章54 人订阅

相关文章

来自专栏挖坑填坑

使用.net core ABP和Angular模板构建博客管理系统(实现编辑页面功能)

别忘记app.module.ts中也需要引入ReactiveFormsModule

2043
来自专栏流柯技术学院

PhantomJS快速入门

本文简要介绍了PhantomJS的相关基础知识点,主要包括PhantomJS的介绍、下载与安装、HelloWorld程序、核心模块介绍等。由于鄙人才疏学浅,难免...

6562
来自专栏IMWeb前端团队

尝试利用捕获来做上报

标准浏览器的事件模型是先捕获再冒泡,由于考虑到兼容问题,事件绑定一般都是基于冒泡来做的,那么什么情况下可以考虑利用捕获来做事件绑定呢? 最近在做的课程查找页上报...

2189
来自专栏進无尽的文章

扒虫篇-Bug日志Ⅴ

解决方法:首先这个警告不会造成上传失败,也不会造成审核被拒。其次可以通过移除代码中警告的那些代码,并移除多余不使用的系统类库(framework),使警告消失。

1381
来自专栏向治洪

Vue.js简介

Vue.js简介 Vue.js(读音 /vjuː/, 类似于view)是一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设...

3117
来自专栏小古哥的博客园

微信小程序-开发入门(一)

微信小程序已经火了一段时间了,之前一直也在关注,就这半年的发展来看,相对原生APP大部分公司还是不愿意将主营业务放到微信平台上,以免受制于腾讯,不过就小程序的应...

6305
来自专栏小特工作室

Navi.Soft31.WinForm框架(含下载地址)

1概述 1.1应用场景 尽管互联网高速发展,互联网软件也随之越来越多,但桌面应用程序在某些领域中还是不可替代,如MIS,ERP,CRM等软件产品,同时,这类软件...

3687
来自专栏有趣的Python和你

人生若只如初见,何必找包爬数据SeleniumPhantomJS豆瓣登陆

1264
来自专栏编程之旅

PHP开发——yii2多图上传组件的使用

最近在使用yii2开发一个表单页面的时候,有多图上传的需求,稍微找了找这方面的组件,基本都安利fileInput这个组件,于是就尝试着使用这个库来完成后端表单页...

2901
来自专栏向治洪

Vue.js快速入门

Vue.js简介 Vue.js(读音 /vjuː/, 类似于view)是一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设...

2809

扫码关注云+社区

领取腾讯云代金券