爬虫之selenium (二)

一.简介

# selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题。

# selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。

from selenium import webdriver

# 谷歌浏览器
browser=webdriver.Chrome()
# 火狐浏览器
browser=webdriver.Firefox()
# 无界面浏览器
browser=webdriver.PhantomJS()
# 苹果浏览器
browser=webdriver.Safari()
# IE浏览器
browser=webdriver.Edge() 

二.安装(有界面浏览器)

# 安装:selenium+chromedriver
pip3 install selenium
下载chromdriver.exe放到python安装路径的scripts目录中即可,注意最新版本是2.38,并非2.9
国内镜像网站地址:http://npm.taobao.org/mirrors/chromedriver/2.38/
最新的版本去官网找:https://sites.google.com/a/chromium.org/chromedriver/downloads

#验证安装
C:\Users\Administrator>python3
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from selenium import webdriver
>>> driver=webdriver.Chrome() #弹出浏览器
>>> driver.get('https://www.baidu.com')
>>> driver.page_source

#注意:
selenium3默认支持的webdriver是Firfox,而Firefox需要安装geckodriver
下载链接:https://github.com/mozilla/geckodriver/releases

三.selenium简单用法:

from selenium import webdriver  # 用来驱动浏览器的
from selenium.webdriver import ActionChains  # 破解滑动验证码的时候用的 可以拖动图片
from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
from selenium.webdriver.support import expected_conditions as EC  # 和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
import time

# driver = webdriver.Chrome()
# driver.get('https://www.baidu.com/')
# time.sleep(5)
# driver.close()
driver = webdriver.Chrome()
try:
    driver.get('https://www.baidu.com/')

    # 获取显性等待
    wait = WebDriverWait(driver, 10)

    # 根据ID查找到id为kw的标签
    input_tag = wait.until(EC.presence_of_element_located((By.ID, 'kw')))

    # 把输入内容传进input框内
    input_tag.send_keys('围城')

    # 方式一(回车):
    # input_tag.send_keys(Keys.ENTER)

    # 方式二(点击百度一下):
    button = wait.until(EC.presence_of_element_located((By.ID, 'su')))
    button.click()
    time.sleep(5)


finally:
    driver.close()

四.selenium选择器

from selenium import webdriver  # 用来驱动浏览器的
from selenium.webdriver import ActionChains  # 破解滑动验证码的时候用的 可以拖动图片
from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
from selenium.webdriver.support import expected_conditions as EC  # 和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
import time

chrome = webdriver.Chrome()

try:
    # 隐性等待: 等待所有标签加载10s
    chrome.implicitly_wait(10)
    chrome.get('https://www.baidu.com/')

    # ===============所有方法===================
    # element是查找一个标签
    # elements是查找所有标签

    # 1、find_element_by_id 通过id去找
    # input_tag = chrome.find_element_by_id('kw')
    # input_tag.send_keys('墨菲定律')
    # button = chrome.find_element_by_id('su')
    # button.click()

    # 2、find_element_by_link_text  通过链接文本去找
    # 登录  精确查找
    # login_button = chrome.find_element_by_link_text('登录 ') 空格找不到的
    # login_button = chrome.find_element_by_link_text('登录')
    # login_button.click()

    # 3、find_element_by_partial_link_text  模糊查找
    login_button = chrome.find_element_by_partial_link_text('')
    login_button.click()

    # 4、find_element_by_tag_name  通过标签名查找标签
    # a_s = chrome.find_elements_by_tag_name('a')  # 找到第一个a标签
    # print(a_s)

    # 5、find_element_by_class_name  通过类名查找标签
    login_button2 = chrome.find_element_by_class_name('tang-pass-footerBarULogin')
    login_button2.click()

    # 6、find_element_by_name  # 通过标签查找
    username_input = chrome.find_element_by_name('userName')
    username_input.send_keys('15622792660')
    password_input = chrome.find_element_by_name('password')
    password_input.send_keys('xxxxx')

    # 7、find_element_by_css_selector  # 通过属性选择器查找
    login_submit = chrome.find_element_by_css_selector('#TANGRAM__PSP_10__submit')
    login_submit.click()

    # 8、find_element_by_xpath


    time.sleep(5)
