[67]python selenium实战

实战1:selenium xpath爬取京东手机

入口:
关键字搜索入口
这里使用的Chrome 浏览器,方便能看到信息是否录入正确,
这里,我们首先找到输入框,然后填上 zuk z2 手机 然后再找到 搜索按钮,选中点击后, 然后再找到zuk z2手机(蓝色的字体)

这样子点完之后,我们就会出现第一页的那个图片,显示的手机商品信息

这样子我们就把整个逻辑走完了,剩下的就交给代码了,里面的注释还算详细。

# -*- coding: utf-8 -*-
import re
import time
from selenium import webdriver
import os
from lxml import etree


#如果没有配置chromedriver.exe的环境变量,要写完整路径
# chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
chromedriver = "chromedriver.exe"
browser = webdriver.Chrome(chromedriver)

url = "https://www.jd.com/"
browser.get(url)
time.sleep(5)
#手机号登录
phoneLogin = browser.find_element_by_xpath('//*[@id="key"]')
phoneLogin.send_keys('ZUK Z2手机')

time.sleep(3)
# 搜索
btnNext = browser.find_element_by_xpath('//*[@id="search"]/div/div[2]/button')
btnNext.click()

#加上延迟时间,不然可能拿不到数据
time.sleep(3)
btnPhone = browser.find_element_by_xpath('//*[@id="J_searchWrap"]/div[2]/a')
btnPhone.click()
page = browser.page_source
html = etree.HTML(page)

links = html.xpath("//*[@id='J_goodsList']/ul[@class='gl-warp clearfix']")
print('links',links)
for link in links:
    # 通过xpath获取商品链接
    verlink = link.xpath("./li[@class='gl-item']/div[@class='gl-i-wrap']/div[@class='p-img']/a/@href")

    #通过xpath获取商品价格
    price = link.xpath("./li[@class='gl-item']/div[@class='gl-i-wrap']/div[@class='p-price']/strong")
    print(price)
    print(verlink)

print(len(links))

这里控制台打印了一下链接信息(需求如此):


实战2:selenium爬取安居客

我们爬取的网站:https://www.anjuke.com/sy-city.html

获取的内容:包括地区名,地区链接:

安居客详情

  1. 一开始直接用requests库进行网站的爬取,会访问不到数据的, 会直接出现 访问的页面出现错误的信息。
  2. selenium 的使用:
  • 代码
# -*- coding: utf-8 -*-
# @Time    :
# @Author  :
# @Email   :
# @File    :
import requests
import re
from bs4 import BeautifulSoup
import csv
import time
import threading
from lxml import etree
from selenium import webdriver
from openpyxl import Workbook

num0 = 1  # 用来计数
baseurl = 'https://www.anjuke.com/sy-city.html'

wb = Workbook()
ws = wb.active
ws.title = '安居客'
ws.cell(row=1, column=1).value = '城市链接'
ws.cell(row=1, column=2).value = '城市名称'

def gethtml():
    chromedriver = "chromedriver.exe"
    browser = webdriver.Chrome(chromedriver)
    browser.get(baseurl)
    time.sleep(5)

    #让页面滚动到下面,window.scrollBy(0, scrollStep),ScrollStep :间歇滚动间距
    js = 'window.scrollBy(0,3000)'
    browser.execute_script(js)
    js = 'window.scrollBy(0,5000)'
    browser.execute_script(js)
    html = browser.page_source
    return html

def parseHotBook(html):
    # print(html)
    regAuthor = r'.*?<a href="(.*?)</a>'
    reg_author = re.compile(regAuthor)
    authorother = re.findall(reg_author, html)

    global num0

    for info in authorother:
        verinfo = info.split('">')
        print(verinfo[0],verinfo[1].replace('class="hot',''))

        num0 = num0 + 1
        name = verinfo[0]
        link = verinfo[1].replace('class="hot','')
        ws.cell(row=num0, column=1).value = name
        ws.cell(row=num0, column=2).value = link
    wb.save('安居客2' + '.xlsx')
    print('爬取成功')

if __name__=='__main__':
    html = gethtml()
    parseHotBook(html)

文本存储还有一些瑕疵,因为用的是正则表达式,并没有进行很严格的匹配
贴上爬取内容:

安居客爬取内容


实战3: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我们抓取他发的说说的时间和内容。

  • 依旧先上代码:
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
from selenium import webdriver
import time

# #使用Selenium的webdriver实例化一个浏览器对象,在这里使用Phantomjs
# driver = webdriver.PhantomJS(executable_path=r"D:\phantomjs-2.1.1-windows\bin\phantomjs.exe")
# #设置Phantomjs窗口最大化
# driver.maximize_window()


# 登录QQ空间
def get_shuoshuo(qq):
    chromedriver = r"D:\soft\chromedriver_win32\chromedriver.exe"
    driver = webdriver.Chrome(chromedriver)
    #使用get()方法打开待抓取的URL
    driver.get('http://user.qzone.qq.com/{}/311'.format(qq))
    time.sleep(5)
    #等待5秒后,判断页面是否需要登录,通过查找页面是否有相应的DIV的id来判断
    try:
        driver.find_element_by_id('login_div')
        a = True
    except:
        a = False
    if a == True:
        #如果页面存在登录的DIV,则模拟登录
        driver.switch_to.frame('login_frame')
        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)
    driver.implicitly_wait(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 = {
                'time': sti.text,
                'shuos': con.text
            }
            print(data)
        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)
    print("==========完成================")

    driver.close()
    driver.quit()


if __name__ == '__main__':
    get_shuoshuo('好友QQ号码')

获取到的数据截图如下:

三、代码简析

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)第三版》网上可以搜索到;

参考:http://www.jianshu.com/p/d07ec60e8b6f

  • 11
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值