zoukankan      html  css  js  c++  java
  • 4 中文乱码 selenium的使用

     # 中文乱码

    #处理中文乱码
    import requests
    from lxml import etree
    from urllib import request
    url = 'http://pic.netbian.com/4kqiche/'
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
    }
    response = requests.get(url=url,headers=headers)  #响应
    #手动设置响应数据的编码
    # response.encoding = 'utf-8'
    page_text = response.text
    tree = etree.HTML(page_text)  #实例化
    li_list = tree.xpath('//div[@class="slist"]/ul/li')
    for li in li_list:
        img_src = li.xpath('./a/img/@src')[0]  
        img_name = li.xpath('./a/b/text()')[0]
        # 通用性
        img_name = img_name.encode('iso-8859-1').decode('gbk')    #西欧  向下兼容ascii   一般浏览器默认的文本编码格式 
        request.urlretrieve(url="http://pic.netbian.com"+img_src,filename='./图片/%s.jpg'%img_name)   #相对路径
    #   request.urlretrieve(url="http://pic.netbian.com"+img_src,filename=r'C:spiderday01图片\%s.jpg'%img_name) #绝对路径
        print(img_name,'0k')
    print('OK')
    1 连接池报警 请求头改 Connection: keep-alive 为close
                 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36
    2 代理IP 在IP被封禁后
    3 每次请求之间sleep进行间隔等待
    模拟登陆 -- 爬取基于某些用户的用户信息
    验证码识别:云打码平台  http://www.yundama.com/ 打码兔 超级鹰
    使用流程:
        注册
        登陆:
          普通用户:
            查询剩余提分(充值)  http://www.yundama.com/price.html
          开发者用户:
            创建软件:我的软件-》添加新软件(ID,秘钥)
            下载示例代码:开发文档-》点此下载:云打码接口DLL-》PythonHTTP示例下载        
    代理:代理服务器
      - 快代理
      - 西祠代理
      - goubanjia
    匿名度:
      透明:对方服务器知道你使用了代理ip也知道你的真实ip
      匿名:知道你使用了代理ip但是不知道你的真实ip
      高匿:什么都不知道
    类型:
      http:只可以发起http请求
      https:只可以发起https的请求
    # 代理池
    import
    requests url = 'http://www.baidu.com/s?wd=ip' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' } page_text = requests.get(url=url,headers=headers,proxies={'http':'117.127.0.202:80'}).text with open('./ip.html','w',encoding='utf-8') as fp: fp.write(page_text)

    # 构建代理池
    http_list = [
    {'http':'60.190.250.120:8080'},
    {'http':'60.190.250.120:8080'},
    {'http':'60.190.250.120:8080'}
    ]
    https_list = [
    {'https':'60.190.250.120:8080'},
    {'https':'60.190.250.120:8080'},
    {'https':'60.190.250.120:8080'}
    ]

     #  selenium 自动化

    # 用来完成浏览器自动化相关的操作,可以通过代码的形式制定一些基于浏览器自动化的(行为动作),当代码执行后,浏览器就会自动触发定义的事件.
    - 环境安装:
         pip install selenium
         下载对应浏览器的驱动软件 
            http://chromedriver.storage.googleapis.com/index.html
         查看驱动和浏览器版本的映射关系:
            http://blog.csdn.net/huilan_same/article/details/51896672  
    - 编码流程:
      - 导包
      - 实例化某一款浏览器对象
      - 制定相关行为动作
    Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。另外,也支持无界面浏览器PhantomJS。
    PhantomJS 现在停止维护更新了,不建议使用,在无界面领域,建议google的chrome无头.
    https://www.cnblogs.com/bobo-zhang/p/9685362.html 更多请浏览这个link
    # 简单的百度自动化处理  chromedriver.exe是个软件
    from
    selenium import webdriver # web驱动 显式的自动化浏览器操作 from time import sleep bro = webdriver.Chrome(executable_path='./chromedriver.exe') bro.get('https://www.baidu.com') sleep(2) # 标签定位 tag_input = bro.find_element_by_id('kw') tag_input.send_keys('人民币') btn = bro.find_element_by_id('su') btn.click() sleep(2) bro.quit() # 退出
    from selenium import webdriver  # 显式的Js滚轮操作
    from time import sleep
    bro = webdriver.Chrome(executable_path='./chromedriver.exe')
    bro.get('https://xueqiu.com')
    sleep(5)
    # 执行js实现滚轮向下滑动
    js = "window.scrollTo(0,document.body.scrollHeight)"
    bro.execute_script(js)
    sleep(2)
    bro.execute_script(js)
    sleep(2)
    bro.execute_script(js)
    sleep(2)
    bro.execute_script(js)
    sleep(2)
    bro.execute_script(js)
    sleep(2)
    # 加载更多的处理
    a_tag = bro.find_element_by_xpath('//*[@id="app"]/div[3]/div/div[1]/div[2]/div[2]/a')
    a_tag.click()
    sleep(5)
    # 获取当前浏览器页面数据(动态数据)
    bro.page_source  # 可print
    
    bro.quit() # 退出
    # 一款无可视化的浏览器(免安装)  基于谷歌无头
    # 谷歌无头浏览器
    from selenium import webdriver
    from time import sleep
    from selenium.webdriver.chrome.options import Options
    # 创建一个参数对象,用来控制chrome以无界面模式打开
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    
    bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=chrome_options)
    bro.get('https://www.baidu.com')
    sleep(2)
    bro.save_screenshot('1.png') #拍照截屏
    #标签定位
    tag_input = bro.find_element_by_id('kw')
    tag_input.send_keys('人民币')
    sleep(2)
    
    btn = bro.find_element_by_id('su')  # 找见 百度一下 按钮
    btn.click()  # 点击进行搜索
    sleep(2)
    
    print(bro.page_source)  # 打印页面资源
    bro.quit()  #退出

    # 前进后退

    # 模拟浏览器 前进 后退
    from time import sleep
    from selenium import webdriver
     
    bro=webdriver.Chrome(executable_path='./chromedriver.exe')
    bro.get('https://www.baidu.com')
    sleep(1)
    bro.get('https://www.taobao.com')
    sleep(1)
    bro.get('https://sogou.com')
    sleep(1)
    
    browser.back()  #后退
    sleep(1)
    browser.forward() #前进
    print(bro.page_source) sleep(
    1) bro.close()

    # 动作链  拖动 点击

    #动作链
    from selenium import webdriver
    from time import sleep
    from selenium.webdriver import ChromeOptions
    from selenium.webdriver import ActionChains  #动作链的类
    
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    
    bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=option)
    url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
    bro.get(url=url)
    #如果定位的标签存在于iframe标签之中,则必须经过switch_to(切换参照物)操作在进行标签定位  页面加载的子页面
    bro.switch_to.frame('iframeResult')  # frame的id
    source_tag = bro.find_element_by_id('draggable') # 开始地
    taget_tag = bro.find_element_by_id('droppable')  # 目的地
    #创建一个动作链的对象
    action = ActionChains(bro) #实例化动作链对象 传入浏览器对象
    action.drag_and_drop(source_tag,taget_tag) 
    action.perform()  #执行 
    sleep(3)
    # bro.quit()  # 退出
    # 动作链 简单版
    from selenium import webdriver
    from time import sleep
    from selenium.webdriver import ActionChains  
    bro = webdriver.Chrome(executable_path='./chromedriver.exe')
    url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
    bro.get(url=url)
    #如果定位的标签存在于iframe标签之中,则必须经过switch_to操作在进行标签定位
    bro.switch_to.frame('iframeResult')
    source_tag = bro.find_element_by_id('draggable')
    #创建一个动作连的对象
    action = ActionChains(bro)
    action.click_and_hold(source_tag)
    
    for i in range(4):
        #perform表示开始执行动作链
        action.move_by_offset(20,0).perform() #x,y 水平/垂直像素
        sleep(1)
    bro.quit()

    # 如何规避selenium被检测到?

    正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined。
    而使用selenium访问则该值为true.
    
    只需要设置Chromedriver的启动参数即可解决问题。在启动Chromedriver之前,为Chrome开启实验性功能参数excludeSwitches,
    它的值为[
    'enable-automation'],完整代码如下:
    from selenium.webdriver import Chrome
    from selenium.webdriver import ChromeOptions
    
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    driver = Chrome(options=option)

    # QQ空间的模拟登录

    # 只在没有验证码情况下适用  QQ空间模拟登陆
    from selenium import webdriver
    from time import sleep
    bro = webdriver.Chrome(executable_path='./chromedriver.exe')
    url = 'https://qzone.qq.com'
    bro.get(url=url)
    #如果定位的标签存在于iframe标签之中,则必须经过switch_to操作在进行标签定位
    bro.switch_to.frame('login_frame')
    input_tag = bro.find_element_by_id('switcher_plogin').click()
    bro.find_element_by_id('u').send_keys('576951284')  #这里填写你的QQ号
    bro.find_element_by_id('p').send_keys('')  #这里填写你的QQ号
    bro.find_element_by_id('login_button').click()
    sleep(3)
    print(bro.page_source)
    bro.save_screenshot('zone.png') # 截屏 拍照
    bro.quit()
    # QQ空间模拟
    from selenium import webdriver
    from time import sleep
    bro = webdriver.Chrome(executable_path='./chromedriver.exe')
    url = 'https://qzone.qq.com'
    bro.get(url=url)
    #如果定位的标签存在于iframe标签之中,则必须经过switch_to操作在进行标签定位
    bro.switch_to.frame('login_frame')
    avartar_tag = bro.find_element_by_id('img_out_576951284').click()
    sleep(3)
    print(bro.page_source)
    bro.save_screenshot('zone.png') 
    bro.quit()
  • 相关阅读:
    车辆年检、强险、车船税的关系
    .Net下几种ORM
    Windows 刷新图标命令
    VUE-CLI + AntV G6 兼容IE11
    CentOS 7 下安装 JIRA 8.7 和 Confluence 7.3
    .Net Core,VUE,VS Code,Sql Sugar,Element UI学习笔记
    Nginx 缓存代理
    java对象锁和类锁
    线程的生命周期
    数据库分库分表
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/10817722.html
Copyright © 2011-2022 走看看