爬虫之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)