finally:
    chrome.close()

   

selenium选择器之find_element_by_xpath:
from selenium import webdriver  # 用来驱动浏览器的
from selenium.webdriver import ActionChains  # 破解滑动验证码的时候用的 可以拖动图片
from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
from selenium.webdriver.support import expected_conditions as EC  # 和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
import time

chrome = webdriver.Chrome()

try:
    # 隐性等待: 等待所有标签加载10s
    chrome.implicitly_wait(10)
    chrome.get('https://doc.scrapy.org/en/latest/_static/selectors-sample1.html')

    # 1.根据根节点查找  /
    # html = chrome.find_element_by_xpath('/html')
    # print(html)
    # 了解
    # print(html.tag_name)
    # print(html.id)

    # head = chrome.find_element_by_xpath('/head')
    # print(head)  # 报错

    # 全局查找
    # head = chrome.find_element_by_xpath('//head')
    # print(head)


    # 查找第一个div标签
    # div = chrome.find_element_by_xpath('//div')
    # print(div.tag_name)

    # 查找第一个div标签下的img标签
    # a = chrome.find_element_by_xpath('//a/img')
    # print(a.tag_name)

    # 找到所有a标签
    # a_s = chrome.find_elements_by_xpath('//a')
    # print(a_s)  # 获取对象
    # print(a_s[0])  # 获取第一个a标签
    # print(a_s[0].text)  # 获取a标签文本
    # print(a_s[0].get_attribute('href'))  # 获取a标签属性

    # 查找第一个div标签下第三个a标签
    # a_3 = chrome.find_element_by_xpath('//div/a[3]')
    # print(a_3.tag_name)
    # print(a_3.text)

    # 查找第一个div标签下第三个a标签下的图片
    # a_3 = chrome.find_element_by_xpath('//div/a[3]/img')
    # print(a_3.tag_name)
    # print(a_3.text)
    # print(a_3.get_attribute('src'))

    # 获取id为images标签下的第五个a标签下的img
    img_5 = chrome.find_element_by_xpath('//*[@id="images"]/a[5]/img')


    # 返回属性
    print(img_5)
    print(img_5.text)
    print(img_5.get_attribute('src'))
    print(img_5.location)
    print(img_5.size)
    time.sleep(5)
finally:
    chrome.close()

五.selenium交互操作(滑动)

天猫搜索:
from selenium import webdriver  # 用来驱动浏览器的
from selenium.webdriver import ActionChains  # 破解滑动验证码的时候用的 可以拖动图片
from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
from selenium.webdriver.support import expected_conditions as EC  # 和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
import time

chrome = webdriver.Chrome()
chrome.implicitly_wait(10)
try:

    chrome.get('https://www.tmall.com/')
    input_tag = chrome.find_element_by_id('mq')
    input_tag.send_keys('时间革命')
    input_tag.send_keys(Keys.ENTER)

    input_tag = chrome.find_element_by_id('mq')
    input_tag.clear()
    input_tag.send_keys('唐诗三百首')

    button = chrome.find_element_by_xpath('//*[@class="mallSearch-input clearfix"]/button')
    button.click()

    time.sleep(5)

finally:
    chrome.close()

  图像滑动:

from selenium import webdriver  # 用来驱动浏览器的
from selenium.webdriver import ActionChains  # 破解滑动验证码的时候用的 可以拖动图片
from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
from selenium.webdriver.support import expected_conditions as EC  # 和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
import time

chrome = webdriver.Chrome()
chrome.implicitly_wait(10)

