【python】爬虫:动态网页爬取

selenium

【介绍】:selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE)编写及运行(Selenium Remote Control)测试的并行处理(Selenium Grid)

【通俗的解读】:Selenium最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS),当然啦,也可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,功能丰富,不容错过哦 。

安装:

pip install selenium

(最好是加一个清华源,安装速度Plus):

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
Chrome浏览器驱动的安装

可参考:http://blog.csdn.net/huilan_same/article/details/51896672
【注意】:要下载对应版本的chromedriverhttp://npm.taobao.org/mirrors/chromedriver/

Chromedriver 驱动

没有驱动的状态下,报错:selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.(需要给'chromedriver'配置路径)
【处理办法】:在你编译环境python中配置一下路径。分为以下两个步骤:

  • 找到你编译环境python的文件路径;
  • 将你对应版本的安装文件(.exe)放入python目录下的Scripts目录中;
目录

页面元素定位符:

在爬虫的一系列操作中,如何给目标元素定位是十分总要的基础操作。
selenium中 最核心的技巧是WebElement类型的识别和定位,主要介绍以下八类:

(1)By.id() 通过id定位
 browser.find_element_by_id("kw")

【注解】:元素的id属性来定位元素——id是唯一标识
这里的两种形式是同样的效果..

    browser.find_element_by_id("kw")
    # 另一种形式:
    browser.find_element((By.id,"kw"))

【重点】:这里的两种形式是等价的!

(2)By.name() 通过name 定位
search=browser.find_element_by_name("wd")

search=browser.find_elements_by_name("wd")

【解释】:

  • 如果name属性的值kw是唯一的,用find_element_by_name定位元素,返回值是一个值;
  • 如果name属性的值kw不是唯一的,用find_elements_by_name定位元素,返回符合条件的多个值,保存在列表中,即返回的是列表。
(3)By.xpath() 通过xpath定位
browser.find_element_by_xpath("//*[@id='kw']")
(4) By.className() 通过className定位

【介绍】:通过元素的class属性来定位元素,class属性不是绝对唯一的。(标签的class属性可能相同)

browser.find_element_by_class_name("s_ipt")
(5) By.cssSelector() 通过CSS 定位
browser.find_element_by_css_selector()
(6)By.linkText() 通过linkText
browser.find_element_by_link_text()
  • 精确匹配——文本内容唯一;
  • 模糊匹配——通过文本内容的部分内容,文本内容不唯一;
(7)By.tagName() 通过tagName
 browser.find_element_by_tag_name("input")
(8)By.partialLinkText() 通过匹到的部分linkText
browser.find_element_by_partial_link_text()

【注意】:查找多个元素节点元素单个节点相同,只是将element + s。例如:

    browser.find_elements_by_css_selector()
    browser.find_elements_by_id()
    browser.find_elements_by_name()
    browser.find_elements_by_link_text()
    browser.find_element_by_partial_link_text()

【小案例】:运行小程序,在百度搜索简书。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

browser = webdriver.Chrome()
try:
    browser.get("https://www.baidu.com")
    input = browser.find_element_by_id('kw')
    input.send_keys('简书')
    input.send_keys(Keys.ENTER)
    # 等待对象反应
    wait = WebDriverWait(browser,100)
    locator = (By.ID,"content")
    wait.until(EC.presence_of_element_located((locator)))
    print(browser.current_url)
    print(browser.get_cookies())
    # print(browser.page_source)
    ele = browser.find_element_by_id("content_left")
    print(ele)

finally:
    browser.close()

【小案例】:运行小程序,在京东搜索商品。
网址:https://www.jd.com

from time import sleep
from selenium import webdriver
# 京东商城搜索
def simulate_jd_search():
    browser = webdriver.Chrome()
    browser.get("https://www.jd.com")
    # 模拟输入问题
    input = browser.find_element_by_id("key")
    input.send_keys("手机")
    time.sleep(3)
    # 模拟清空内容
    input.clear()
    input.send_keys("小猪")
    button = browser.find_element_by_css_selector("button.button")
    button.click()
    time.sleep(10)

simulate_jd_search()

【小案例】:运行小程序,模拟鼠标拖拽
网址:https://www.runoob.com/try/try.php?filename=jqueryui-example-droppable

from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
def simulate_drop():
    browser = webdriver.Chrome()
    browser.get("https://www.runoob.com/try/try.php?filename=jqueryui-example-droppable")
    # 切换到id是iframeResult的iframe标签中;
    browser.switch_to.frame("iframeResult")
    source = browser.find_element_by_css_selector("#draggable")
    target = browser.find_element_by_css_selector("#droppable")
    actions = ActionChains(browser)

    actions.drag_and_drop(source,target)
    actions.perform()   #执行
    time.sleep(10)      #延迟10秒

simulate_drop()

关于selenium.webdrive之ActionChains

ActionChains是自动执行低级交互的一种方式,例如:鼠标移动,鼠标点按,键盘操作,文本操作等。

当我们调用这里的方法时,这些操作会被先储存在一个队列中,当我们调用perform()方法时,队列中的操作会被按顺序执行,执行后队列被清空。

关于ActionChains 类提供的鼠标操作的常用方法见下表:

常用方法 鼠标操作 参数
click(self, element=None) 点击 若参数None,那么点击当前位置;若参数是element,那么点击此元素;
click_and_hold(self, element=None) 鼠标左键按住某个元素 同上
context_click(self, element=None) 右键点击 同上
** double_click()** 双击 同上
drag_and_drop(source, target) 拖动 【source】: 元素位置;【target】: 目标位置;
move_to_element(self, to_element): 鼠标悬停 to_element: 定位需要悬停的元素
drag_and_drop_by_offset(self, source, xoffset, yoffset): 按住元素,然后移动目标偏移量 【source】: 元素位置; 【xoffset】: X 轴的偏移量;【yoffset】: Y 轴的偏移量
key_down(self, value, element=None) 应用于修饰键(控制、alt和shift) 【value】: 要发送的修饰符键;【element】:定位的元素
send_keys(self, *keys_to_send) 发送到当前焦点元素 要发送的按键。(修饰符键常数可以在“Keys”类)

【注】:更多鼠标操作可参考:http://www.51testing.com/index.php?action-viewnews-itemid-3725836-php-1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351