python爬虫第六天(selenium+phantomjs)

mac2026-04-16  2

第六天

selenium操作浏览器的方法selenium常用方法总结selenium中查找页面元素的方法用selenium+phantomjs来请页面的流程selenium的三种等待

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, '') try: wait = WebDriverWait(driver, 20, 0.5) wait.until(EC.presence_of_element_located(locator)) print(driver.find_element_by_link_text('').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)