python 之 selenium代理设置、无头浏览器设置、页面等待的三种方式

一、selenium

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,也可以页面截屏。

三个都能用

pip install selenium        # 
pip install selenium-wire   #
pip install drissionpage    # 
chromedriver 驱动安装
方式一:http://chromedriver.storage.googleapis.com/index.html
方式二:http://npm.taobao.org/mirrors/chromedriver/

将其拷贝到任意环境变量目录
echo $PATH查看环境变量路径
二、selenium基本操作
  • 查看请求信息

    driver.page_source			获取源码
    driver.get_cookies()		获取浏览器中存储的cookies
    driver.current_url			查看当前url
    driver.title				查看当前标签的标题
    
  • 元素定位方式

    driver.find_element_by_xxx()
    使用场景: 一般用于精确定位一个元素,返回结果为一个element对象
    
    driver.find_elements_by_xxx	()	
    使用场景: 定位一组元素,返回结果为element对象列表 
    
    el = driver.find_element_by_xpath('//div[@class="eeee"]/a') (调用方式
    
    el = driver.find_elements_by_id					使用id值定位
    el = driver.find_elements_by_xpath				使用xpath定位
    el = driver.find_elements_by_tag_name			使用标签名定位
    el = driver.find_elements_by_link_text 			使用文本定位
    el = driver.find_elements_by_partial_link_text 	使用部分文本定位
    el = driver.find_elements_by_name 			    使用name属性值定位
    el = driver.find_elements_by_class_name 		使用class属性值定位
    el = driver.find_elements_by_css_selector		使用css选择器定位 
    
    dirver.find_element_by_css_selector('#名字')
    dirver.find_element_by_css_selector('.s_ipt')
    dirver.find_element_by_css_selector('input')
    dirver.find_element_by_css_selector('[id="kw"]')
    
    # 组合形式
    dirver.find_element_by_css_selector('input.s_ipt')
    dirver.find_element_by_css_selector('input > span > a')
    
    by_link_text()				全部文本且文本包含连接
    by_partial_link_text()		包含某个文本且文本包含链接
    
  • 对定位到的元素的操作

    el.click()						对元素执行点击操作
    el.submit()					    对元素执行提交操作
    el.clear()						清空可输入元素中的数据
    el.send_keys(data)			    向可输入元素输入数据
    
  • 从定位到的元素中提取数据的方法

    el.get_attribute(key)			获取key属性名对应的属性值
    el.text						    获取开闭标签之间的文本内容
    
  • elenium执行js

    js = "window.scrollTo(x,y) "   x为水平拖动距离,y为垂直拖动举例
    
三、selenium等待方式

为什么需要等待
浏览器进行渲染内容过多, 网速太慢
为了提高脚本的稳定性,我们需要在脚本中增加等待时间,否则报错

  • 强制等待

    time.sleep(6)
    
  • 显式等待

    from selenium.webdriver.common.keys import Keys 
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait    #WebDriverWait库  负责循环等待
    from selenium.webdriver.support import expected_conditions as EC    #expected_conditions类   负责条件
    form selenium.common.exceptions import TimeoutException      #超时异常
    

    判断页面是否已经加载出来

    presence_of_all_elements_located
    

    显式等待指定某个条件,然后设置最长等待时间。如果在这段时间还没有找到元素,那么便会抛出异常。

    WebDriverWait(driver,10,0.5).until( 
    	EC.presence_of_element_located((By.ID, "myDynamicElement")
    )
    

    定一一个WebDriver,将浏览器对象放进去,等待10秒,每隔0.5秒去定位一下想要的元素(此处通过id形式,拿myDynamicElement去定位一个元素)

    判断当前的元素是否可以点击
    WebDriverWait(driver, 10, 0.5).until( 
    	EC.element_to_be_clickable((By.ID, "myDynamicElement")
    	)
    
  • 隐式等待

    就是简单地设置一个最大等待时间,单位为秒, 所有的元素定位操作都会使用该时间

    driver.implicitly_wait(10)
    
四、 无头浏览器、frame应用与设置
  • 无头浏览器
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.common.by import By
    
    
    #创建一个无头浏览器对象
    chrome_options = Options()
    #设置它为无框模式
    chrome_options.add_argument('--headless')
    #如果在windows上运行需要加代码
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument("--proxy-server=http://代理服务器地址:代理服务器端口号")
    browser = webdriver.Chrome(chrome_options=chrome_options)
    
  • selenium 在frame应用
    browser.get('http://gn.gov.cn/Infd.aspx?TenderProject=Co%3D')
    browser.find_element_by_id('bidderNoticeInfos').click()
    reference = browser.switch_to.frame("frame")
    print(browser.page_source)
    
五、selenium在scrapy中简单使用

middlewars.py

import time

from selenium import webdriver
from scrapy.http import HtmlResponse

class SeliniumMilldewares(object):
    def process_request(self, request, spider):
        url = request.url
        # 判断页面是否需要渲染
        if 'monthdata' in url:     #用来判断具体的url请求使用selinium
            dr = webdriver.Chrome()
            # 有可能页面加载完了,数据还没加载完
            dr.get(url)
            time.sleep(7)
            data = dr.page_source       #用于获取渲染之后的源码
            # 关闭浏览器
            dr.close()
            # 构建响应
            res = HtmlResponse(
                url= url,
                request=request,
                body=data.encode(),
                encoding="utf-8",
            )
            return res

在setting配置一下就可以了

六、其他
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException


driver = webdriver.Chrome()       
wait = WebDriverWait(driver, 3, 3)

def login_felima(loginname, loginpassword):
    driver.get('http://www.****.com/')

    try:
        name = wait.until(EC.presence_of_element_located((By.ID,'loginname')))
        name.send_keys('{}'.format(loginname))

        password = wait.until(EC.presence_of_element_located((By.ID, 'loginpassword')))
        password.send_keys('{}'.format(loginpassword))

        submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="logFrm"]/div[4]/input')))
        submit.click()

        captcha = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="account"]')))[0]
        captcha.click()


        wait.until(EC.presence_of_element_located((By.ID, 'keyword'))).clear()

        p = WebDriverWait(driver, 3, 3).until(EC.presence_of_element_located((By.ID, 'show_info'))).text
        phone = WebDriverWait(driver, 3, 3).until(EC.presence_of_element_located((By.ID, 'txtPhone'))).get_attribute('value')
        element = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located(By.ID, 'mydynmicElement'))

        # 判断页面是否加载出来
        #presence_of_all_elements_located
        #element_to_be_clickable


    except TimeoutException:

        return login_felima(loginname, loginpassword)