try:

    chrome.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    # source = chrome.find_element_by_id('draggable')
    # target = chrome.find_element_by_id('droppable')
    # print(source, target)
    # 切换子页面
    # chrome.switch_to_frame('iframeResult')  # 弃用方法
    chrome.switch_to.frame('iframeResult')
    source = chrome.find_element_by_id('draggable')
    target = chrome.find_element_by_id('droppable')
    print(source, target)

    # 找父页面(测试,找不到就报错)
    # chrome.switch_to.parent_frame()
    # source = chrome.find_element_by_id('draggable')
    # target = chrome.find_element_by_id('droppable')
    # print(source, target)

    # 方式一:
    # 把源图片瞬间拖到目标图片处
    ActionChains(chrome).drag_and_drop(source, target).perform()

    # 方式二:
    # 把源图片hold住慢慢移动到目标位置
    ActionChains(chrome).click_and_hold(source).perform()
    # 获取目标图片与源图片的距离
    distance = target.location.get('x') - source.location.get('x')
    s = 0
    while s < distance:
        # 向右移动1步
        ActionChains(chrome).move_by_offset(xoffset=1, yoffset=0).perform()
        s += 1

    # 释放鼠标
    ActionChains(chrome).release().perform()

    time.sleep(5)

finally:
    chrome.close()
六.selenium之JS操作:
from selenium import webdriver  # 用来驱动浏览器的
from selenium.webdriver import ActionChains  # 破解滑动验证码的时候用的 可以拖动图片
from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
from selenium.webdriver.support import expected_conditions as EC  # 和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
import time

# js操作
chrome = webdriver.Chrome()
chrome.implicitly_wait(10)
try:

    chrome.get('https://www.baidu.com/')
    # 向页面发送js代码
    chrome.execute_script("alert('tank is very 马叉虫!')")
    chrome.execute_script("""
    JS代码
    """)

    time.sleep(5)
finally:
    chrome.close()


---------------------------------------------------------------
# 前进后退
try:

    # 按顺序往目标站点发送请求
    chrome.get('https://www.baidu.com/')
    chrome.get('https://www.tmall.com/')
    chrome.get('https://www.jd.com/')

    # 后退
    chrome.back()

    # 前进
    chrome.forward()


    time.sleep(5)
finally:
    chrome.close()

七.爬取京东商品信息

from selenium import webdriver  # 用来驱动浏览器的
from selenium.webdriver import ActionChains  # 破解滑动验证码的时候用的 可以拖动图片
from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
from selenium.webdriver.support import expected_conditions as EC  # 和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
import time

def driver_star(driver, key):

    try:
        # 所有商品的上一层div
        div_obj = driver.find_element_by_id('J_goodsList')
        # 获取所有商品的商品li
        li_list = div_obj.find_elements_by_class_name('gl-item')
        # print(li_list)
        # 遍历所有商品li
        for li in li_list:
            # 商品链接
            detail_link = li.find_element_by_css_selector('.p-img a').get_attribute('href')

            # 商品名称
            g_name = li.find_element_by_css_selector('.p-name em').text

            # 商品价格
            g_price = li.find_element_by_css_selector('.p-price i').text

            # 评论人数
            g_commit = li.find_element_by_css_selector('.p-commit a').text

            goods = '''

            ==============tank 商品信息 ================
                商品链接: %s
                商品名称: %s
                商品价格: %s
                评论人数: %s
            \n
            ''' % (detail_link, g_name, g_price, g_commit)
            print(goods)

            # 保存数据
            with open('%s.txt' % key, 'a', encoding='utf-8') as f:
                f.write(goods)

        # 找到文本为“下一页”的标签进行点击
        next_tag = driver.find_element_by_partial_link_text('下一页')
        next_tag.click()
        time.sleep(2)

        # 点击下一页后递归执行drver_star
        driver_star(driver, key)

        time.sleep(5)
    finally:
        driver.close()

if __name__ == '__main__':
    key = input('请输入爬取的商品内容: ').strip()
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    driver.get('https://www.jd.com/')
    # 获取商品输入框
    input_tag = driver.find_element_by_id('key')
    # 把输入的商品传入输入框内
    input_tag.send_keys(key)
    # 控制键盘回车确认查找
    input_tag.send_keys(Keys.ENTER)
    driver_star(driver, key)

 



 

posted @ 2019-06-24 15:09  纵横捭阖行  阅读(217)  评论(0编辑  收藏  举报