python爬虫第六天(selenium+phantomjs)

selenium操作浏览器的方法

from selenium import webdriver

#1.创建一个浏览器驱动
driver=webdriver.Chrome() #Chrome是可视化的这个是谷歌驱动 相当于有界面的浏览器;PhantomJS是无界面的浏览器

#2.请求url
driver.get('http://www.baidu.com/')

#获取页面字符串
html_str=driver.page_source

#查看标题
print(driver.title)

#查看cookie
print(driver.get_cookies())

#将页面id=kw 里面写入 爬虫 (在能写能内容的用send_keys,能点击的用click())
driver.find_element_by_id("kw").send_keys(u'爬虫')
driver.find_element_by_id('su').click()

#截屏
# driver.save_screenshot('before_click.png')
driver.find_element_by_id('su').click()
# driver.save_screenshot('after_click.png')

# #webelement对象
webEle = driver.find_element_by_id('kw')
# input.send_keys(Keys.CONTROL,'a')  #全选
# input.send_keys(Keys.CONTROL,'x')  #剪切

#查找webelement对象的方法。
driver.find_element_by_id('kw')
driver.find_element_by_css_selector('#kw')
driver.find_element_by_xpath('')

#查看webelement元素坐标
input=driver.find_element_by_id('kw')
print(input.location)
#查看元素的大小
print(input.size)

selenium常用方法总结

请求url
driver.get('http://www.baidu.com/')

获取页面字符串  page_source
driver.page_source


1.获取当前页面的Url
方法:current_url  
实例:driver.current_url

2.获取元素坐标
方法:location
解释:首先查找到你要获取元素的,然后调用location方法
实例:driver.find_element_by_xpath("xpath").location

3.表单的提交
方法:submit
解释:查找到表单(from)直接调用submit即可
实例:driver.find_element_by_id("form1").submit()

4.获取CSS的属性值
方法:value_of_css_property(css_name)
实例:driver.find_element_by_css_selector("input.btn").value_of_css_property("input.btn")

5.获取元素的属性值
方法:get_attribute(element_name)
实例:driver.find_element_by_id("kw").get_attribute("kw")

6.判断元素是否被选中
方法:is_selected()
实例:driver.find_element_by_id("form1").is_selected()

7.返回元素的大小
方法:size
实例:driver.find_element_by_id("iptPassword").size
返回值:{'width': 250, 'height': 30}

8.判断元素是否显示
方法:is_displayed()
实例:driver.find_element_by_id("iptPassword").is_displayed()

9.判断元素是否被使用
方法:is_enabled()
实例:driver.find_element_by_id("iptPassword").is_enabled()

10.获取元素的文本值
方法:text
实例:driver.find_element_by_id("iptUsername").text

11.元素赋值
方法:send_keys(*values)
实例:driver.find_element_by_id("iptUsername").send_keys('admin')

12.返回元素的tagName
方法:tag_name
实例:driver.find_element_by_id("iptUsername").tag_name

13.删除浏览器所有的cookies
方法:delete_all_cookies()
实例:driver.delete_all_cookies()

14.删除指定的cookie
方法:delete_cookie(name)
实例:deriver.delete_cookie("my_cookie_name")

15.关闭浏览器
方法:close()
实例:driver.close()

16.关闭浏览器并且退出驱动程序
方法:quit()
实例:driver.quit()

17.返回上一页
方法:back()
实例:driver.back()

18.清空输入框
方法:clear()
实例:driver.clear()

19.浏览器窗口最大化
方法:maximize_window()
实例:driver.maximize_window()

20.查看浏览器的名字
方法:name
实例:drvier.name

21.返回当前会话中的cookies
方法:get_cookies()
实例:driver.get_cookies()

22.根据cookie name 查找映射Value值
方法:driver.get_cookie(cookie_name)
实例:driver.get_cookie("NET_SessionId")

23.截取当前页面
方法:save_screenshot(filename)
实例:driver.save_screenshot("D:\\Program Files\\Python27\\NM.bmp")

selenium中查找页面元素的方法