def main():
    loginname = ''
    loginpassword = ''
    login_felima(loginname, loginpassword)

if __name__ == '__main__':
    main()
爬虫Python学习是指学习如何使用Python编程语言来进行网络爬取和数据提取的过程。Python是一种简单易学且功能强大的编程语言,因此被广泛用于爬虫开发。爬虫是指通过编写程序自动抓取网页上的信息,可以用于数据采集、数据分析、网站监测等多个领域。 对于想要学习爬虫的新手来说,Python是一个很好的入门语言。Python的语法简洁易懂,而且有丰富的第三方库和工具,如BeautifulSoup、Scrapy等,可以帮助开发者更轻松地进行网页解析和数据提取。此外,Python还有很多优秀的教程和学习资源可供选择,可以帮助新手快速入门并掌握爬虫技能。 如果你对Python编程有一定的基础,那么学习爬虫并不难。你可以通过观看教学视频、阅读教程、参与在线课程等方式来学习。网络上有很多免费和付费的学习资源可供选择,你可以根据自己的需求和学习风格选择适合自己的学习材料。 总之,学习爬虫Python需要一定的编程基础,但并不难。通过选择合适的学习资源和不断实践,你可以逐步掌握爬虫的技能,并在实际项目中应用它们。 #### 引用[.reference_title] - *1* *3* [如何自学Python爬虫? 零基础入门教程](https://blog.csdn.net/zihong523/article/details/122001612)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [新手小白必看 Python爬虫学习路线全面指导](https://blog.csdn.net/weixin_67991858/article/details/128370135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风华浪浪

讨个老婆本呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值