driver.find_element_by_id()----通过id进行查找
input = driver.find_element_by_css_selector(’#kw’)—通过css选择器进行查找
driver.find_element_by_xpath()----通过xpath进行查找。

用selenium+phantomjs来请页面的流程

from selenium import webdriver
	1.创建driver对象
	driver = webdriver.Phantomjs()
	
	2.请求url
	driver.get(url)
	
	3.等待。
	time.sleep(5)
		等待有三种:
		文档:selenium的三种等待.note
		链接:http://note.youdao.com/noteshare?id=8f6a0765e4017a4140a05485a9d80a48&sub=48D9761ED13A49EDAC64D180C83406131)强制等待:
			time.sleep(10)
		 (2)隐式等待
			driver.implicitly_wait(10) 
			隐式等待就是等到页面全部加载完成,比如js,css或者图片全请求到加载到页面,也就是我们常看到的页面不在转圈圈为止,程序才会继续运行。
		 (3)显示等待。
			from selenium.webdriver.support.wait import WebDriverWait
			from selenium.webdriver.support import expected_conditions as EC
			from selenium.webdriver.common.by import By
			步骤:
				1.创建等待对象
				wait = WebDriverWait(
					driver,#浏览器驱动对象
					10,最大等待时长
					0.5,扫描间隔
				)
				2.wait.until(等待条件)--->等待条件成立程序才继续运行。
					等待条件在selenium中有个专门的模块来设置了一些条件---expected_conditions as EC
					最常用的条件有一下两个:
						EC.presence_of_element_located
						EC.presence_of_all_elements_located
						这两个条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')
						一个只要一个符合条件的元素加载出来就通过;
						另一个必须所有符合条件的元素都加载出来才行
					EC.presence_of_element_located(locator对象也就是定位器)
					licator对象是一个元组(
							通过什么来查找,--By.ID,By.XPATH,By.CSS_SELECTOR
							‘查找的内容的语法’)
				3.wait.until方法的返回值是一个对应定位器所定位到的webelement对象。你如果需要对这个webelment对象做一些点击或者其他操作,可以很方便的做到。
	4.获取页面内容
	html = driver.page_source
	
	5.1用lxml模块解析页面内容       5.2或者用正则查找所需要的内容
	tree = etree.HTML(html)       pattern=re.compile(r'正则语法')
	tree.xpath(xpath语法)          pattern.search(html)


例子:
import requests,time
from lxml import etree
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from urllib import parse  #parse可以将字典里面的参数拼接到路由上

class Douban(object):
    def __init__(self,url):
        self.url=url
        self.driver=webdriver.PhantomJS()
        self.wait=WebDriverWait(self.driver,10)
        self.parse()

    def get_text(self,text):
        if text:
            return text[0]
        return ''

    def get_content_by_selenium(self,url,xpath):
        self.driver.get(url)
        # 等待
        # time.sleep(3)
        # 等到什么完成,until方法里面就是一些条件。
        # locator对象是一个元组
        webelement=self.wait.until(EC.presence_of_all_elements_located((By.XPATH,xpath)))  #返回的是一个webelement对象
        # webelement.click()
        return self.driver.page_source

    def parse(self):
        html_str=self.get_content_by_selenium(self.url,'//div[@id="root"]/div/div/div/div')
        html = etree.HTML(html_str)
        div_list = html.xpath('//div[@id="root"]/div/div/div/div/div')
        for div in div_list:
            item = {}
            '''
            图书名称
            评分
            评价数
            详情页链接
            作者
            出版社
            价格
            出版日期
            '''
            name = self.get_text(div.xpath('.//div[@class="title"]/a/text()'))
            scores = self.get_text(div.xpath('.//span[@class="rating_nums"]/text()'))
            comment_num = self.get_text(div.xpath('.//span[@class="pl"]/text()'))
            detail_url = self.get_text(div.xpath('.//div[@class="title"]/a/@href'))
            if all([name, detail_url]):  # 两个都为真
                item['name'] = name
                item['scores'] = scores
                item['comment_num'] = comment_num
                item['detail_url'] = detail_url
                print(item)


if __name__=="__main__":
    kw="python"
    base_url = 'https://search.douban.com/book/subject_search?'
    params = {
        'search_text': kw,
        'cat': '1001',
        'start': '0',
    }
    url=base_url+parse.urlencode(params)
    Douban(url)
	

selenium的三种等待

	1. 强制等待
	第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间。
	from selenium import webdriver
	from time import sleep
	driver = webdriver.Firefox()
	driver.get('https://huilansame.github.io')
	sleep(3) # 强制等待3秒再执行下一步
	print driver.current_url
	driver.quit()
	这种叫强制等待,不管你浏览器是否加载完了,程序都得等待3秒,3秒一到,继续执行下面的代码,作为调试很有用,有时候也可以在代码里这样等待,不过不建议总用这种等待方式,太死板,严重影响程序执行速度。


	
	2. 隐性等待
	from selenium import webdriver
	driver = webdriver.Firefox()
	driver.implicitly_wait(30) # 隐性等待,最长等30秒
	driver.get('https://huilansame.github.io')
	print driver.current_url
	driver.quit()
	   隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。
	   注意这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步,我想等我要的元素出来之后就下一步怎么办?有办法,这就要看selenium提供的另一种等待方式——显性等待wait了。


    
	3. 显性等待
	第三种办法就是显性等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
	from selenium import webdriver
	from selenium.webdriver.support.wait import WebDriverWait
	from selenium.webdriver.support import expected_conditions as EC
	from selenium.webdriver.common.by import By
	driver = webdriver.Firefox()
	# 隐性等待和显性等待可以同时用,但要注意:等待的最长时间取两者之中的大者
	driver.implicitly_wait(10) 
	
	driver.get('https://huilansame.github.io')
	locator = (By.LINK_TEXT, 'CSDN')
	try:
	    wait = WebDriverWait(driver, 20, 0.5)
	    wait.until(EC.presence_of_element_located(locator))
	    print(driver.find_element_by_link_text('CSDN').get_attribute('href'))
	finally:
	driver.close()


			4、expected_conditions
			expected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件:
			4.1
			EC.title_is
			EC.title_contains
			这两个条件类验证title,验证传入的参数title是否等于或在driver.title中
			4.2
			EC.presence_of_element_located((By.CSS_SELECTOR,'.ui-page > wrap'))
			EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.ui-page'))
			这两个条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')
			一个只要一个符合条件的元素加载出来就通过;
			另一个必须所有符合条件的元素都加载出来才行
			4.3
			EC.visibility_of_element_located
			EC.invisibility_of_element_located
			EC.visibility_of
			这三个条件验证元素是否可见
			前两个传入参数是元组类型的locator,第三个传入WebElement
			第一个和第三个其实质是一样的
			4.4
			EC.text_to_be_present_in_element
			EC.text_to_be_present_in_element_value
			这两个判断某段文本是否出现在某元素中
			一个判断元素的text,一个判断元素的value属性
			4.5
			EC.frame_to_be_available_and_switch_to_it
			这个条件判断frame是否可切入,
			可传入locator元组或者直接传入定位方式:id、name、index或WebElement
			4.6
			#这个条件判断是否有alert出现
			EC.alert_is_present
			#这个条件判断元素是否可点击,传入locator
			EC.element_to_be_clickable
			#这四个条件判断元素是否被选中,
			第一个条件传入WebElement对象,第二个传入locator元组
			#第三个传入WebElement对象以及状态,相等返回True,否则返回False
			#第四个传入locator以及状态,相等返回True,否则返回False
			EC.element_to_be_selected
			EC.element_located_to_be_selected
			EC.element_selection_state_to_be
			EC.element_located_selection_state_to_be
			#最后一个条件判断一个元素是否仍在页面中,传入WebElement对象,可以判断页面是否刷新
			EC.staleness_of

补充:

1.  可迭代对象和迭代器:
    可迭代对象就是有__iter__属性的对象

    迭代器:有__next__属性的对象

    两个能转化吗:
	iter(可迭代对象)-----》迭代器。
	
可迭代对象有哪些:
	list
	dict
	tuple
	str
	bytes
	set
	迭代器
	生成器
	文件流

如何打印一个文件同时输出行号。	
fp = open('shabei_spider.py','r',encoding='utf-8')
print(fp)
#如何输出行号。
for i,c in enumerate(fp,1):
	print(i,c)

2.	replace() 将字符串内容替换
  # https://music.163.com/artist/desc?id=1881
    # https://music.163.com/artist/?id=1881
    url=singer_urls[i].replace('?id','desc?id')



3.  enumerate(可迭代对象,数字)
for i,name in enumerate(singer_names):   #enumerate(可迭代对象,数字)  枚举的方法,里面的第一个参数是可迭代对象,第二个参数是表示从第几位开始,默认从0开始。前面i的值就为0,1,2,3,4.....
    item={}
    item['name']=name
    item['url']=singer_urls[i]


4.  join(列表)  将列表里的数据合并,前面写什么就用什么将其合并
desc_list = html.xpath('//div[@class="n-artdesc"]/p/text()')
desc = ''.join(desc_list)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值