浏览器抓取网页

浏览器抓取网页

汇总:selenium控制浏览器获取数据(java 版本)

网站优化优采云 发表了文章 • 0 个评论 • 119 次浏览 • 2022-09-24 19:05 • 来自相关话题

  汇总:selenium控制浏览器获取数据(java 版本)
  
  前段时间,突然更新了一个数据源网站,原来通过websocket爬取的数据突然变成了gg。没有办法,只能用最原创的方法来爬取想要的数据。我爬过很多网站数据,这里就不讨论爬虫的合理性和合法性了。纯分享一点我知道的技术网站大致分为三种(对于爬虫)⒈网站直接通过接口获取数据(json和pages)。简单的事情就是通过传递一些参数来获取不同的数据,这是最简单的。通过requests模块,你可以很方便的得到你想要的数据。 JSON数据说起来容易,直接解析JSON就好了。另一个是接口返回网页的源代码,稍微麻烦一点,也不难。 scrapy框架好用,xpath也是神器。简单的学习,爬一个网站不成问题。 ⒉第二
  
  秘密武器:爬虫神器之selenium的使用
  目录
  Selenium 介绍及安装
  Selenium 是一个用于 Web 的自动化测试工具,最初是为 网站 自动化测试而开发的。类型就像我们用来玩游戏的按键精灵,可以根据指定的指令自动操作。不同之处在于 Selenium 可以直接在浏览器上运行。对,它支持所有主流浏览器(包括 PhantomJS 这些无接口浏览器)。
  根据我们的说明,Selenium 可以让浏览器自动加载页面,获取所需的数据,甚至对页面进行截图,或者判断 网站 上的某些动作是否发生。
  Selenium 没有自己的浏览器,不支持浏览器的功能。它需要与第三方浏览器结合使用。但是我们有时需要让它在代码中内联运行,所以我们可以用一个叫做 PhantomJS 的工具来代替真正的浏览器。
  PyPI网站下载Selenium库嗯,也可以使用第三方管理器Selenium官方参考文档:o/index.html
  安装
  pip install selenium
  安装 Firefox geckodriver
  安装最新版本的 Firefox 并将 Firefox 可执行文件添加到系统环境变量中。记得关闭火狐的自动更新
  firefox下载地下:es把下载的geckodriver.exe放到路径D:\Python\python_version\
  安装 ChromeDriver
  注意版本号要对应
  测试代码
  # 导入 webdriver
from selenium import webdriver
# 要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys importKeys
# 调用环境变量指定的PhantomJS浏览器创建浏览器对象
driver = webdriver.Chrome()
# 如果没有在环境变量指定PhantomJS位置
# driver = webdriver.Chrome(executable_path="./phantomjs"))
# get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2)
driver.get("http://www.baidu.com/")
# 打印网页渲染后的源代码
print(driver.page_source)
# 生成新的页面快照
driver.save_screenshot("python爬虫.png")
# 获取当前url
print(driver.current_url)
# 关闭浏览器
driver.quit()
  selenium 控制浏览器
  最大化窗口
  我们知道调用启动的浏览器不是全屏的,所以不会影响脚本的执行,但是有时候会影响我们的“watch”脚本的执行。
  browser = webdriver.Chrome()
url= 'http://www.baidu.com'
browser.get(url)
borwser.maximize_window()
  设置宽度和高度
  最大化还是不够灵活,可以自由设置浏览显示的宽高吗?当然这是可能的。
  browser = webdriver.Chrome()
url= 'http://www.baidu.com'
browser.get(url)
borwser.set_window_size(500,600)
  浏览器前进后退
  浏览器上有后退和前进按钮,对于浏览网页的人来说更方便;对于做web自动化测试的同学来说应该算是一道难题。事实上,这很简单。下面我们来看看python的实现。
  browser = webdriver.Chrome()#访问百度首页
first_url= 'http://www.baidu.com'
browser.get(first_url)
time.sleep(2)#访问新闻页面
second_url='http://news.baidu.com'
browser.get(second_url)
time.sleep(2)#返回(后退)到百度首页print "back to %s "%(first_url)
browser.back()
time.sleep(1) #前进到新闻页print "forward to %s"%(second_url)
browser.forward()
time.sleep(2)
browser.quit()
  硒元素定位
  对象定位应该是自动化的核心。要操作一个对象,首先要识别对象。一个对象就像一个人,他会有各种各样的特征(属性),比如我们可以通过一个人的身份证号、姓名,或者他住在哪条街、哪个楼层、哪个门牌号来找到这个人。
  物体定位
  webdriver提供对象定位方法
  使用 By 类确定选择哪种方法
  from selenium.webdriver.common.by import By
chrome.find_element(by=By.ID,value='su')
  By类的一些属性如下
  动作元素
  如前所述,很多知识是一个定位元素。定位只是第一步。定位后,需要对该元件进行操作。鼠标点击还是键盘输入取决于我们定位的是按钮还是输入框。
  一般来说,webdriver中比较常用的操作对象的方法有以下几种:
  from selenium import webdriver
from selenium.webdriver.chrome.service
import Service
from time import sleep
from selenium.webdriver.common.by import By
def test_element():
# 创建驱动对象
s =Service(executable_path='./chromedriver.exe')
# 创建一个浏览器
driver = webdriver.Chrome(service=s)
# 打个百度
driver.get('https://cn.bing.com/')
sleep(2)
# 获取 搜索框,并输出“学习”
driver.find_element(By.ID,'sb_form_q').send_keys('学习')
sleep(1)
# 获取 搜索按钮,并点击

driver.find_element(By.ID,'search_icon').click()
if __name__ =='__main__':
test_element()
  selenium 定位下拉菜单
  包括下拉菜单页面
  


Level Locate




Level locate



Link1

Action
Another action
Something else here

Separated link







Link2

Action
Another action
Something else here

Separated link






  选定的元素
  from selenium import webdriver
from selenium.webdriver.chrome.service
import Service
from selenium.webdriver.common.by import By
import os
from time import sleep
def test_down_menu():
# 创建一个驱动
s =Service(executable_path='./chromedriver.exe')
# 创建浏览器
driver = webdriver.Chrome(service=s)
# 设置方位的文件地址
file_path = 'file:///'+os.path.abspath('./html/test01.html')
# 访问页面
driver.get(file_path)
# 定位父级元素

driver.find_element(By.LINK_TEXT,'Link1').click()
# 找到要移动的位置
menu = driver.find_element(By.LINK_TEXT,'Action')
# 做一个移动光标的动作
# 定义一个动作在driver 移动到menu的位置 执行动作

webdriver.ActionChains(driver).move_to_element(menu).perform()
# sleep(2)
# 定位子级元素
menu.click()
# 睡眠2秒
sleep(2)
# 关闭浏览器
driver.quit()
if __name__ == '__main__':
test_down_menu()
  硒级定位
  窗口定位
  对于一个现代的web应用来说,往往会有框架(frame)或者窗口(window)的应用,这给我们的定位带来了一个难题。有时候我们定位一个元素,定位器没有问题,但是一直无法定位。这时,我们需要检查元素是否在一个框架中。Seelnium webdriver提供了switch_to_frame方法,可以轻松解决这个问题。
  多层框架或窗口的定位:driver.switch_to.frame()
  框架.html
  

frame




frame


  内部.html
  

inner


inner


  switch_to_frame()
  from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
import os
from time import sleep
def select_frame():
# 创建驱动
s = Service(executable_path='./chromedriver.exe')
# 创建浏览器
driver = webdriver.Chrome(service=s)
file_path = 'file:///' + os.path.abspath('./html/outer.html')
# 打开网页
driver.get(file_path)
# 切换frame
driver.switch_to.frame('f1')
driver.switch_to.frame('f2')
# 定位元素,输入要搜索的内容
driver.find_element(By.ID,'sb_form_q').send_keys('百战')
# 定位按钮,点击搜索
driver.find_element(By.ID,'search_icon').click()
sleep(3)
driver.quit()
if __name__ =='__main__':
select_frame()
  selenium 处理下拉框
  爬取数据时,有时数据过多,官网提供了过滤功能select标签。对于这样的数据,我们只需要定位元素并点击它。
  drop_down.html
  


UPS Next Day Air ==> $12.51
UPS Next Day Air Saver ==> $11.61
UPS 3 Day Select ==> $10.69
UPS 2nd Day Air ==> $9.03
UPS Ground ==> $8.34
USPS Priority Mail Insured ==> $9.25
USPS Priority Mail ==> $7.45
USPS First Class ==> $3.20


UPS Next Day Air ==> $12.51
UPS Next Day Air Saver ==> $11.61
UPS 3 Day Select ==> $10.69
UPS 2nd Day Air ==> $9.03
UPS Ground ==> $8.34
USPS Priority Mail Insured ==> $9.25
USPS Priority Mail ==> $7.45
USPS First Class ==> $3.20


  from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import os
def choose_option():
# 创建驱动
s = Service('./chromedriver.exe')
# 创建浏览器对象
driver = webdriver.Chrome(service=s)
# 访问页面
# 设置页面地址
file_path = 'file:///' + os.path.abspath('./html/test02.html')
driver.get(file_path)
# 定位下拉框里面选项
sleep(2)
driver.find_element(By.XPATH,'//select[@id="ShippingMethod"]/option[@value="10.69"]').click()
sleep(2)
driver.find_element(By.XPATH,'//select[@id="ShippingMethod2"]/option[@value="9.25"]').click()
# 关闭浏览器
sleep(5)
driver.quit()
if __name__ == '__main__':
choose_option()
  selenium 处理弹出窗口
  有时,页面可能要弹出窗口。只需转到定位弹出窗口上的“确定”按钮
  html
  

This is a page

Hello,Python Spider

alert('这个是测试弹窗')
  from lib2to3.pgen2 import driver
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from time import sleep
import os
def test_windows():
# 创建驱动对象
s = Service('./chromedriver.exe')
# 创建浏览器
driver = webdriver.Chrome(service=s)
# 访问页面
# 设置页面地址
file_path = 'file:///' + os.path.abspath('./html/test03.html')
driver.get(file_path)
sleep(3)
# 定位弹出窗口,并点击
driver.switch_to.alert.accept()
sleep(3)
driver.quit()
if __name__ =='__main__':
test_windows()
  selenium 拖放元素
  要完成元素的拖拽,首先需要指定被拖拽元素和拖拽目标元素,然后使用ActionChains类来实现,ActionChains用于自定义动作。通过 ActionChains 对象中的 perform() 执行动作,
  html
  


jQuery UI Draggable - Auto-scroll


#draggable, #draggable2, #draggable3 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; }
body {font-family: Arial, Helvetica, sans-serif;}
table {font-size: 1em;}
.ui-draggable, .ui-droppable {background-position: top;}




$( function() {
$( "#draggable" ).draggable({ scroll: true });
$( "#draggable2" ).draggable({ scroll: true, scrollSensitivity: 100 });
$( "#draggable3" ).draggable({ scroll: true, scrollSpeed: 100 });
} );

<p>Scroll set to true, default settings

  scrollSensitivity set to 100

  scrollSpeed set to 100
</p>
  Python
  from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import os
<p>
def test_drop():
# 创建驱动对象
s = Service(&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
# 访问页面
# 设置页面地址
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/test04.html&#39;)
driver.get(file_path)
# 定位要拖拽的元素
div1 = driver.find_element(By.ID,&#39;draggable&#39;)
div2 = driver.find_element(By.ID,&#39;draggable2&#39;)
div3 = driver.find_element(By.ID,&#39;draggable3&#39;)
# 开始拖拽
# 定义事件
sleep(2)
webdriver.ActionChains(driver).drag_and_drop(div1,div2).perform()
for i in range(10):
webdriver.ActionChains(driver).drag_and_drop_by_offset(div3,10,10).perform()
sleep(0.5)
# 关闭浏览器
sleep(3)
driver.quit()
if __name__ ==&#39;__main__&#39;:
test_drop()</p>
  selenium 调用 js 方法
  有时候我们需要控制页面滚动条上的滚动条,但是滚动条并不是页面上的一个元素。这时候我们需要使用js来操作
  滚动条的操作一般有两种场景:
  调用js方法
  execute_script(script, *args)
  滚动条回到顶部:
  js="document.getElementById(&#39;id&#39;).scrollTop=0"
driver.execute_script(js)
  滚动条到底部
  js="document.documentElement.scrollTop=10000"
driver.execute_script(js)
  可以修改scrollTop的值,使滚动条位于右侧,0为顶部,10000为底部
  以上方法在火狐和IE浏览器上都可以,但是用Chrome浏览器,我发现不行。Chrome浏览器解决方案:
  js = "document.body.scrollTop=0"
driver.execute_script(js)
  水平滚动条
  js = "window.scrollTo(100,400)"
driver.execute_script(js)
  硒等待元素
  被迫等待
  使用时间.sleep
  功能:当代码运行到强制等待的那一行时,无论什么原因,都强制等待指定时间,需要通过time模块实现
  优点:简单
  缺点:无法做出有效判断,会浪费时间
  隐式等待
  chrome.implicitly_wait(time_num)
  过了一定时间,发现元素还没有加载,继续等待我们指定的时间。如果超过指定时间还没有加载,就会抛出异常。如果它没有等待就已经加载,它将立即执行。
  优点:设置一次
  缺点:必须等待加载完成才能进行后续操作,或者等待超时才能进行后续操作
  显示等待
  从 selenium.webdriver.support.wait 导入 WebDriverWait
  指定等待条件并指定最长等待时间。在这段时间内判断是否满足等待条件。如果是真的,它会立即返回。如果不是真的,它将一直等待,直到等待您指定的最长等待时间。如果仍然不满足则抛出异常,如果满足则正常返回
  优点:专门用于等待指定元素,加载后可以运行后续代码
  缺点:需要设置多个元素分别等待
  url = &#39;https://www.guazi.com/nj/buy/&#39;
driver = webdriver.Chrome()
driver.get(url)
wait = WebDriverWait(driver,10,0.5)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, &#39;next&#39;)))
print(driver.page_source)
  selenium 参数用法
  包括无头模式、代理模式、绕过检测
  from selenium.webdriver.chrome.service import Service
from selenium.webdriver import Chrome,ChromeOptions,DesiredCapabilities
from time import sleep
def test_headless():
# 设置参数,将浏览器隐藏起来(无头浏览器)
options = ChromeOptions()
options.add_argument(&#39;--headless&#39;)
# 设置驱动
service = Service(&#39;./chromedriver&#39;)
# 启动Chrome浏览器
driver = Chrome(service=service,options=options)
# 访问页面
driver.get(&#39;https://www.baidu.com&#39;)
# 打印代码
print(driver.page_source)
# 关闭浏览器
driver.quit()
def test_proxy1():
# 设置参数,给浏览器设置代理
options = ChromeOptions()
# options.add_argument(&#39;--proxy-server=http://ip:port&#39;)
options.add_argument(&#39;--proxy-server=http://221.199.36.122:35414&#39;)
# 设置驱动
service = Service(&#39;./chromedriver&#39;)
# 启动Chrome浏览器
driver = Chrome(service=service,options=options)
# 访问页面 "134.195.101.16",
driver.get(&#39;http://httpbin.org/get&#39;)
# 打印代码
print(driver.page_source)
# 关闭浏览器
driver.quit()
def test_proxy2():
from selenium.webdriver.common.proxy import ProxyType,Proxy
# 设置参数,给浏览器设置代理
ip = &#39;http://113.76.133.238:35680&#39;
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = ip
proxy.ssl_proxy = ip
# 关联浏览器
capabilities = DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
# 设置驱动
service = Service(&#39;./chromedriver&#39;)
# 启动Chrome浏览器
driver = Chrome(service=service,desired_capabilities=capabilities)
# 访问页面 "134.195.101.16",
driver.get(&#39;http://httpbin.org/get&#39;)
# 打印代码
print(driver.page_source)
# 关闭浏览器
driver.quit()
def test_find():
options = ChromeOptions()
options.add_experimental_option(&#39;excludeSwitches&#39;, [&#39;enable-automation&#39;])
options.add_experimental_option(&#39;useAutomationExtension&#39;, False)
chrome = Chrome(chrome_options=options)
chrome.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, &#39;webdriver&#39;, {
get: () => false
})
"""
})
chrome.get(&#39;http://httpbin.org/get&#39;)
info = chrome.page_source
print(info)
sleep(20)
if __name__ ==&#39;__main__&#39;:
# test_headless()
# test_proxy1()
# test_proxy2()
test_find()
  硒实用案例
  from selenium.webdriver.chrome.service import Service
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from lxml import etree
def spider_huya():
# 创建一个驱动
service = Service(&#39;./chromedriver.exe&#39;)
# 创建一个浏览器
driver = Chrome(service=service)
# 设置隐式等待
driver.implicitly_wait(5)
# 访问网址
driver.get(&#39;https://www.huya.com/g/lol&#39;)
count = 1
while True:
# print(&#39;获取了第%d页&#39; % count)
# count += 1
# 提取数据
e = etree.HTML(driver.page_source)
names = e.xpath(&#39;//i[@class="nick"]/@title&#39;)
person_nums = e.xpath(&#39;//i[@class="js-num"]/text()&#39;)
# 打印数据
# for n,p in zip(names,person_nums):
# print(f&#39;主播名:{n} 人气:{p}&#39;)

# 找到下一页的按钮
# try:
# next_btn = driver.find_element(By.XPATH,&#39;//a[@class="laypage_next"]&#39;)
# next_btn.click()
# except Exception as e:
# break
if driver.page_source.find(&#39;laypage_next&#39;) == -1:
break
next_btn = driver.find_element(By.XPATH,&#39;//a[@class="laypage_next"]&#39;)
next_btn.click()

# 关闭浏览器
driver.quit()
if __name__ == &#39;__main__&#39;:
spider_huya() 查看全部

  汇总:selenium控制浏览器获取数据(java 版本)
  
  前段时间,突然更新了一个数据源网站,原来通过websocket爬取的数据突然变成了gg。没有办法,只能用最原创的方法来爬取想要的数据。我爬过很多网站数据,这里就不讨论爬虫的合理性和合法性了。纯分享一点我知道的技术网站大致分为三种(对于爬虫)⒈网站直接通过接口获取数据(json和pages)。简单的事情就是通过传递一些参数来获取不同的数据,这是最简单的。通过requests模块,你可以很方便的得到你想要的数据。 JSON数据说起来容易,直接解析JSON就好了。另一个是接口返回网页的源代码,稍微麻烦一点,也不难。 scrapy框架好用,xpath也是神器。简单的学习,爬一个网站不成问题。 ⒉第二
  
  秘密武器:爬虫神器之selenium的使用
  目录
  Selenium 介绍及安装
  Selenium 是一个用于 Web 的自动化测试工具,最初是为 网站 自动化测试而开发的。类型就像我们用来玩游戏的按键精灵,可以根据指定的指令自动操作。不同之处在于 Selenium 可以直接在浏览器上运行。对,它支持所有主流浏览器(包括 PhantomJS 这些无接口浏览器)。
  根据我们的说明,Selenium 可以让浏览器自动加载页面,获取所需的数据,甚至对页面进行截图,或者判断 网站 上的某些动作是否发生。
  Selenium 没有自己的浏览器,不支持浏览器的功能。它需要与第三方浏览器结合使用。但是我们有时需要让它在代码中内联运行,所以我们可以用一个叫做 PhantomJS 的工具来代替真正的浏览器。
  PyPI网站下载Selenium库嗯,也可以使用第三方管理器Selenium官方参考文档:o/index.html
  安装
  pip install selenium
  安装 Firefox geckodriver
  安装最新版本的 Firefox 并将 Firefox 可执行文件添加到系统环境变量中。记得关闭火狐的自动更新
  firefox下载地下:es把下载的geckodriver.exe放到路径D:\Python\python_version\
  安装 ChromeDriver
  注意版本号要对应
  测试代码
  # 导入 webdriver
from selenium import webdriver
# 要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys importKeys
# 调用环境变量指定的PhantomJS浏览器创建浏览器对象
driver = webdriver.Chrome()
# 如果没有在环境变量指定PhantomJS位置
# driver = webdriver.Chrome(executable_path="./phantomjs"))
# get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2)
driver.get("http://www.baidu.com/";)
# 打印网页渲染后的源代码
print(driver.page_source)
# 生成新的页面快照
driver.save_screenshot("python爬虫.png")
# 获取当前url
print(driver.current_url)
# 关闭浏览器
driver.quit()
  selenium 控制浏览器
  最大化窗口
  我们知道调用启动的浏览器不是全屏的,所以不会影响脚本的执行,但是有时候会影响我们的“watch”脚本的执行。
  browser = webdriver.Chrome()
url= &#39;http://www.baidu.com&#39;
browser.get(url)
borwser.maximize_window()
  设置宽度和高度
  最大化还是不够灵活,可以自由设置浏览显示的宽高吗?当然这是可能的。
  browser = webdriver.Chrome()
url= &#39;http://www.baidu.com&#39;
browser.get(url)
borwser.set_window_size(500,600)
  浏览器前进后退
  浏览器上有后退和前进按钮,对于浏览网页的人来说更方便;对于做web自动化测试的同学来说应该算是一道难题。事实上,这很简单。下面我们来看看python的实现。
  browser = webdriver.Chrome()#访问百度首页
first_url= &#39;http://www.baidu.com&#39;
browser.get(first_url)
time.sleep(2)#访问新闻页面
second_url=&#39;http://news.baidu.com&#39;
browser.get(second_url)
time.sleep(2)#返回(后退)到百度首页print "back to %s "%(first_url)
browser.back()
time.sleep(1) #前进到新闻页print "forward to %s"%(second_url)
browser.forward()
time.sleep(2)
browser.quit()
  硒元素定位
  对象定位应该是自动化的核心。要操作一个对象,首先要识别对象。一个对象就像一个人,他会有各种各样的特征(属性),比如我们可以通过一个人的身份证号、姓名,或者他住在哪条街、哪个楼层、哪个门牌号来找到这个人。
  物体定位
  webdriver提供对象定位方法
  使用 By 类确定选择哪种方法
  from selenium.webdriver.common.by import By
chrome.find_element(by=By.ID,value=&#39;su&#39;)
  By类的一些属性如下
  动作元素
  如前所述,很多知识是一个定位元素。定位只是第一步。定位后,需要对该元件进行操作。鼠标点击还是键盘输入取决于我们定位的是按钮还是输入框。
  一般来说,webdriver中比较常用的操作对象的方法有以下几种:
  from selenium import webdriver
from selenium.webdriver.chrome.service
import Service
from time import sleep
from selenium.webdriver.common.by import By
def test_element():
# 创建驱动对象
s =Service(executable_path=&#39;./chromedriver.exe&#39;)
# 创建一个浏览器
driver = webdriver.Chrome(service=s)
# 打个百度
driver.get(&#39;https://cn.bing.com/&#39;)
sleep(2)
# 获取 搜索框,并输出“学习”
driver.find_element(By.ID,&#39;sb_form_q&#39;).send_keys(&#39;学习&#39;)
sleep(1)
# 获取 搜索按钮,并点击

driver.find_element(By.ID,&#39;search_icon&#39;).click()
if __name__ ==&#39;__main__&#39;:
test_element()
  selenium 定位下拉菜单
  包括下拉菜单页面
  


Level Locate




Level locate



Link1

Action
Another action
Something else here

Separated link







Link2

Action
Another action
Something else here

Separated link






  选定的元素
  from selenium import webdriver
from selenium.webdriver.chrome.service
import Service
from selenium.webdriver.common.by import By
import os
from time import sleep
def test_down_menu():
# 创建一个驱动
s =Service(executable_path=&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
# 设置方位的文件地址
file_path = &#39;file:///&#39;+os.path.abspath(&#39;./html/test01.html&#39;)
# 访问页面
driver.get(file_path)
# 定位父级元素

driver.find_element(By.LINK_TEXT,&#39;Link1&#39;).click()
# 找到要移动的位置
menu = driver.find_element(By.LINK_TEXT,&#39;Action&#39;)
# 做一个移动光标的动作
# 定义一个动作在driver 移动到menu的位置 执行动作

webdriver.ActionChains(driver).move_to_element(menu).perform()
# sleep(2)
# 定位子级元素
menu.click()
# 睡眠2秒
sleep(2)
# 关闭浏览器
driver.quit()
if __name__ == &#39;__main__&#39;:
test_down_menu()
  硒级定位
  窗口定位
  对于一个现代的web应用来说,往往会有框架(frame)或者窗口(window)的应用,这给我们的定位带来了一个难题。有时候我们定位一个元素,定位器没有问题,但是一直无法定位。这时,我们需要检查元素是否在一个框架中。Seelnium webdriver提供了switch_to_frame方法,可以轻松解决这个问题。
  多层框架或窗口的定位:driver.switch_to.frame()
  框架.html
  

frame




frame


  内部.html
  

inner


inner


  switch_to_frame()
  from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
import os
from time import sleep
def select_frame():
# 创建驱动
s = Service(executable_path=&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/outer.html&#39;)
# 打开网页
driver.get(file_path)
# 切换frame
driver.switch_to.frame(&#39;f1&#39;)
driver.switch_to.frame(&#39;f2&#39;)
# 定位元素,输入要搜索的内容
driver.find_element(By.ID,&#39;sb_form_q&#39;).send_keys(&#39;百战&#39;)
# 定位按钮,点击搜索
driver.find_element(By.ID,&#39;search_icon&#39;).click()
sleep(3)
driver.quit()
if __name__ ==&#39;__main__&#39;:
select_frame()
  selenium 处理下拉框
  爬取数据时,有时数据过多,官网提供了过滤功能select标签。对于这样的数据,我们只需要定位元素并点击它。
  drop_down.html
  


UPS Next Day Air ==> $12.51
UPS Next Day Air Saver ==> $11.61
UPS 3 Day Select ==> $10.69
UPS 2nd Day Air ==> $9.03
UPS Ground ==> $8.34
USPS Priority Mail Insured ==> $9.25
USPS Priority Mail ==> $7.45
USPS First Class ==> $3.20


UPS Next Day Air ==> $12.51
UPS Next Day Air Saver ==> $11.61
UPS 3 Day Select ==> $10.69
UPS 2nd Day Air ==> $9.03
UPS Ground ==> $8.34
USPS Priority Mail Insured ==> $9.25
USPS Priority Mail ==> $7.45
USPS First Class ==> $3.20


  from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import os
def choose_option():
# 创建驱动
s = Service(&#39;./chromedriver.exe&#39;)
# 创建浏览器对象
driver = webdriver.Chrome(service=s)
# 访问页面
# 设置页面地址
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/test02.html&#39;)
driver.get(file_path)
# 定位下拉框里面选项
sleep(2)
driver.find_element(By.XPATH,&#39;//select[@id="ShippingMethod"]/option[@value="10.69"]&#39;).click()
sleep(2)
driver.find_element(By.XPATH,&#39;//select[@id="ShippingMethod2"]/option[@value="9.25"]&#39;).click()
# 关闭浏览器
sleep(5)
driver.quit()
if __name__ == &#39;__main__&#39;:
choose_option()
  selenium 处理弹出窗口
  有时,页面可能要弹出窗口。只需转到定位弹出窗口上的“确定”按钮
  html
  

This is a page

Hello,Python Spider

alert(&#39;这个是测试弹窗&#39;)
  from lib2to3.pgen2 import driver
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from time import sleep
import os
def test_windows():
# 创建驱动对象
s = Service(&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
# 访问页面
# 设置页面地址
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/test03.html&#39;)
driver.get(file_path)
sleep(3)
# 定位弹出窗口,并点击
driver.switch_to.alert.accept()
sleep(3)
driver.quit()
if __name__ ==&#39;__main__&#39;:
test_windows()
  selenium 拖放元素
  要完成元素的拖拽,首先需要指定被拖拽元素和拖拽目标元素,然后使用ActionChains类来实现,ActionChains用于自定义动作。通过 ActionChains 对象中的 perform() 执行动作,
  html
  


jQuery UI Draggable - Auto-scroll


#draggable, #draggable2, #draggable3 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; }
body {font-family: Arial, Helvetica, sans-serif;}
table {font-size: 1em;}
.ui-draggable, .ui-droppable {background-position: top;}




$( function() {
$( "#draggable" ).draggable({ scroll: true });
$( "#draggable2" ).draggable({ scroll: true, scrollSensitivity: 100 });
$( "#draggable3" ).draggable({ scroll: true, scrollSpeed: 100 });
} );

<p>Scroll set to true, default settings

  scrollSensitivity set to 100

  scrollSpeed set to 100
</p>
  Python
  from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import os
<p>
def test_drop():
# 创建驱动对象
s = Service(&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
# 访问页面
# 设置页面地址
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/test04.html&#39;)
driver.get(file_path)
# 定位要拖拽的元素
div1 = driver.find_element(By.ID,&#39;draggable&#39;)
div2 = driver.find_element(By.ID,&#39;draggable2&#39;)
div3 = driver.find_element(By.ID,&#39;draggable3&#39;)
# 开始拖拽
# 定义事件
sleep(2)
webdriver.ActionChains(driver).drag_and_drop(div1,div2).perform()
for i in range(10):
webdriver.ActionChains(driver).drag_and_drop_by_offset(div3,10,10).perform()
sleep(0.5)
# 关闭浏览器
sleep(3)
driver.quit()
if __name__ ==&#39;__main__&#39;:
test_drop()</p>
  selenium 调用 js 方法
  有时候我们需要控制页面滚动条上的滚动条,但是滚动条并不是页面上的一个元素。这时候我们需要使用js来操作
  滚动条的操作一般有两种场景:
  调用js方法
  execute_script(script, *args)
  滚动条回到顶部:
  js="document.getElementById(&#39;id&#39;).scrollTop=0"
driver.execute_script(js)
  滚动条到底部
  js="document.documentElement.scrollTop=10000"
driver.execute_script(js)
  可以修改scrollTop的值,使滚动条位于右侧,0为顶部,10000为底部
  以上方法在火狐和IE浏览器上都可以,但是用Chrome浏览器,我发现不行。Chrome浏览器解决方案:
  js = "document.body.scrollTop=0"
driver.execute_script(js)
  水平滚动条
  js = "window.scrollTo(100,400)"
driver.execute_script(js)
  硒等待元素
  被迫等待
  使用时间.sleep
  功能:当代码运行到强制等待的那一行时,无论什么原因,都强制等待指定时间,需要通过time模块实现
  优点:简单
  缺点:无法做出有效判断,会浪费时间
  隐式等待
  chrome.implicitly_wait(time_num)
  过了一定时间,发现元素还没有加载,继续等待我们指定的时间。如果超过指定时间还没有加载,就会抛出异常。如果它没有等待就已经加载,它将立即执行。
  优点:设置一次
  缺点:必须等待加载完成才能进行后续操作,或者等待超时才能进行后续操作
  显示等待
  从 selenium.webdriver.support.wait 导入 WebDriverWait
  指定等待条件并指定最长等待时间。在这段时间内判断是否满足等待条件。如果是真的,它会立即返回。如果不是真的,它将一直等待,直到等待您指定的最长等待时间。如果仍然不满足则抛出异常,如果满足则正常返回
  优点:专门用于等待指定元素,加载后可以运行后续代码
  缺点:需要设置多个元素分别等待
  url = &#39;https://www.guazi.com/nj/buy/&#39;
driver = webdriver.Chrome()
driver.get(url)
wait = WebDriverWait(driver,10,0.5)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, &#39;next&#39;)))
print(driver.page_source)
  selenium 参数用法
  包括无头模式、代理模式、绕过检测
  from selenium.webdriver.chrome.service import Service
from selenium.webdriver import Chrome,ChromeOptions,DesiredCapabilities
from time import sleep
def test_headless():
# 设置参数,将浏览器隐藏起来(无头浏览器)
options = ChromeOptions()
options.add_argument(&#39;--headless&#39;)
# 设置驱动
service = Service(&#39;./chromedriver&#39;)
# 启动Chrome浏览器
driver = Chrome(service=service,options=options)
# 访问页面
driver.get(&#39;https://www.baidu.com&#39;)
# 打印代码
print(driver.page_source)
# 关闭浏览器
driver.quit()
def test_proxy1():
# 设置参数,给浏览器设置代理
options = ChromeOptions()
# options.add_argument(&#39;--proxy-server=http://ip:port&#39;)
options.add_argument(&#39;--proxy-server=http://221.199.36.122:35414&#39;)
# 设置驱动
service = Service(&#39;./chromedriver&#39;)
# 启动Chrome浏览器
driver = Chrome(service=service,options=options)
# 访问页面 "134.195.101.16",
driver.get(&#39;http://httpbin.org/get&#39;)
# 打印代码
print(driver.page_source)
# 关闭浏览器
driver.quit()
def test_proxy2():
from selenium.webdriver.common.proxy import ProxyType,Proxy
# 设置参数,给浏览器设置代理
ip = &#39;http://113.76.133.238:35680&#39;
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = ip
proxy.ssl_proxy = ip
# 关联浏览器
capabilities = DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
# 设置驱动
service = Service(&#39;./chromedriver&#39;)
# 启动Chrome浏览器
driver = Chrome(service=service,desired_capabilities=capabilities)
# 访问页面 "134.195.101.16",
driver.get(&#39;http://httpbin.org/get&#39;)
# 打印代码
print(driver.page_source)
# 关闭浏览器
driver.quit()
def test_find():
options = ChromeOptions()
options.add_experimental_option(&#39;excludeSwitches&#39;, [&#39;enable-automation&#39;])
options.add_experimental_option(&#39;useAutomationExtension&#39;, False)
chrome = Chrome(chrome_options=options)
chrome.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, &#39;webdriver&#39;, {
get: () => false
})
"""
})
chrome.get(&#39;http://httpbin.org/get&#39;)
info = chrome.page_source
print(info)
sleep(20)
if __name__ ==&#39;__main__&#39;:
# test_headless()
# test_proxy1()
# test_proxy2()
test_find()
  硒实用案例
  from selenium.webdriver.chrome.service import Service
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from lxml import etree
def spider_huya():
# 创建一个驱动
service = Service(&#39;./chromedriver.exe&#39;)
# 创建一个浏览器
driver = Chrome(service=service)
# 设置隐式等待
driver.implicitly_wait(5)
# 访问网址
driver.get(&#39;https://www.huya.com/g/lol&#39;)
count = 1
while True:
# print(&#39;获取了第%d页&#39; % count)
# count += 1
# 提取数据
e = etree.HTML(driver.page_source)
names = e.xpath(&#39;//i[@class="nick"]/@title&#39;)
person_nums = e.xpath(&#39;//i[@class="js-num"]/text()&#39;)
# 打印数据
# for n,p in zip(names,person_nums):
# print(f&#39;主播名:{n} 人气:{p}&#39;)

# 找到下一页的按钮
# try:
# next_btn = driver.find_element(By.XPATH,&#39;//a[@class="laypage_next"]&#39;)
# next_btn.click()
# except Exception as e:
# break
if driver.page_source.find(&#39;laypage_next&#39;) == -1:
break
next_btn = driver.find_element(By.XPATH,&#39;//a[@class="laypage_next"]&#39;)
next_btn.click()

# 关闭浏览器
driver.quit()
if __name__ == &#39;__main__&#39;:
spider_huya()

内容分享:BackStreet Browser(离线浏览器)与一键获取网页内所有链接工具下

网站优化优采云 发表了文章 • 0 个评论 • 186 次浏览 • 2022-09-24 18:19 • 来自相关话题

  内容分享:BackStreet Browser(离线浏览器)与一键获取网页内所有链接工具下
  
  软件介绍
  
  后街浏览器软件是离线浏览的好帮手。 BackStreet Browser软件的特点是多个线程可以同时访问目标网站,充分利用带宽,不必因网络流量情况而延迟,延长等待时间。对于不想花时间等待不必要的时间的BackStreetBrowser来说,这是一个不错的选择。 BackStreet Browser(离线浏览器)是当今互联网上常用的软件之一。本软件绿色、安全、无毒,让您放心使用!如果BackStreet Browser(离线浏览器)是你需要的工具,来这里吧!本站为您提供BackStreet Browser(离线浏览器)的官方下载。
  免费获取:4个完全不收费的资源搜索网站,只有你想不到,没有你搜不到!
  在网上找不到您要查找的内容?今天小编给大家分享4个完全免费的资源搜索网站,快速搜索各类学习资源,只有你想不到,没有你也搜不到!
  1.Panc 搜索
  Panc 搜索也称为胖搜索。这是一个资源非常完整的搜索网站。 网站 中的资源类型非常丰富。用它来寻找资源是对的。还可以向P友求资源帮助,资源问答,不怕找资源。
  
  2.不飞溅的免费图片
  unsplash免费图片,这是一张无版权可商用的海量高清图片网站,多种风格图片任你选择,不用担心图片侵权等问题~
  3.Ncckl
  ncckl,一个类似于云盘精灵的网站。自从云盘精灵收费后,很多人都开始使用了。它有两个亮点,就是可以看到网盘密码并分享给会员。 (在 网站 上分享其他一些免费会员帐户。)
  
  4.昆虫部落
  昆虫部落,强大的搜索网站,这个网站上有各种搜索引擎,可以搜索小程序、表情、gif、图标等各种素材,非常实用。
  除了这四个网站,你还知道哪些有用的资源网站?知道的就在评论区分享给大家吧~
  PS:需要转换文件格式,可以试试【迅捷PDF转换器】~ 查看全部

  内容分享:BackStreet Browser(离线浏览器)与一键获取网页内所有链接工具下
  
  软件介绍
  
  后街浏览器软件是离线浏览的好帮手。 BackStreet Browser软件的特点是多个线程可以同时访问目标网站,充分利用带宽,不必因网络流量情况而延迟,延长等待时间。对于不想花时间等待不必要的时间的BackStreetBrowser来说,这是一个不错的选择。 BackStreet Browser(离线浏览器)是当今互联网上常用的软件之一。本软件绿色、安全、无毒,让您放心使用!如果BackStreet Browser(离线浏览器)是你需要的工具,来这里吧!本站为您提供BackStreet Browser(离线浏览器)的官方下载。
  免费获取:4个完全不收费的资源搜索网站,只有你想不到,没有你搜不到!
  在网上找不到您要查找的内容?今天小编给大家分享4个完全免费的资源搜索网站,快速搜索各类学习资源,只有你想不到,没有你也搜不到!
  1.Panc 搜索
  Panc 搜索也称为胖搜索。这是一个资源非常完整的搜索网站。 网站 中的资源类型非常丰富。用它来寻找资源是对的。还可以向P友求资源帮助,资源问答,不怕找资源。
  
  2.不飞溅的免费图片
  unsplash免费图片,这是一张无版权可商用的海量高清图片网站,多种风格图片任你选择,不用担心图片侵权等问题~
  3.Ncckl
  ncckl,一个类似于云盘精灵的网站。自从云盘精灵收费后,很多人都开始使用了。它有两个亮点,就是可以看到网盘密码并分享给会员。 (在 网站 上分享其他一些免费会员帐户。)
  
  4.昆虫部落
  昆虫部落,强大的搜索网站,这个网站上有各种搜索引擎,可以搜索小程序、表情、gif、图标等各种素材,非常实用。
  除了这四个网站,你还知道哪些有用的资源网站?知道的就在评论区分享给大家吧~
  PS:需要转换文件格式,可以试试【迅捷PDF转换器】~

最新版本:Selenium浏览器自动化 - HTML元素定位

网站优化优采云 发表了文章 • 0 个评论 • 203 次浏览 • 2022-09-24 18:17 • 来自相关话题

  最新版本:Selenium浏览器自动化 - HTML元素定位
  过去,Selenium 中有 7 种常见的定位方法,如下所示。新方法请直接查看下面的python代码。
  id定位:find_element_by_id是通过元素的id属性查找元素的方式。
  名称定位:通过元素的name属性查找元素的方法是find_element_by_name。
  类定位:通过类名定位元素的方法是find_element_by_class_name。
  标签定位:每个元素都可以看成一个标签,但是HTML页面的标签重复性很强,这种方法很少用于定位。方法是 find_element_by_tag_name。
  链接定位:专门用来定位文本链接,方法是find_element_by_link_text。
  XPath(XML Path Language,XML路径语言)定位:通过XPath定位元素的方法是find_element_by_xpath。
  CSS定位:CSS使用选择器将属性绑定到页面元素,可以灵活选择控件的任意属性。方法是find_element_by_css_selector。
  通过浏览器开发者模式,找到百度的搜索框定位元素。
  #!/usr/bin/env python
# -*- coding:utf-8 -*-
<p>
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
def get_driver():
# 获取浏览器驱动对象
# 设置chromedriver的执行路径,需要将下载解压好的chromedriver与本脚本放在同一文件夹下,或者补全执行路径。
chromedriver = &#39;chromedriver&#39;
driver = webdriver.Chrome(executable_path=chromedriver)
return driver
  
driver = get_driver()
driver.get(&#39;https://www.baidu.com&#39;)
# 通过class name定位搜索框
search_input = driver.find_element(by=By.CLASS_NAME, value=&#39;s_ipt&#39;)
# 在搜索框输入“python”
search_input.send_keys(&#39;python&#39;)
# 在搜索框按“Enter”键
search_input.send_keys(Keys.ENTER)
</p>
  最新版本:什么是搜寻引擎优化(SEO)?
  什么是搜索引擎优化 (SEO)?
  
  2021-12-12 22:38·清宁书房
  SEO 是一种营销方法,通过自然排名(无需付费)来提高网页的知名度。搜索引擎优化涉及技术和创造力,以提高页面排名、流量并增加页面在搜索引擎上的可见度。 SEO 可以通过多种方式从页面上的文本或其他 网站 链接链接到您的页面,有时 SEO 只是确保搜索引擎能够理解您的 网站 结构的简单方法。
  
  搜索引擎优化不仅仅是建立搜索引擎友好的网页,搜索引擎优化可以使网页更容易被人们访问并为人们带来更多的信息,我们相信这些与搜索引擎优化的原则密切相关。 查看全部

  最新版本:Selenium浏览器自动化 - HTML元素定位
  过去,Selenium 中有 7 种常见的定位方法,如下所示。新方法请直接查看下面的python代码。
  id定位:find_element_by_id是通过元素的id属性查找元素的方式。
  名称定位:通过元素的name属性查找元素的方法是find_element_by_name。
  类定位:通过类名定位元素的方法是find_element_by_class_name。
  标签定位:每个元素都可以看成一个标签,但是HTML页面的标签重复性很强,这种方法很少用于定位。方法是 find_element_by_tag_name。
  链接定位:专门用来定位文本链接,方法是find_element_by_link_text。
  XPath(XML Path Language,XML路径语言)定位:通过XPath定位元素的方法是find_element_by_xpath。
  CSS定位:CSS使用选择器将属性绑定到页面元素,可以灵活选择控件的任意属性。方法是find_element_by_css_selector。
  通过浏览器开发者模式,找到百度的搜索框定位元素。
  #!/usr/bin/env python
# -*- coding:utf-8 -*-
<p>
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
def get_driver():
# 获取浏览器驱动对象
# 设置chromedriver的执行路径,需要将下载解压好的chromedriver与本脚本放在同一文件夹下,或者补全执行路径。
chromedriver = &#39;chromedriver&#39;
driver = webdriver.Chrome(executable_path=chromedriver)
return driver
  
driver = get_driver()
driver.get(&#39;https://www.baidu.com&#39;)
# 通过class name定位搜索框
search_input = driver.find_element(by=By.CLASS_NAME, value=&#39;s_ipt&#39;)
# 在搜索框输入“python”
search_input.send_keys(&#39;python&#39;)
# 在搜索框按“Enter”键
search_input.send_keys(Keys.ENTER)
</p>
  最新版本:什么是搜寻引擎优化(SEO)?
  什么是搜索引擎优化 (SEO)?
  
  2021-12-12 22:38·清宁书房
  SEO 是一种营销方法,通过自然排名(无需付费)来提高网页的知名度。搜索引擎优化涉及技术和创造力,以提高页面排名、流量并增加页面在搜索引擎上的可见度。 SEO 可以通过多种方式从页面上的文本或其他 网站 链接链接到您的页面,有时 SEO 只是确保搜索引擎能够理解您的 网站 结构的简单方法。
  
  搜索引擎优化不仅仅是建立搜索引擎友好的网页,搜索引擎优化可以使网页更容易被人们访问并为人们带来更多的信息,我们相信这些与搜索引擎优化的原则密切相关。

事实:浏览器抓取网页的时候,从来都不是把所有的网页都抓取下来

网站优化优采云 发表了文章 • 0 个评论 • 118 次浏览 • 2022-09-22 15:05 • 来自相关话题

  事实:浏览器抓取网页的时候,从来都不是把所有的网页都抓取下来
  浏览器抓取网页的时候,从来都不是把所有的网页都抓取下来,而是只抓取自己想要的内容。在浏览器中控制台抓取输入框的数据,一般有三种做法。parse,通过javascript去读取javascript中关于网页的内容。acronym和bopool,利用ajax,就可以在不用到网页内容的情况下,控制网页的输入内容。
  parse:parse方法主要会返回一个json对象。如果json对象内容是文本,就会转换成一个json字符串,如果json对象内容是链接,会转换成一个json对象。bopool:json也是可以自己通过ajax(异步请求)实现的。parse方法和bopool方法相对来说比较简单,而且ajax也是可以自己通过ajax去请求网页的内容。
  
  一种是parse,一种是bopool。那么问题来了,ajax是如何请求json的呢?两种方法:分别是eval和parse。eval()中,eval()直接创建一个javascript对象,里面包含了该请求网页的所有内容。eval()的实现思路如下:。
  1、把要请求的javascript内容,全部转换成纯文本。
  2、给纯文本的每一个字符串重新赋值一个类似"\0x00"或者"\00a"之类的符号。
  
  3、把转换过的javascript值用'\0'符号连接起来。
  4、编码转换过程中失败,会把结果直接作为参数发送给request,返回一个json对象。parse()方法就是返回一个json对象。parse()不能带参数,传入值会报错。eval()依然也不能加参数,json对象本身可以作为参数。如果需要加一个参数,就是eval("p"),eval()创建一个字符串。
  parse()方法也不能带参数,json对象本身也可以作为参数。然后我们再来看一下scrapy中parse_json的源码实现。scrapy中parse_json实现:它在每次请求网页时,初始化一个evalbody类,作为parse方法的第一个参数传入。evalbody类拥有parse_json函数和bopool函数两个抽象类,其中,parse_json函数的第一个参数是json格式的一个object对象,bopool函数的第一个参数是一个json对象(也可以是jsonstring对象)。
  parse_json会调用json格式的object对象中的parse()方法完成json格式解析,bopool不会管,直接返回一个json对象。然后我们post一个简单的http请求:./json.parse({"user_name":"cvtulsn","password":"12345678"})效果如下:它其实是利用bopool实现的!在bopool方法中使用evalbody类和parsejson类完成了json格式的解析:json类解析一个json对象实际上是通过bopool实现的。bopool属于纯函数,而且带有参数。所以,可以通过bopool添加一个参数。evalbody类中。 查看全部

  事实:浏览器抓取网页的时候,从来都不是把所有的网页都抓取下来
  浏览器抓取网页的时候,从来都不是把所有的网页都抓取下来,而是只抓取自己想要的内容。在浏览器中控制台抓取输入框的数据,一般有三种做法。parse,通过javascript去读取javascript中关于网页的内容。acronym和bopool,利用ajax,就可以在不用到网页内容的情况下,控制网页的输入内容。
  parse:parse方法主要会返回一个json对象。如果json对象内容是文本,就会转换成一个json字符串,如果json对象内容是链接,会转换成一个json对象。bopool:json也是可以自己通过ajax(异步请求)实现的。parse方法和bopool方法相对来说比较简单,而且ajax也是可以自己通过ajax去请求网页的内容。
  
  一种是parse,一种是bopool。那么问题来了,ajax是如何请求json的呢?两种方法:分别是eval和parse。eval()中,eval()直接创建一个javascript对象,里面包含了该请求网页的所有内容。eval()的实现思路如下:。
  1、把要请求的javascript内容,全部转换成纯文本。
  2、给纯文本的每一个字符串重新赋值一个类似"\0x00"或者"\00a"之类的符号。
  
  3、把转换过的javascript值用'\0'符号连接起来。
  4、编码转换过程中失败,会把结果直接作为参数发送给request,返回一个json对象。parse()方法就是返回一个json对象。parse()不能带参数,传入值会报错。eval()依然也不能加参数,json对象本身可以作为参数。如果需要加一个参数,就是eval("p"),eval()创建一个字符串。
  parse()方法也不能带参数,json对象本身也可以作为参数。然后我们再来看一下scrapy中parse_json的源码实现。scrapy中parse_json实现:它在每次请求网页时,初始化一个evalbody类,作为parse方法的第一个参数传入。evalbody类拥有parse_json函数和bopool函数两个抽象类,其中,parse_json函数的第一个参数是json格式的一个object对象,bopool函数的第一个参数是一个json对象(也可以是jsonstring对象)。
  parse_json会调用json格式的object对象中的parse()方法完成json格式解析,bopool不会管,直接返回一个json对象。然后我们post一个简单的http请求:./json.parse({"user_name":"cvtulsn","password":"12345678"})效果如下:它其实是利用bopool实现的!在bopool方法中使用evalbody类和parsejson类完成了json格式的解析:json类解析一个json对象实际上是通过bopool实现的。bopool属于纯函数,而且带有参数。所以,可以通过bopool添加一个参数。evalbody类中。

内容分享:谷歌浏览器获取cookie以及抓包获取真实链接

网站优化优采云 发表了文章 • 0 个评论 • 115 次浏览 • 2022-09-22 13:10 • 来自相关话题

  内容分享:谷歌浏览器获取cookie以及抓包获取真实链接
  目前大部分浏览器都有自己的开发者工具(一般是按f12出现),打开网站后就可以看到网页的cookies和加载的各种信息。
  以谷歌浏览器为例:
  1.在谷歌浏览器中打开网址
  在分页上点击网址时,会发现网址没有变化。这是一个典型的帖子 URL,需要捕获包的真实链接。
  2.从右上角的自定义控件打开开发者工具或者直接按f12运行,
  
  3.打开工具点击页面后,工具中出现一个链接,是网站翻页的请求信息
  4.有些网站有不止一个翻页请求信息。如果对请求不确定,可以通过查看请求信息的回执内容来判断真正的翻页请求,如图
  5. 接下来根据header中的信息判断翻页URL是get还是post。get URL一般可以直接打开访问(但不带特殊头信息),post URL不能直接打开(只能在软件中直接打开)
  
  6. 查看header中的信息,你会发现这是一个post请求,但是这里并没有post请求参数,但是可以看到header后面有一个payload,参数其实是放在这里
  通过以上步骤,基本获得了内容页面的制作和获取规则的相关信息。设置了以下规则
  1.例如从pesponse获取内容页面相关参数
  2.post参数设置,可以点击payload中的view sorce获取如下参数
  解密:二、爬虫如何抓取网页数据
  3.从 HTML 页面中提取有用的数据
  一个。如果需要,保存数据
  湾。如果是页面中的另一个 URL,则进行第二步。
  2.3 如何抓取 HTML 页面
  HTTP请求处理:urllib、urllib2、request 处理后的请求可以模拟浏览器发送请求,得到服务器响应的文件。
  2.4 解析服务器响应的内容
  
  re、xpath、BeautifulSoup4(bs4)、jsonpath、pyquery 等。
  2.5 如何采集动态HTML,验证码处理
  采集 用于一般动态页面:Selenium+PhantomJs(无界面),模拟真实浏览器加载
  三、万能爬虫,专注爬虫
  3.1 通用爬虫:搜索引擎的爬虫系统。
  1.目标:就是尽可能的把网上所有的网页下载下来,放到本地服务器形成的备份库中,然后对这些网页做相关的处理(提取关键词,去除广告),并提取有用的东西
  2.爬取过程:
  
  a:优先选择一部分已有的URL,将这些URL放入爬虫队列。
  b:从队列中取出这些URL,然后解析DNS得到主机IP,然后到该IP对应的服务器下载HTML页面。宝初到搜索引擎本地服务器后,将爬取的URL放入爬取队列
  c:分析网页内容,找出网页上的其他链接,继续执行第二步,直到找到相关信息
  3.2 搜索引擎如何获取 网站 URL
  1.主动提交给搜索引擎网站
  2.其他网站设置网站的连接
  3.搜索引擎将与DNS服务商合作快速收录新网站,DNS:是一种将域名解析为IP的技术。 查看全部

  内容分享:谷歌浏览器获取cookie以及抓包获取真实链接
  目前大部分浏览器都有自己的开发者工具(一般是按f12出现),打开网站后就可以看到网页的cookies和加载的各种信息。
  以谷歌浏览器为例:
  1.在谷歌浏览器中打开网址
  在分页上点击网址时,会发现网址没有变化。这是一个典型的帖子 URL,需要捕获包的真实链接。
  2.从右上角的自定义控件打开开发者工具或者直接按f12运行,
  
  3.打开工具点击页面后,工具中出现一个链接,是网站翻页的请求信息
  4.有些网站有不止一个翻页请求信息。如果对请求不确定,可以通过查看请求信息的回执内容来判断真正的翻页请求,如图
  5. 接下来根据header中的信息判断翻页URL是get还是post。get URL一般可以直接打开访问(但不带特殊头信息),post URL不能直接打开(只能在软件中直接打开)
  
  6. 查看header中的信息,你会发现这是一个post请求,但是这里并没有post请求参数,但是可以看到header后面有一个payload,参数其实是放在这里
  通过以上步骤,基本获得了内容页面的制作和获取规则的相关信息。设置了以下规则
  1.例如从pesponse获取内容页面相关参数
  2.post参数设置,可以点击payload中的view sorce获取如下参数
  解密:二、爬虫如何抓取网页数据
  3.从 HTML 页面中提取有用的数据
  一个。如果需要,保存数据
  湾。如果是页面中的另一个 URL,则进行第二步。
  2.3 如何抓取 HTML 页面
  HTTP请求处理:urllib、urllib2、request 处理后的请求可以模拟浏览器发送请求,得到服务器响应的文件。
  2.4 解析服务器响应的内容
  
  re、xpath、BeautifulSoup4(bs4)、jsonpath、pyquery 等。
  2.5 如何采集动态HTML,验证码处理
  采集 用于一般动态页面:Selenium+PhantomJs(无界面),模拟真实浏览器加载
  三、万能爬虫,专注爬虫
  3.1 通用爬虫:搜索引擎的爬虫系统。
  1.目标:就是尽可能的把网上所有的网页下载下来,放到本地服务器形成的备份库中,然后对这些网页做相关的处理(提取关键词,去除广告),并提取有用的东西
  2.爬取过程:
  
  a:优先选择一部分已有的URL,将这些URL放入爬虫队列。
  b:从队列中取出这些URL,然后解析DNS得到主机IP,然后到该IP对应的服务器下载HTML页面。宝初到搜索引擎本地服务器后,将爬取的URL放入爬取队列
  c:分析网页内容,找出网页上的其他链接,继续执行第二步,直到找到相关信息
  3.2 搜索引擎如何获取 网站 URL
  1.主动提交给搜索引擎网站
  2.其他网站设置网站的连接
  3.搜索引擎将与DNS服务商合作快速收录新网站,DNS:是一种将域名解析为IP的技术。

浏览器抓取网页的时候是不是经常遇到这个问题?

网站优化优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2022-08-10 18:01 • 来自相关话题

  浏览器抓取网页的时候是不是经常遇到这个问题?
  
  浏览器抓取网页的时候是不是经常遇到这个问题?下载一个app下来是全局都可用,但是其他app就不能用了。可以通过浏览器的代理工具获取到源代码地址,解析地址获取到目标页面即可。其实我们需要的是一个可以在网页全局可用的代理(注意是全局!!),那么现在知道一个办法可以实现网页全局可用代理,对于页面保存是可以非常方便的了。
  
  没错,知乎上的答主分享的浏览器代理就可以完成网页全局可用代理。首先登录一个知乎网站,注册成功之后,会自动创建一个帐号,登录之后就会发现是登录界面,你在该页面的topic可以看到自己关注的问题列表,关注的人。下面这段代码就是关注者名字的全局代理地址,即chrome插件,可以直接修改google地址或者手动添加。
  //全局代理chrome插件//默认方式:$('.f2').open('txt','xxx.xxx.xxx');chrome插件地址,$('.f2')其实是全局代理chrome插件地址,你关注的人或者文章都会默认出现在你的浏览器全局代理列表中$('.f2').open('xxx.xxx.xxx','xxx.xxx.xxx');通过点击/找到方式可以获取全局代理地址://访问页面/是你默认关注的人,你也可以修改问题个数$('.f2').open('tag','xxx.xxx.xxx');$('.f2').open('xxx.xxx.xxx','xxx.xxx.xxx');通过在某个文章页面点击右键复制粘贴到别的文章页面:在浏览器全局代理地址页面,右键粘贴即可。是不是简单粗暴。 查看全部

  浏览器抓取网页的时候是不是经常遇到这个问题?
  
  浏览器抓取网页的时候是不是经常遇到这个问题?下载一个app下来是全局都可用,但是其他app就不能用了。可以通过浏览器的代理工具获取到源代码地址,解析地址获取到目标页面即可。其实我们需要的是一个可以在网页全局可用的代理(注意是全局!!),那么现在知道一个办法可以实现网页全局可用代理,对于页面保存是可以非常方便的了。
  
  没错,知乎上的答主分享的浏览器代理就可以完成网页全局可用代理。首先登录一个知乎网站,注册成功之后,会自动创建一个帐号,登录之后就会发现是登录界面,你在该页面的topic可以看到自己关注的问题列表,关注的人。下面这段代码就是关注者名字的全局代理地址,即chrome插件,可以直接修改google地址或者手动添加。
  //全局代理chrome插件//默认方式:$('.f2').open('txt','xxx.xxx.xxx');chrome插件地址,$('.f2')其实是全局代理chrome插件地址,你关注的人或者文章都会默认出现在你的浏览器全局代理列表中$('.f2').open('xxx.xxx.xxx','xxx.xxx.xxx');通过点击/找到方式可以获取全局代理地址://访问页面/是你默认关注的人,你也可以修改问题个数$('.f2').open('tag','xxx.xxx.xxx');$('.f2').open('xxx.xxx.xxx','xxx.xxx.xxx');通过在某个文章页面点击右键复制粘贴到别的文章页面:在浏览器全局代理地址页面,右键粘贴即可。是不是简单粗暴。

web前端编程,浏览器抓取网页数据的方法有哪些

网站优化优采云 发表了文章 • 0 个评论 • 99 次浏览 • 2022-07-15 01:00 • 来自相关话题

  web前端编程,浏览器抓取网页数据的方法有哪些
  浏览器抓取网页数据的方法有很多,如手动抓取等等,利用web开发有nbwebview,高版本浏览器可以直接下载插件,有免费也有收费。还有一种是用chrome的高级模式截取,开启了高级模式就可以抓取网页任意页面,我在文章it网-web前端编程,
  1、给chrome浏览器设置过滤广告的开关
  2、系统推荐启用、禁用网页下载速度计算
  
  3、更改快捷键windows用户f12,
  4、我们用chrome+网页浏览器浏览器浏览网页或者我们新建一个页面,
  将点击抓取网页数据到excel,以excel格式存在本地,chrome打开即可下载。
  极速网页下载大师
  
  如果只是网页抓取,不是需要解析的话,可以考虑用chrome代替qq浏览器浏览器,然后下载插件将html下载,然后js,css等拖进去转化。更牛逼的可以使用xx狗,然后转化。
  可以使用idm下载
  qq浏览器f12看curl设置,
  看标题,我以为你是想要抓取网页中特定的js文件,我想想呢,可以试试这个,就算用插件,也是可以抓取网页并编译到excel的。
  我还以为要抓取.json文件,要到js代码里面找呢没想到竟然是f12,如果都要抓包的话,那没法快了。如果只是抓取图片,编辑器一行一行的抓吧,其实图片抓取也有很多可以抓包的方法的。还是建议楼主尽快买个mac吧,这样的话你可以把现有代码发给我, 查看全部

  web前端编程,浏览器抓取网页数据的方法有哪些
  浏览器抓取网页数据的方法有很多,如手动抓取等等,利用web开发有nbwebview,高版本浏览器可以直接下载插件,有免费也有收费。还有一种是用chrome的高级模式截取,开启了高级模式就可以抓取网页任意页面,我在文章it网-web前端编程,
  1、给chrome浏览器设置过滤广告的开关
  2、系统推荐启用、禁用网页下载速度计算
  
  3、更改快捷键windows用户f12,
  4、我们用chrome+网页浏览器浏览器浏览网页或者我们新建一个页面,
  将点击抓取网页数据到excel,以excel格式存在本地,chrome打开即可下载。
  极速网页下载大师
  
  如果只是网页抓取,不是需要解析的话,可以考虑用chrome代替qq浏览器浏览器,然后下载插件将html下载,然后js,css等拖进去转化。更牛逼的可以使用xx狗,然后转化。
  可以使用idm下载
  qq浏览器f12看curl设置,
  看标题,我以为你是想要抓取网页中特定的js文件,我想想呢,可以试试这个,就算用插件,也是可以抓取网页并编译到excel的。
  我还以为要抓取.json文件,要到js代码里面找呢没想到竟然是f12,如果都要抓包的话,那没法快了。如果只是抓取图片,编辑器一行一行的抓吧,其实图片抓取也有很多可以抓包的方法的。还是建议楼主尽快买个mac吧,这样的话你可以把现有代码发给我,

浏览器抓取网页不是一个简单的工作,必须要有网页的图片和视频

网站优化优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2022-07-12 16:00 • 来自相关话题

  浏览器抓取网页不是一个简单的工作,必须要有网页的图片和视频
  浏览器抓取网页不是一个简单的工作,涉及到代码和服务器的配合,我们通常用的浏览器网页抓取,抓取的是网页,而不是网页的图片,视频,和其他的内容。要想浏览器就可以抓取网页,必须要有网页的图片和视频。1,为什么必须是网页。如果是.http.server或者.http.proxy这类的网页,或者是java.util.links,或者是其他java平台上已经有的file.jar包,那么他就属于web应用,我们可以把这些web应用封装成jar包,把用户的图片或者视频封装成jar包,并封装到网页上即可。
  
  那么java程序员就可以无视http协议,直接调用jar包里的api。如果你要做一个动态web程序,那么肯定需要写一个web容器,那么我们封装成jar包是不现实的,如果这个web容器完成不了,我们肯定不能封装进入,否则直接报错,因为使用web容器一方面要看开发人员的水平,一方面也要考虑跨平台的兼容性。
  正是由于我们不考虑跨平台,如果不用网页,不用程序,那么我们就得去抓网页中的图片和视频。2,为什么需要分析网页首先http有get,post,put,patch,pattern这些方法,大家都可以去看一下。当有人封装一个web应用程序的时候,这些方法都能够帮你抓取到图片和视频,用的是不同的server。
  
  有了这些方法,你完全可以不考虑浏览器,直接拿程序去连接请求网页,那么就不用操心服务器的问题,毕竟服务器是管理web应用程序的,不是浏览器。我们抓取图片或者视频,是要拿到图片和视频的jpg,bmp,mp4等格式文件,我们可以封装成jar包。这样我们就可以不需要手动解析js和css文件,解析出来的代码有很多,很容易出问题,并且直接写在web容器里。
  当然,用原生方法解析java程序是不可能的,因为原生程序太复杂,需要处理的对象有上百个。所以,我们用的是webkit的signalhook技术,用webkit的signal去抓取。通过两个函数来控制hook来实现,1是javavoidmodels()voidredirect(protocol,request)2是javavoidapply(protocol,request)上面的函数都会被signalhook处理掉,那么在程序里就不能调用java的全局变量。
  当apply对方法被调用的时候,就会出错,但是我们还能请求到图片或者视频,也不是没有办法,有两种方法。1,原生代码针对请求服务器方法,可以通过java.util.pairs.filelinksfor(xxx,xxx,xxx)来实现解析图片或者视频。有一个比较明显的缺点就是返回的是xml格式。2,可以通过java.util.viewfilesy。 查看全部

  浏览器抓取网页不是一个简单的工作,必须要有网页的图片和视频
  浏览器抓取网页不是一个简单的工作,涉及到代码和服务器的配合,我们通常用的浏览器网页抓取,抓取的是网页,而不是网页的图片,视频,和其他的内容。要想浏览器就可以抓取网页,必须要有网页的图片和视频。1,为什么必须是网页。如果是.http.server或者.http.proxy这类的网页,或者是java.util.links,或者是其他java平台上已经有的file.jar包,那么他就属于web应用,我们可以把这些web应用封装成jar包,把用户的图片或者视频封装成jar包,并封装到网页上即可。
  
  那么java程序员就可以无视http协议,直接调用jar包里的api。如果你要做一个动态web程序,那么肯定需要写一个web容器,那么我们封装成jar包是不现实的,如果这个web容器完成不了,我们肯定不能封装进入,否则直接报错,因为使用web容器一方面要看开发人员的水平,一方面也要考虑跨平台的兼容性。
  正是由于我们不考虑跨平台,如果不用网页,不用程序,那么我们就得去抓网页中的图片和视频。2,为什么需要分析网页首先http有get,post,put,patch,pattern这些方法,大家都可以去看一下。当有人封装一个web应用程序的时候,这些方法都能够帮你抓取到图片和视频,用的是不同的server。
  
  有了这些方法,你完全可以不考虑浏览器,直接拿程序去连接请求网页,那么就不用操心服务器的问题,毕竟服务器是管理web应用程序的,不是浏览器。我们抓取图片或者视频,是要拿到图片和视频的jpg,bmp,mp4等格式文件,我们可以封装成jar包。这样我们就可以不需要手动解析js和css文件,解析出来的代码有很多,很容易出问题,并且直接写在web容器里。
  当然,用原生方法解析java程序是不可能的,因为原生程序太复杂,需要处理的对象有上百个。所以,我们用的是webkit的signalhook技术,用webkit的signal去抓取。通过两个函数来控制hook来实现,1是javavoidmodels()voidredirect(protocol,request)2是javavoidapply(protocol,request)上面的函数都会被signalhook处理掉,那么在程序里就不能调用java的全局变量。
  当apply对方法被调用的时候,就会出错,但是我们还能请求到图片或者视频,也不是没有办法,有两种方法。1,原生代码针对请求服务器方法,可以通过java.util.pairs.filelinksfor(xxx,xxx,xxx)来实现解析图片或者视频。有一个比较明显的缺点就是返回的是xml格式。2,可以通过java.util.viewfilesy。

C#(csharp)用CefSharp开发实现一个浏览器,抓取网站任意资源

网站优化优采云 发表了文章 • 0 个评论 • 483 次浏览 • 2022-07-09 05:42 • 来自相关话题

  C#(csharp)用CefSharp开发实现一个浏览器,抓取网站任意资源
  前言:
  不少网站会保护自己,防止别人下载图片。
  因此下载器,先后改了好几次,不断技术升级。
  早期 用WebClient 下载 HTML 分析 URL 下载。
  后来 为了下载 手机网站的图片,用上了 User-Agent 特性,模拟手机浏览器。
  之前遇到一个复杂些的 网站M ,页面用 JS 加载生成。无法直接获得HTML。
  用Chrome一番分析后,发现其图片地址 有固定格式。文件名是 3位数数字,从1开始累加。
  因此只要在浏览器 取到第一个图,后面的图片URL 生成下 也得到了。批量下载搞定。
  前段时间 网站M 升级。图片展示使用 HTML5 canavs 显示,而且 图片路径 也加随机字符。难以生成了。
  对于Chrome来说依然没有遮挡效果。依然可以取到 URL,可以手工保存图片, 然而 无法批量下载了。
  问题来了:
  无法取到 HTML分析出 图片路径,而且路径名称随机。那么如何批量下载图片?
  既然 图片展示到我们面前,数据必然也已经到了 我们这边,就看我们这么取得了。
  解决办法:
  
  WebClient不行,于是想到了 Winform 的 WebBrowser 实现浏览器,能显示必然能取到数据。
  WebBrowser对于大部分网站还是可以的。然而对于 HTML5的 或者 新特性的 网站就有些 不方便了。有时候不能正常显示网站。例如,网站M.
  它依赖 操作系统的 IE浏览器,而且默认是系统里老版本的 IE。可能是 IE7 吧。
  一番资料查找 发现CefSharp。这个是Chrome 的另一个开源项目, C# 调用。可以在Winform,Wpf 等中 嵌入浏览器。
  CefSharp在网上有一些资料,不多。为了弄明白CefSharp里 取得 图片URL,图片数据。花了一番功夫,查资料,看源码。
  倾情大放送,来一大波代码:
  开发环境:VS2015 framework 4.5.2 x86模式 CefSharp 63.0.30
  winform:
  
  有了上面的代码,便可以获取到 目标网站的 任意资源了。
  END
  ●
  ●
  ●
  ●
  ●
  ●
  扫描二维码
  获取更多精彩
  关注服务号 查看全部

  C#(csharp)用CefSharp开发实现一个浏览器,抓取网站任意资源
  前言:
  不少网站会保护自己,防止别人下载图片。
  因此下载器,先后改了好几次,不断技术升级。
  早期 用WebClient 下载 HTML 分析 URL 下载。
  后来 为了下载 手机网站的图片,用上了 User-Agent 特性,模拟手机浏览器。
  之前遇到一个复杂些的 网站M ,页面用 JS 加载生成。无法直接获得HTML。
  用Chrome一番分析后,发现其图片地址 有固定格式。文件名是 3位数数字,从1开始累加。
  因此只要在浏览器 取到第一个图,后面的图片URL 生成下 也得到了。批量下载搞定。
  前段时间 网站M 升级。图片展示使用 HTML5 canavs 显示,而且 图片路径 也加随机字符。难以生成了。
  对于Chrome来说依然没有遮挡效果。依然可以取到 URL,可以手工保存图片, 然而 无法批量下载了。
  问题来了:
  无法取到 HTML分析出 图片路径,而且路径名称随机。那么如何批量下载图片?
  既然 图片展示到我们面前,数据必然也已经到了 我们这边,就看我们这么取得了。
  解决办法:
  
  WebClient不行,于是想到了 Winform 的 WebBrowser 实现浏览器,能显示必然能取到数据。
  WebBrowser对于大部分网站还是可以的。然而对于 HTML5的 或者 新特性的 网站就有些 不方便了。有时候不能正常显示网站。例如,网站M.
  它依赖 操作系统的 IE浏览器,而且默认是系统里老版本的 IE。可能是 IE7 吧。
  一番资料查找 发现CefSharp。这个是Chrome 的另一个开源项目, C# 调用。可以在Winform,Wpf 等中 嵌入浏览器。
  CefSharp在网上有一些资料,不多。为了弄明白CefSharp里 取得 图片URL,图片数据。花了一番功夫,查资料,看源码。
  倾情大放送,来一大波代码:
  开发环境:VS2015 framework 4.5.2 x86模式 CefSharp 63.0.30
  winform:
  
  有了上面的代码,便可以获取到 目标网站的 任意资源了。
  END
  ●
  ●
  ●
  ●
  ●
  ●
  扫描二维码
  获取更多精彩
  关注服务号

浏览器插件提取方法【方法篇】

网站优化优采云 发表了文章 • 0 个评论 • 1037 次浏览 • 2022-07-08 09:38 • 来自相关话题

  浏览器插件提取方法【方法篇】
  Hello,大家好,今天给大家带来的是浏览器插件提取的方法。
  之前给大家分享过一个的插件,可以到Windows商店直接下载,但是有小伙伴在问,如何把下载好的插件提取出来?
  今天就跟大家一起来探讨方法
  需要软件(不了解的小伙伴可直接点击跳转文章)进行配合,主要是为了快速找到目录位置。
  那么我们现在开始,以AdGuard 广告拦截器插件为例
  一、打开浏览器拓展
  
  找到插件的版本号,将其数值复制下来。
  二、打开everything
  将版本号输入进去,进行查找。右击复制完整路径和文件名。
  这里因为哆啦的电脑上有两个浏览器,并且两个浏览器都安装了此插件,所以会有两个目录。
  三、打包扩展
  
  点击打包扩展,然后在扩展根目录处输入刚才复制的完整路径和文件名,点击打包扩展就OK了。私钥文件可以不填。
  打包完之后,在everything输入插件的版本号,就可以找到一个后缀为”.crx”的文件,这个就是提取出来的插件了。
  关注、点赞、在看是对哆啦最大的肯定
  后续会带来更多好玩的软件、网站、黑科技 查看全部

  浏览器插件提取方法【方法篇】
  Hello,大家好,今天给大家带来的是浏览器插件提取的方法。
  之前给大家分享过一个的插件,可以到Windows商店直接下载,但是有小伙伴在问,如何把下载好的插件提取出来?
  今天就跟大家一起来探讨方法
  需要软件(不了解的小伙伴可直接点击跳转文章)进行配合,主要是为了快速找到目录位置。
  那么我们现在开始,以AdGuard 广告拦截器插件为例
  一、打开浏览器拓展
  
  找到插件的版本号,将其数值复制下来。
  二、打开everything
  将版本号输入进去,进行查找。右击复制完整路径和文件名。
  这里因为哆啦的电脑上有两个浏览器,并且两个浏览器都安装了此插件,所以会有两个目录。
  三、打包扩展
  
  点击打包扩展,然后在扩展根目录处输入刚才复制的完整路径和文件名,点击打包扩展就OK了。私钥文件可以不填。
  打包完之后,在everything输入插件的版本号,就可以找到一个后缀为”.crx”的文件,这个就是提取出来的插件了。
  关注、点赞、在看是对哆啦最大的肯定
  后续会带来更多好玩的软件、网站、黑科技

深入浏览器原理系列(3)浏览器页面也是有生命周期的

网站优化优采云 发表了文章 • 0 个评论 • 90 次浏览 • 2022-07-02 22:16 • 来自相关话题

  深入浏览器原理系列(3)浏览器页面也是有生命周期的
  Android、iOS 和最新的 Windows 系统可以随时自主地停止后台进程,及时释放系统资源。也就是说,网页可能随时被系统丢弃掉。Page Visibility API 只在网页对用户不可见时触发,至于网页会不会被系统丢弃掉,它就无能为力了。
  为了解决这个问题,W3C 新制定了一个 Page Lifecycle API,统一了网页从诞生到卸载的行为模式,并且定义了新的事件,允许开发者响应网页状态的各种转换。
  有了这个 API,开发者就可以预测网页下一步的状态,从而进行各种针对性的处理。Chrome 68 支持这个 API,对于老式浏览器可以使用谷歌开发的兼容库 PageLifecycle.js。
  一、生命周期阶段
  网页的生命周期分成六个阶段,每个时刻只可能处于其中一个阶段。
  (1)Active 阶段
  在 Active 阶段,网页处于可见状态,且拥有输入焦点。
  (2)Passive 阶段
  在 Passive 阶段,网页可见,但没有输入焦点,无法接受输入。UI 更新(比如动画)仍然在执行。该阶段只可能发生在桌面同时有多个窗口的情况。
  (3)Hidden 阶段
  在 Hidden 阶段,用户的桌面被其他窗口占据,网页不可见,但尚未冻结。UI 更新不再执行。
  (4)Terminated 阶段
  在 Terminated 阶段,由于用户主动关闭窗口,或者在同一个窗口前往其他页面,导致当前页面开始被浏览器卸载并从内存中清除。注意,这个阶段总是在 Hidden 阶段之后发生,也就是说,用户主动离开当前页面,总是先进入 Hidden 阶段,再进入 Terminated 阶段。
  这个阶段会导致网页卸载,任何新任务都不会在这个阶段启动,并且如果运行时间太长,正在进行的任务可能会被终止。
  (5)Frozen 阶段
  如果网页处于 Hidden 阶段的时间过久,用户又不关闭网页,浏览器就有可能冻结网页,使其进入 Frozen 阶段。不过,也有可能,处于可见状态的页面长时间没有操作,也会进入 Frozen 阶段。
  这个阶段的特征是,网页不会再被分配 CPU 计算资源。定时器、回调函数、网络请求、DOM 操作都不会执行,不过正在运行的任务会执行完。浏览器可能会允许 Frozen 阶段的页面,周期性复苏一小段时间,短暂变回 Hidden 状态,允许一小部分任务执行。
  (6)Discarded 阶段
  如果网页长时间处于 Frozen 阶段,用户又不唤醒页面,那么就会进入 Discarded 阶段,即浏览器自动卸载网页,清除该网页的内存占用。不过,Passive 阶段的网页如果长时间没有互动,也可能直接进入 Discarded 阶段。
  这一般是在用户没有介入的情况下,由系统强制执行。任何类型的新任务或 JavaScript 代码,都不能在此阶段执行,因为这时通常处在资源限制的状况下。
  网页被浏览器自动 Discarded 以后,它的 Tab 窗口还是在的。如果用户重新访问这个 Tab 页,浏览器将会重新向服务器发出请求,再一次重新加载网页,回到 Active 阶段。
  二、常见场景
  
  以下是几个常见场景的网页生命周期变化。
  (1)用户打开网页后,又切换到其他 App,但只过了一会又回到网页。
  网页由 Active 变成 Hidden,又变回 Active。
  (2)用户打开网页后,又切换到其他 App,并且长时候使用后者,导致系统自动丢弃网页。
  网页由 Active 变成 Hidden,再变成 Frozen,最后 Discarded。
  (3)用户打开网页后,又切换到其他 App,然后从任务管理器里面将浏览器进程清除。
  网页由 Active 变成 Hidden,然后 Terminated。
  (4)系统丢弃了某个 Tab 里面的页面后,用户重新打开这个 Tab。
  网页由 Discarded 变成 Active。
  三、事件
  生命周期的各个阶段都有自己的事件,以供开发者指定监听函数。这些事件里面,只有两个是新定义的(freeze事件和resume事件),其它都是现有的。
  注意,网页的生命周期事件是在所有帧(frame)触发,不管是底层的帧,还是内嵌的帧。也就是说,内嵌的网页跟顶层网页一样,都会同时监听到下面的事件。
  3.1 focus 事件
  focus事件在页面获得输入焦点时触发,比如网页从 Passive 阶段变为 Active 阶段。
  3.2 blur 事件
  blur事件在页面失去输入焦点时触发,比如网页从 Active 阶段变为 Passive 阶段。
  3.3 visibilitychange 事件
  visibilitychange事件在网页可见状态发生变化时触发,一般发生在以下几种场景。
  可以通过document.onvisibilitychange属性指定这个事件的回调函数。
  3.4 freeze 事件
  freeze事件在网页进入 Frozen 阶段时触发。
  可以通过document.onfreeze属性指定在进入 Frozen 阶段时调用的回调函数。
  function handleFreeze(e) {<br /> // Handle transition to FROZEN<br />}<br />document.addEventListener('freeze', handleFreeze);<br /><br /># 或者<br />document.onfreeze = function() { ... }
  这个事件的监听函数,最长只能运行500毫秒。并且只能复用已经打开的网络连接,不能发起新的网络请求。
  
  注意,从 Frozen 阶段进入 Discarded 阶段,不会触发任何事件,无法指定回调函数,只能在进入 Frozen 阶段时指定回调函数。
  3.5 resume 事件
  resume事件在网页离开 Frozen 阶段,变为 Active / Passive / Hidden 阶段时触发。
  document.onresume属性指的是页面离开 Frozen 阶段、进入可用状态时调用的回调函数。
  function handleResume(e) {<br /> // handle state transition FROZEN -> ACTIVE<br />}<br />document.addEventListener("resume", handleResume);<br /><br /># 或者<br />document.onresume = function() { ... }
  3.6 pageshow 事件
  pageshow事件在用户加载网页时触发。这时,有可能是全新的页面加载,也可能是从缓存中获取的页面。如果是从缓存中获取,则该事件对象的event.persisted属性为true,否则为false。
  这个事件的名字有点误导,它跟页面的可见性其实毫无关系,只跟浏览器的 History 记录的变化有关。
  3.7 pagehide 事件
  pagehide事件在用户离开当前网页、进入另一个网页时触发。它的前提是浏览器的 History 记录必须发生变化,跟网页是否可见无关。
  如果浏览器能够将当前页面添加到缓存以供稍后重用,则事件对象的event.persisted属性为true。如果为true。如果页面添加到了缓存,则页面进入 Frozen 状态,否则进入 Terminatied 状态。
  3.8 beforeunload 事件
  beforeunload事件在窗口或文档即将卸载时触发。该事件发生时,文档仍然可见,此时卸载仍可取消。经过这个事件,网页进入 Terminated 状态。
  3.9 unload 事件
  unload事件在页面正在卸载时触发。经过这个事件,网页进入 Terminated 状态。
  四、获取当前阶段
  如果网页处于 Active、Passive 或 Hidden 阶段,可以通过下面的代码,获得网页当前的状态。
  const getState = () => {<br /> if (document.visibilityState === 'hidden') {<br /> return 'hidden';<br /> }<br /> if (document.hasFocus()) {<br /> return 'active';<br /> }<br /> return 'passive';<br />};
  如果网页处于 Frozen 和 Terminated 状态,由于定时器代码不会执行,只能通过事件监听判断状态。进入 Frozen 阶段,可以监听freeze事件;进入 Terminated 阶段,可以监听pagehide事件。
  五、document.wasDiscarded
  如果某个选项卡处于 Frozen 阶段,就随时有可能被系统丢弃,进入 Discarded 阶段。如果后来用户再次点击该选项卡,浏览器会重新加载该页面。
  这时,开发者可以通过判断document.wasDiscarded属性,了解先前的网页是否被丢弃了。
  if (document.wasDiscarded) {<br /> // 该网页已经不是原来的状态了,曾经被浏览器丢弃过<br /> // 恢复以前的状态<br /> getPersistedState(self.discardedClientId);<br />}
  同时,window对象上会新增window.clientId和window.discardedClientId两个属性,用来恢复丢弃前的状态。
  六、参考链接 查看全部

  深入浏览器原理系列(3)浏览器页面也是有生命周期的
  Android、iOS 和最新的 Windows 系统可以随时自主地停止后台进程,及时释放系统资源。也就是说,网页可能随时被系统丢弃掉。Page Visibility API 只在网页对用户不可见时触发,至于网页会不会被系统丢弃掉,它就无能为力了。
  为了解决这个问题,W3C 新制定了一个 Page Lifecycle API,统一了网页从诞生到卸载的行为模式,并且定义了新的事件,允许开发者响应网页状态的各种转换。
  有了这个 API,开发者就可以预测网页下一步的状态,从而进行各种针对性的处理。Chrome 68 支持这个 API,对于老式浏览器可以使用谷歌开发的兼容库 PageLifecycle.js。
  一、生命周期阶段
  网页的生命周期分成六个阶段,每个时刻只可能处于其中一个阶段。
  (1)Active 阶段
  在 Active 阶段,网页处于可见状态,且拥有输入焦点。
  (2)Passive 阶段
  在 Passive 阶段,网页可见,但没有输入焦点,无法接受输入。UI 更新(比如动画)仍然在执行。该阶段只可能发生在桌面同时有多个窗口的情况。
  (3)Hidden 阶段
  在 Hidden 阶段,用户的桌面被其他窗口占据,网页不可见,但尚未冻结。UI 更新不再执行。
  (4)Terminated 阶段
  在 Terminated 阶段,由于用户主动关闭窗口,或者在同一个窗口前往其他页面,导致当前页面开始被浏览器卸载并从内存中清除。注意,这个阶段总是在 Hidden 阶段之后发生,也就是说,用户主动离开当前页面,总是先进入 Hidden 阶段,再进入 Terminated 阶段。
  这个阶段会导致网页卸载,任何新任务都不会在这个阶段启动,并且如果运行时间太长,正在进行的任务可能会被终止。
  (5)Frozen 阶段
  如果网页处于 Hidden 阶段的时间过久,用户又不关闭网页,浏览器就有可能冻结网页,使其进入 Frozen 阶段。不过,也有可能,处于可见状态的页面长时间没有操作,也会进入 Frozen 阶段。
  这个阶段的特征是,网页不会再被分配 CPU 计算资源。定时器、回调函数、网络请求、DOM 操作都不会执行,不过正在运行的任务会执行完。浏览器可能会允许 Frozen 阶段的页面,周期性复苏一小段时间,短暂变回 Hidden 状态,允许一小部分任务执行。
  (6)Discarded 阶段
  如果网页长时间处于 Frozen 阶段,用户又不唤醒页面,那么就会进入 Discarded 阶段,即浏览器自动卸载网页,清除该网页的内存占用。不过,Passive 阶段的网页如果长时间没有互动,也可能直接进入 Discarded 阶段。
  这一般是在用户没有介入的情况下,由系统强制执行。任何类型的新任务或 JavaScript 代码,都不能在此阶段执行,因为这时通常处在资源限制的状况下。
  网页被浏览器自动 Discarded 以后,它的 Tab 窗口还是在的。如果用户重新访问这个 Tab 页,浏览器将会重新向服务器发出请求,再一次重新加载网页,回到 Active 阶段。
  二、常见场景
  
  以下是几个常见场景的网页生命周期变化。
  (1)用户打开网页后,又切换到其他 App,但只过了一会又回到网页。
  网页由 Active 变成 Hidden,又变回 Active。
  (2)用户打开网页后,又切换到其他 App,并且长时候使用后者,导致系统自动丢弃网页。
  网页由 Active 变成 Hidden,再变成 Frozen,最后 Discarded。
  (3)用户打开网页后,又切换到其他 App,然后从任务管理器里面将浏览器进程清除。
  网页由 Active 变成 Hidden,然后 Terminated。
  (4)系统丢弃了某个 Tab 里面的页面后,用户重新打开这个 Tab。
  网页由 Discarded 变成 Active。
  三、事件
  生命周期的各个阶段都有自己的事件,以供开发者指定监听函数。这些事件里面,只有两个是新定义的(freeze事件和resume事件),其它都是现有的。
  注意,网页的生命周期事件是在所有帧(frame)触发,不管是底层的帧,还是内嵌的帧。也就是说,内嵌的网页跟顶层网页一样,都会同时监听到下面的事件。
  3.1 focus 事件
  focus事件在页面获得输入焦点时触发,比如网页从 Passive 阶段变为 Active 阶段。
  3.2 blur 事件
  blur事件在页面失去输入焦点时触发,比如网页从 Active 阶段变为 Passive 阶段。
  3.3 visibilitychange 事件
  visibilitychange事件在网页可见状态发生变化时触发,一般发生在以下几种场景。
  可以通过document.onvisibilitychange属性指定这个事件的回调函数。
  3.4 freeze 事件
  freeze事件在网页进入 Frozen 阶段时触发。
  可以通过document.onfreeze属性指定在进入 Frozen 阶段时调用的回调函数。
  function handleFreeze(e) {<br /> // Handle transition to FROZEN<br />}<br />document.addEventListener('freeze', handleFreeze);<br /><br /># 或者<br />document.onfreeze = function() { ... }
  这个事件的监听函数,最长只能运行500毫秒。并且只能复用已经打开的网络连接,不能发起新的网络请求。
  
  注意,从 Frozen 阶段进入 Discarded 阶段,不会触发任何事件,无法指定回调函数,只能在进入 Frozen 阶段时指定回调函数。
  3.5 resume 事件
  resume事件在网页离开 Frozen 阶段,变为 Active / Passive / Hidden 阶段时触发。
  document.onresume属性指的是页面离开 Frozen 阶段、进入可用状态时调用的回调函数。
  function handleResume(e) {<br /> // handle state transition FROZEN -> ACTIVE<br />}<br />document.addEventListener("resume", handleResume);<br /><br /># 或者<br />document.onresume = function() { ... }
  3.6 pageshow 事件
  pageshow事件在用户加载网页时触发。这时,有可能是全新的页面加载,也可能是从缓存中获取的页面。如果是从缓存中获取,则该事件对象的event.persisted属性为true,否则为false。
  这个事件的名字有点误导,它跟页面的可见性其实毫无关系,只跟浏览器的 History 记录的变化有关。
  3.7 pagehide 事件
  pagehide事件在用户离开当前网页、进入另一个网页时触发。它的前提是浏览器的 History 记录必须发生变化,跟网页是否可见无关。
  如果浏览器能够将当前页面添加到缓存以供稍后重用,则事件对象的event.persisted属性为true。如果为true。如果页面添加到了缓存,则页面进入 Frozen 状态,否则进入 Terminatied 状态。
  3.8 beforeunload 事件
  beforeunload事件在窗口或文档即将卸载时触发。该事件发生时,文档仍然可见,此时卸载仍可取消。经过这个事件,网页进入 Terminated 状态。
  3.9 unload 事件
  unload事件在页面正在卸载时触发。经过这个事件,网页进入 Terminated 状态。
  四、获取当前阶段
  如果网页处于 Active、Passive 或 Hidden 阶段,可以通过下面的代码,获得网页当前的状态。
  const getState = () => {<br /> if (document.visibilityState === 'hidden') {<br /> return 'hidden';<br /> }<br /> if (document.hasFocus()) {<br /> return 'active';<br /> }<br /> return 'passive';<br />};
  如果网页处于 Frozen 和 Terminated 状态,由于定时器代码不会执行,只能通过事件监听判断状态。进入 Frozen 阶段,可以监听freeze事件;进入 Terminated 阶段,可以监听pagehide事件。
  五、document.wasDiscarded
  如果某个选项卡处于 Frozen 阶段,就随时有可能被系统丢弃,进入 Discarded 阶段。如果后来用户再次点击该选项卡,浏览器会重新加载该页面。
  这时,开发者可以通过判断document.wasDiscarded属性,了解先前的网页是否被丢弃了。
  if (document.wasDiscarded) {<br /> // 该网页已经不是原来的状态了,曾经被浏览器丢弃过<br /> // 恢复以前的状态<br /> getPersistedState(self.discardedClientId);<br />}
  同时,window对象上会新增window.clientId和window.discardedClientId两个属性,用来恢复丢弃前的状态。
  六、参考链接

手机浏览器抓取网页在重新渲染还是很不错?

网站优化优采云 发表了文章 • 0 个评论 • 88 次浏览 • 2022-06-30 22:00 • 来自相关话题

  手机浏览器抓取网页在重新渲染还是很不错?
  浏览器抓取网页在重新渲染还是很不错,比如网页上写了个点击xxx可以购买,但是我电脑上没有这个,现在有这么一种方法就是先截图,然后再网上淘一个假的该网页的截图,或者直接做一个验证码,这样抓取网页就可以转化为图片。
  action=open('test.php','wb')body=action.get('user-agent')
  还有php脚本有一个直接自动抓取ajaxhttp协议页面的就是用一个url解析器转换后再转换成html所以速度不快
  
  通过ajax加载其他页面
  通过ajax加载图片
  高配手机可能可以借助app抓包工具弄出来;低配可能只能手动了。
  
  手机浏览器也能抓包,
  这个就像你开车游玩,有一种叫导航的东西,我不知道你是否能抓包弄个导航软件出来,
  chrome或者firefox中有crossjson抓包工具,可以抓。不过,其实各大浏览器都自带这个功能,所以还是建议用chrome或者firefox抓,很多网站的js都绑定在浏览器里面的。而且chrome的抓包也不会出什么问题,我通常通过ff就可以拿到js代码。ps:同意@nezhangcheng的说法,ajax的问题,一般抓包是抓不到的,可以用纯javascript抓包,不过这样速度就会慢一些。
  要抓包的是http协议页面,所以可以通过控制webpack在一定程度上可以提高效率。其他如果不是特殊需求,使用传统的xmlhttprequest就可以实现(几乎没有抓包的必要)。而我相信很多抓包工具都不支持xmlhttprequest的ajax请求,这方面可以再研究一下。(xmlhttprequest的请求速度也不快)。 查看全部

  手机浏览器抓取网页在重新渲染还是很不错?
  浏览器抓取网页在重新渲染还是很不错,比如网页上写了个点击xxx可以购买,但是我电脑上没有这个,现在有这么一种方法就是先截图,然后再网上淘一个假的该网页的截图,或者直接做一个验证码,这样抓取网页就可以转化为图片。
  action=open('test.php','wb')body=action.get('user-agent')
  还有php脚本有一个直接自动抓取ajaxhttp协议页面的就是用一个url解析器转换后再转换成html所以速度不快
  
  通过ajax加载其他页面
  通过ajax加载图片
  高配手机可能可以借助app抓包工具弄出来;低配可能只能手动了。
  
  手机浏览器也能抓包,
  这个就像你开车游玩,有一种叫导航的东西,我不知道你是否能抓包弄个导航软件出来,
  chrome或者firefox中有crossjson抓包工具,可以抓。不过,其实各大浏览器都自带这个功能,所以还是建议用chrome或者firefox抓,很多网站的js都绑定在浏览器里面的。而且chrome的抓包也不会出什么问题,我通常通过ff就可以拿到js代码。ps:同意@nezhangcheng的说法,ajax的问题,一般抓包是抓不到的,可以用纯javascript抓包,不过这样速度就会慢一些。
  要抓包的是http协议页面,所以可以通过控制webpack在一定程度上可以提高效率。其他如果不是特殊需求,使用传统的xmlhttprequest就可以实现(几乎没有抓包的必要)。而我相信很多抓包工具都不支持xmlhttprequest的ajax请求,这方面可以再研究一下。(xmlhttprequest的请求速度也不快)。

钓鱼网站可利用浏览器“自动填充”功能获取用户信息

网站优化优采云 发表了文章 • 0 个评论 • 256 次浏览 • 2022-06-26 14:13 • 来自相关话题

  钓鱼网站可利用浏览器“自动填充”功能获取用户信息
  01/浏览器自动填充功能
  昨天看到了一篇关于Chrome自动填充安全相关的文章。
  文中提到:“自动填充是个非常方便的浏览器特性,不过该特性在 Chrome 上会存在一定的信息泄露的风险。Chrome 最近才修复了某个久负盛名漏洞。简单而言,黑客能够利用自动填充窃取你并不想提交给该网站的信息”。
  效果如下图:
  并提供了一段js来演示漏洞:
  仅测试这段js,发现并不能复现此漏洞,但是这个思路引起了我的思考。
  02/ 浏览器新特性--autocomplete
  再次研究发现,html中要实现浏览器中的表单自动填充主要依靠于autocomplete属性。
  起初autocomplete属性只支持on或off。比如下面代码:
  上面代码开启了整个表单的autocomplete却对email关闭了autocomplete,我们在点击非email的其他字段即可打开自动填充功能:
  但在email中不能展开自动填充功能:
  后来HTML5标准加入了对autocomplete的支持,并且给autocomplete加入了更多的标示符,以保证让浏览器准确的知道哪些信息对应着表单里的哪些字段。
  比如如下代码:
  在autocomplete属性中写入了语义化的字符,比如name、street-address等。
  通过这些标识,浏览器即可准确的把相应的信息填入到相应的表单中。
  03/钓鱼网站可能会这么用
  通过如上demo我们可以发现,当我们选择自动填充以后,chrome不仅会把当前表单字段填充到input中,也会把其他表单字段填充到input中。
  那么如果写一些type为hidden的input标签,并且加上autocomplete属性,chrome是否会自动补上带有hidden属性的input标签的信息呢。
  我们使用如下代码:
  将第一个姓名字段设置为hidden,然后使用自动填充,并且提交表单,查看请求包:
  
  发现type属性为hidden的表单并没有获取到,但其他非hidden的信息都拿到了。
  既然type设置成hidden浏览器不会发送数据,隐藏浏览器元素还有很多方法,比如:
  在表单外层放一个div,让整个div,display:none。
  然而也是不行的:
  看来chrome已经在这里做了足够防护。
  其实在文章最初提供的js代码也是使用这样的方式来进行攻击的。
  现在已经被修复了。那么还有别的办法吗?
  04/可利用的方式
  让浏览器认识且没有做防护,并且让用户看不见这个表单的方法有很多,比如如下方法:
  效果如下:
  bingo!!
  这种方式浏览器并没有防护,其实让用户看不到表单的方式还有很多,还比如设置成透明等等……
  由此想到,如果钓鱼网站利用了这个功能,在用户不知情的情况下,拿到用户浏览器存储的其他信息,会造成很可怕的后果。
  在线测试地址:
  05/如何防护
  既然这个功能是浏览器的功能,在浏览器还未完全将不可见的表单字段设置为不可填充之前,我们只好通过设置,来避免使用这个功能。
  通过打开chrome浏览器的设置--高级设置,然后点掉下图中的复选框,关闭自动填充功能。
  06/参考资料
  HTML标准 - 表单自动填充
  SegmentFault 查看全部

  钓鱼网站可利用浏览器“自动填充”功能获取用户信息
  01/浏览器自动填充功能
  昨天看到了一篇关于Chrome自动填充安全相关的文章。
  文中提到:“自动填充是个非常方便的浏览器特性,不过该特性在 Chrome 上会存在一定的信息泄露的风险。Chrome 最近才修复了某个久负盛名漏洞。简单而言,黑客能够利用自动填充窃取你并不想提交给该网站的信息”。
  效果如下图:
  并提供了一段js来演示漏洞:
  仅测试这段js,发现并不能复现此漏洞,但是这个思路引起了我的思考。
  02/ 浏览器新特性--autocomplete
  再次研究发现,html中要实现浏览器中的表单自动填充主要依靠于autocomplete属性。
  起初autocomplete属性只支持on或off。比如下面代码:
  上面代码开启了整个表单的autocomplete却对email关闭了autocomplete,我们在点击非email的其他字段即可打开自动填充功能:
  但在email中不能展开自动填充功能:
  后来HTML5标准加入了对autocomplete的支持,并且给autocomplete加入了更多的标示符,以保证让浏览器准确的知道哪些信息对应着表单里的哪些字段。
  比如如下代码:
  在autocomplete属性中写入了语义化的字符,比如name、street-address等。
  通过这些标识,浏览器即可准确的把相应的信息填入到相应的表单中。
  03/钓鱼网站可能会这么用
  通过如上demo我们可以发现,当我们选择自动填充以后,chrome不仅会把当前表单字段填充到input中,也会把其他表单字段填充到input中。
  那么如果写一些type为hidden的input标签,并且加上autocomplete属性,chrome是否会自动补上带有hidden属性的input标签的信息呢。
  我们使用如下代码:
  将第一个姓名字段设置为hidden,然后使用自动填充,并且提交表单,查看请求包:
  
  发现type属性为hidden的表单并没有获取到,但其他非hidden的信息都拿到了。
  既然type设置成hidden浏览器不会发送数据,隐藏浏览器元素还有很多方法,比如:
  在表单外层放一个div,让整个div,display:none。
  然而也是不行的:
  看来chrome已经在这里做了足够防护。
  其实在文章最初提供的js代码也是使用这样的方式来进行攻击的。
  现在已经被修复了。那么还有别的办法吗?
  04/可利用的方式
  让浏览器认识且没有做防护,并且让用户看不见这个表单的方法有很多,比如如下方法:
  效果如下:
  bingo!!
  这种方式浏览器并没有防护,其实让用户看不到表单的方式还有很多,还比如设置成透明等等……
  由此想到,如果钓鱼网站利用了这个功能,在用户不知情的情况下,拿到用户浏览器存储的其他信息,会造成很可怕的后果。
  在线测试地址:
  05/如何防护
  既然这个功能是浏览器的功能,在浏览器还未完全将不可见的表单字段设置为不可填充之前,我们只好通过设置,来避免使用这个功能。
  通过打开chrome浏览器的设置--高级设置,然后点掉下图中的复选框,关闭自动填充功能。
  06/参考资料
  HTML标准 - 表单自动填充
  SegmentFault

Linux奇技淫巧:一款特别轻量级的网页浏览器

网站优化优采云 发表了文章 • 0 个评论 • 535 次浏览 • 2022-06-20 00:29 • 来自相关话题

  Linux奇技淫巧:一款特别轻量级的网页浏览器
  
  
  Dillo,一款小巧非常轻量级的网络浏览器。(源代码约420 KB,二进制程序约350KB。),遵循GPL协议。用C语言编写,使用了GTK+ toolkit,该浏览器特别适合运行于老计算机,以及嵌入系统。
  Dillo目前还不支持CSS、JavaScript等,对框架的支持也很有限。(主页地址:,目前已经停止更新。)Dillo特别适合安装在Raspbian系统中,在树梅派上,Dillo加载网页运行速度很快快。
  由于GTK+2 的功能变更很大,不符合Dillo "短小精悍"的需求,所以 Dillo转向以FLTK2作graphic toolkit。目前porting到FLTK2的工作已经近乎完成一些UNIX/Linux发行版本,包括Debian、RedHat、NetBSD等,有Dillo的安装包,一些小型的Linux系统,包括Damn Small Linux、Feather Linux,将Dillo作为主力浏览器。Dillo的特点是轻巧、快速。一般安装完dillo之后是不能正确显示中文的,所有中文都显示为口样方块(如下图)。没事,修改一下配置文件中的字体即可。
  1、安装dillo和文泉驿中文字体sudo apt-get install dillo
  2、安装中文字体(很重要)sudo apt-get install ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy
  3、修改Dillo配置文件,修改字体部分。(重要)先复制到主目录 cp /etc/dillo/dillorc $HOME/.dillo/
  
  用编辑器打开$HOME/.dillo/dillorc,在最后增加以下配置内容:font_serif="Serif"
  font_sans_serif="Sans"
  font_cursive="Sans"
  font_fantasy="Sans"
  font_monospace="Sans Mono"
  
  到此就OK,Dillo可正常显示中文,效果图见本文最上面。那么你想尝试下这款小巧的网页浏览器呢?
  
  -------------------------
  知乎:良许LinuxB站:程序员良许抖音:良许微博:良许Linux
  <p style="margin: 0.5em 8px;max-width: 100%;min-height: 1em;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);white-space: pre-wrap;border-color: rgb(160, 160, 160);border-top-width: 1px;color: transparent;border-top-style: dashed;text-align: center;line-height: 1.75em;box-sizing: border-box !important;word-wrap: break-word !important;"><br style="max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />
  打卡送书活动
  活动介绍:打卡送书活动暂停通知
  赞助商:清华大学出版社
  本书采用丰富的图例来阐述基本概念,并以简洁清晰的语言来诠释重要的理论和算法,同时配合完整的范例程序代码,使读者可以通过“实例 实践”来熟悉数据结构。
  <br style="max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  推荐阅读:<br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  12306崩了,90%的人都用过这三款抢票工具<br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  30 张图带你彻底理解红黑树<br />
  8种常见SQL错误用法
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「1024」,即可免费获取!!
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" /></p> 查看全部

  Linux奇技淫巧:一款特别轻量级的网页浏览器
  
  
  Dillo,一款小巧非常轻量级的网络浏览器。(源代码约420 KB,二进制程序约350KB。),遵循GPL协议。用C语言编写,使用了GTK+ toolkit,该浏览器特别适合运行于老计算机,以及嵌入系统。
  Dillo目前还不支持CSS、JavaScript等,对框架的支持也很有限。(主页地址:,目前已经停止更新。)Dillo特别适合安装在Raspbian系统中,在树梅派上,Dillo加载网页运行速度很快快。
  由于GTK+2 的功能变更很大,不符合Dillo "短小精悍"的需求,所以 Dillo转向以FLTK2作graphic toolkit。目前porting到FLTK2的工作已经近乎完成一些UNIX/Linux发行版本,包括Debian、RedHat、NetBSD等,有Dillo的安装包,一些小型的Linux系统,包括Damn Small Linux、Feather Linux,将Dillo作为主力浏览器。Dillo的特点是轻巧、快速。一般安装完dillo之后是不能正确显示中文的,所有中文都显示为口样方块(如下图)。没事,修改一下配置文件中的字体即可。
  1、安装dillo和文泉驿中文字体sudo apt-get install dillo
  2、安装中文字体(很重要)sudo apt-get install ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy
  3、修改Dillo配置文件,修改字体部分。(重要)先复制到主目录 cp /etc/dillo/dillorc $HOME/.dillo/
  
  用编辑器打开$HOME/.dillo/dillorc,在最后增加以下配置内容:font_serif="Serif"
  font_sans_serif="Sans"
  font_cursive="Sans"
  font_fantasy="Sans"
  font_monospace="Sans Mono"
  
  到此就OK,Dillo可正常显示中文,效果图见本文最上面。那么你想尝试下这款小巧的网页浏览器呢?
  
  -------------------------
  知乎:良许LinuxB站:程序员良许抖音:良许微博:良许Linux
  <p style="margin: 0.5em 8px;max-width: 100%;min-height: 1em;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);white-space: pre-wrap;border-color: rgb(160, 160, 160);border-top-width: 1px;color: transparent;border-top-style: dashed;text-align: center;line-height: 1.75em;box-sizing: border-box !important;word-wrap: break-word !important;"><br style="max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />
  打卡送书活动
  活动介绍:打卡送书活动暂停通知
  赞助商:清华大学出版社
  本书采用丰富的图例来阐述基本概念,并以简洁清晰的语言来诠释重要的理论和算法,同时配合完整的范例程序代码,使读者可以通过“实例 实践”来熟悉数据结构。
  <br style="max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  推荐阅读:<br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  12306崩了,90%的人都用过这三款抢票工具<br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  30 张图带你彻底理解红黑树<br />
  8种常见SQL错误用法
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「1024」,即可免费获取!!
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" /></p>

使用谷歌浏览器扩展程序提取插件另类访问、搜索下载RuTracker资源站详细教程

网站优化优采云 发表了文章 • 0 个评论 • 295 次浏览 • 2022-06-19 03:08 • 来自相关话题

  使用谷歌浏览器扩展程序提取插件另类访问、搜索下载RuTracker资源站详细教程
  Hello大家好,最近因为战斗民族冲突,最后呢全俄最大的好好好资源站rutracer解锁了,真是我辈喜闻乐见呀,所以今天也给大家分享下都在热谈的RuTracker访问、搜索下载的教程。一、谷歌浏览器提取RuTracker插件现在有很多介绍RuTracker的访问下载的方法,但都是直接到某某下载成品插件使用,小白很容易找晕,我使用的是谷歌浏览器扩展程序提取此插件并保存使用的方式。首要条件就是pc已经安装谷歌浏览器,并且已经安装了GG助手插件,这是因为很多用谷歌浏览器的很多朋友已经安装了GG助手插件,此扩展插件比直接下载RuTracker简单方便,不需要绕上一圈。
  很多伙伴直接访问RuTracker都是1020错误,此图留念。直接上成品图
  
  全部设置好就可直接访问,速度较快。
  
  首先打开谷歌浏览器(红圈内是GG插件已经提前安装好)
  右上角菜单打开,在更多工具,打开扩展程序。
  
  在扩展程序左下角,打开网上应用。
  左上角搜索rutracker,这时出现2个相似图标的扩展程序,下面有org网址的是正确的,注意不要安装错了,点击进去
  在说明页面点安装即可(因为安装过了所以显示的是删除,这个可以忽略)
  
  这时我们可以到扩展程序看到的访问插件。此时就可以直接用谷歌浏览器直接访问了。但平时很多朋友不用谷歌浏览器怎么办,所以以上还只是前提方式,我们只要提取出谷歌浏览器安装好的RuTracker插件就可以供其它国产浏览器使用了。在上图的RuTracker红色方框,点击详情。
  
  可以在详情内RuTracker插件的ID串,这时我们可以使用文件搜索工具如everything或者资源管理器内直接搜索ID字符串,当然,对谷歌插件目录熟悉的也可以直接找到该文件夹。这时可以通过搜索或直接找到RuTracker插件文件夹。我们可以把些文件夹整个复制到其它位置备用即可(不单独复制出来也可以)二、浏览器安装RuTracker插件及搜索下载
  
  
  这时我们打开自己常用的国产浏览器。这里我测试使用的是yandex浏览器,哈哈,俄罗斯产的浏览器访问俄罗斯的资源站。在菜单打开,扩展插件。
  
  在扩展插件页直接把刚才的RuTracker整个文件夹拖放到插件页即可成功安装
  这里可以直接看到RuTracker扩展已经启动,访问下吧
  
  默认的是俄文,当然有很多翻译插件,这个不多说,国产浏览器点下翻译很容易,当然,弹窗广告也很容易。那正常访问后我们如何下载自己想要的资源呢?
  
  其它只要在浏览器内输入资源名称后面加上就会显示出来搜索结果。以现在最火的艾尔登法环游戏为例。
  直接输入游戏英文名称(或加上:)就可以显示出第一个搜索结果就是RuTracker资源站的。当然我这里是Yandex浏览器默认的搜索,很方便。必应也可以。国产的常用浏览器是没有的。
  
  
  按搜索结果找到后,可以看到下载链接,这就是我们要找到的。
  
  没有BT、QB等等,直接用爱拿上传的知名下载软件测试,300M的宽带速度最高可以到40M下载速度,很感动,哈哈。另外使用谷歌浏览器提取出的RuTracker也在国产浏览器安装测试,结果是ok的。
  
  在Q浏览器菜单,打开应用中心
  同样是直接把rutracker整个文件夹拖放进来,自动安装好扩展应用。
  
  然后直接就可以访问了。第一次真是贴心的右上角提示立即翻译为中文。总结:以上是先用谷歌浏览器提取插件,然后提取出来的插件再安装到其它常用浏览器使用。这对于很多有谷歌浏览器和GG助手的朋友就不用绕圈子到处找rutracker去了。重点:以上所有内容资源仅供学习、研究使用,下载后请自行删除。
  需要使用rutracker浏览器插件的可以关注回复“rutracker”即可下载 查看全部

  使用谷歌浏览器扩展程序提取插件另类访问、搜索下载RuTracker资源站详细教程
  Hello大家好,最近因为战斗民族冲突,最后呢全俄最大的好好好资源站rutracer解锁了,真是我辈喜闻乐见呀,所以今天也给大家分享下都在热谈的RuTracker访问、搜索下载的教程。一、谷歌浏览器提取RuTracker插件现在有很多介绍RuTracker的访问下载的方法,但都是直接到某某下载成品插件使用,小白很容易找晕,我使用的是谷歌浏览器扩展程序提取此插件并保存使用的方式。首要条件就是pc已经安装谷歌浏览器,并且已经安装了GG助手插件,这是因为很多用谷歌浏览器的很多朋友已经安装了GG助手插件,此扩展插件比直接下载RuTracker简单方便,不需要绕上一圈。
  很多伙伴直接访问RuTracker都是1020错误,此图留念。直接上成品图
  
  全部设置好就可直接访问,速度较快。
  
  首先打开谷歌浏览器(红圈内是GG插件已经提前安装好)
  右上角菜单打开,在更多工具,打开扩展程序。
  
  在扩展程序左下角,打开网上应用。
  左上角搜索rutracker,这时出现2个相似图标的扩展程序,下面有org网址的是正确的,注意不要安装错了,点击进去
  在说明页面点安装即可(因为安装过了所以显示的是删除,这个可以忽略)
  
  这时我们可以到扩展程序看到的访问插件。此时就可以直接用谷歌浏览器直接访问了。但平时很多朋友不用谷歌浏览器怎么办,所以以上还只是前提方式,我们只要提取出谷歌浏览器安装好的RuTracker插件就可以供其它国产浏览器使用了。在上图的RuTracker红色方框,点击详情。
  
  可以在详情内RuTracker插件的ID串,这时我们可以使用文件搜索工具如everything或者资源管理器内直接搜索ID字符串,当然,对谷歌插件目录熟悉的也可以直接找到该文件夹。这时可以通过搜索或直接找到RuTracker插件文件夹。我们可以把些文件夹整个复制到其它位置备用即可(不单独复制出来也可以)二、浏览器安装RuTracker插件及搜索下载
  
  
  这时我们打开自己常用的国产浏览器。这里我测试使用的是yandex浏览器,哈哈,俄罗斯产的浏览器访问俄罗斯的资源站。在菜单打开,扩展插件。
  
  在扩展插件页直接把刚才的RuTracker整个文件夹拖放到插件页即可成功安装
  这里可以直接看到RuTracker扩展已经启动,访问下吧
  
  默认的是俄文,当然有很多翻译插件,这个不多说,国产浏览器点下翻译很容易,当然,弹窗广告也很容易。那正常访问后我们如何下载自己想要的资源呢?
  
  其它只要在浏览器内输入资源名称后面加上就会显示出来搜索结果。以现在最火的艾尔登法环游戏为例。
  直接输入游戏英文名称(或加上:)就可以显示出第一个搜索结果就是RuTracker资源站的。当然我这里是Yandex浏览器默认的搜索,很方便。必应也可以。国产的常用浏览器是没有的。
  
  
  按搜索结果找到后,可以看到下载链接,这就是我们要找到的。
  
  没有BT、QB等等,直接用爱拿上传的知名下载软件测试,300M的宽带速度最高可以到40M下载速度,很感动,哈哈。另外使用谷歌浏览器提取出的RuTracker也在国产浏览器安装测试,结果是ok的。
  
  在Q浏览器菜单,打开应用中心
  同样是直接把rutracker整个文件夹拖放进来,自动安装好扩展应用。
  
  然后直接就可以访问了。第一次真是贴心的右上角提示立即翻译为中文。总结:以上是先用谷歌浏览器提取插件,然后提取出来的插件再安装到其它常用浏览器使用。这对于很多有谷歌浏览器和GG助手的朋友就不用绕圈子到处找rutracker去了。重点:以上所有内容资源仅供学习、研究使用,下载后请自行删除。
  需要使用rutracker浏览器插件的可以关注回复“rutracker”即可下载

Selenium通过无页面浏览器执行用例

网站优化优采云 发表了文章 • 0 个评论 • 92 次浏览 • 2022-06-16 03:25 • 来自相关话题

  Selenium通过无页面浏览器执行用例
  
  出品|51Testing软件测试网
  
  前言
  在跑UI自动化测试的时候,每次执行脚本都会弹出浏览器框,如果只是想看断言结果,不想看执行过程的话,我们可以直接通过无页面浏览器进行打开,不会占用电脑屏幕。那么如何通过Selenium实现无页面浏览器操作呢?
  
  chrome浏览器无页面启动
  先介绍一种大家经常使用的chrome浏览器,Selenium支持chrome配置信息。我们可以通过加上对应的配置信息来让浏览器通过无页面启动。
  from selenium import webdriveropt = webdriver.ChromeOptions()opt.headless = True # 把Chrome设置成可视化无界面模式driver = webdriver.Chrome(options=opt) # 创建Chrome无界面对象
  (左右滑动查看完整代码)
  下面安静通过禅道登录的实例的形式给大家展示chrome浏览器无页面启动内容。
  from selenium import webdriverimport timeopt = webdriver.ChromeOptions()opt.headless = True # 把Chrome设置成可视化无界面模式driver = webdriver.Chrome(options=opt) # 创建Chrome无界面对象driver.get('http://127.0.0.1/pro/user-login.html')driver.find_element_by_id('account').send_keys('test')driver.find_element_by_name('password').send_keys('test123456')driver.find_element_by_id('submit').click()time.sleep(2)# 获取账号的名称。name = driver.find_element_by_xpath('//*[@class="dropdown-toggle"]').textprint('登录用户名:{}'.format(name))# 断言登录的用户名assert name == '测试'# 获取浏览器标题print('登录成功的浏览器标题是:{}'.format(driver.title))# 获取浏览器的urlprint('登录成功后的url地址:{}'.format(driver.current_url))
  (左右滑动查看完整代码)
  通过执行代码,安静这里给大家附上了动图,可以看到已经成功的完成了登录并获取到了登录成功后的浏览器标题以及浏览器的url地址。

  
  phantomjs无页面启动
  phantomjs一个基于webkit的JavaScript API,可以用来访问浏览器访问的内容,俗称一个隐形的浏览器,这里它也可以帮助我们进行实现无页面浏览器执行自动化。
  ......
  本文为51Testing软件测试网
  第六十一期电子杂志内容
  剩余精彩内容请点击下方 查看全部

  Selenium通过无页面浏览器执行用例
  
  出品|51Testing软件测试网
  
  前言
  在跑UI自动化测试的时候,每次执行脚本都会弹出浏览器框,如果只是想看断言结果,不想看执行过程的话,我们可以直接通过无页面浏览器进行打开,不会占用电脑屏幕。那么如何通过Selenium实现无页面浏览器操作呢?
  
  chrome浏览器无页面启动
  先介绍一种大家经常使用的chrome浏览器,Selenium支持chrome配置信息。我们可以通过加上对应的配置信息来让浏览器通过无页面启动。
  from selenium import webdriveropt = webdriver.ChromeOptions()opt.headless = True # 把Chrome设置成可视化无界面模式driver = webdriver.Chrome(options=opt) # 创建Chrome无界面对象
  (左右滑动查看完整代码)
  下面安静通过禅道登录的实例的形式给大家展示chrome浏览器无页面启动内容。
  from selenium import webdriverimport timeopt = webdriver.ChromeOptions()opt.headless = True # 把Chrome设置成可视化无界面模式driver = webdriver.Chrome(options=opt) # 创建Chrome无界面对象driver.get('http://127.0.0.1/pro/user-login.html')driver.find_element_by_id('account').send_keys('test')driver.find_element_by_name('password').send_keys('test123456')driver.find_element_by_id('submit').click()time.sleep(2)# 获取账号的名称。name = driver.find_element_by_xpath('//*[@class="dropdown-toggle"]').textprint('登录用户名:{}'.format(name))# 断言登录的用户名assert name == '测试'# 获取浏览器标题print('登录成功的浏览器标题是:{}'.format(driver.title))# 获取浏览器的urlprint('登录成功后的url地址:{}'.format(driver.current_url))
  (左右滑动查看完整代码)
  通过执行代码,安静这里给大家附上了动图,可以看到已经成功的完成了登录并获取到了登录成功后的浏览器标题以及浏览器的url地址。

  
  phantomjs无页面启动
  phantomjs一个基于webkit的JavaScript API,可以用来访问浏览器访问的内容,俗称一个隐形的浏览器,这里它也可以帮助我们进行实现无页面浏览器执行自动化。
  ......
  本文为51Testing软件测试网
  第六十一期电子杂志内容
  剩余精彩内容请点击下方

【手机软件】利用Alook浏览器抓取Cookies

网站优化优采云 发表了文章 • 0 个评论 • 988 次浏览 • 2022-06-12 18:38 • 来自相关话题

  【手机软件】利用Alook浏览器抓取Cookies
  简介软件名称:Alook(苹果也有但是AppStore收费6元)测试系统:安卓9测试手机:华为p30多号用户请不要直接退出,请看教程!!!第一步:安卓用户可以去应用商店搜索alook,或者在公众号后台发送“alook”字获取app。苹果用户在appstore下载即可!据说某宝有几毛钱的alook兑换码!!!第二步:下载并打开登录京东网址(或者你要取cookie的网站,这里以京东为例)地址栏输入
  m.jd.com

  然后点击不允许跳转(允许就会打开京东)

  然后登录你京东,注意这里不要使用qq登录,可以是手机号+验证码登录,也可以是密码登录!!!
  登录上后,就可以用开发者工具抓取cookie了!!!如图:
  
  
  
  

  到这里cookie就已经抓好了,不需要去找ptkey,ptpin,直接点拷贝复制全部即可!!!苹果alook步骤类似,如果你有多个账号,需要开启无痕模式,或者每次点一下清除数据!!!好了,今天的教程就到这里了!每天一个小技巧!!!
  喜欢什么类型的教程,留言告诉我!!! 查看全部

  【手机软件】利用Alook浏览器抓取Cookies
  简介软件名称:Alook(苹果也有但是AppStore收费6元)测试系统:安卓9测试手机:华为p30多号用户请不要直接退出,请看教程!!!第一步:安卓用户可以去应用商店搜索alook,或者在公众号后台发送“alook”字获取app。苹果用户在appstore下载即可!据说某宝有几毛钱的alook兑换码!!!第二步:下载并打开登录京东网址(或者你要取cookie的网站,这里以京东为例)地址栏输入
  m.jd.com

  然后点击不允许跳转(允许就会打开京东)

  然后登录你京东,注意这里不要使用qq登录,可以是手机号+验证码登录,也可以是密码登录!!!
  登录上后,就可以用开发者工具抓取cookie了!!!如图:
  
  
  
  

  到这里cookie就已经抓好了,不需要去找ptkey,ptpin,直接点拷贝复制全部即可!!!苹果alook步骤类似,如果你有多个账号,需要开启无痕模式,或者每次点一下清除数据!!!好了,今天的教程就到这里了!每天一个小技巧!!!
  喜欢什么类型的教程,留言告诉我!!!

前端实现在浏览器网页中录音

网站优化优采云 发表了文章 • 0 个评论 • 189 次浏览 • 2022-06-12 17:09 • 来自相关话题

  前端实现在浏览器网页中录音
  
  一、整体实现的思想页面中实现录音需要使用浏览器提供的MediaRecorder API,所以要实现页面录音就需要浏览器支持MediaStream Recording相关的功能,即浏览器能够获取浏览器的录音权限。页面内容,需要一个记录录音开始和结束的按钮,以及一个用于播放录音的标签然后设计具体的实现细节:首先我们进入页面需要判断浏览器是否支持该API,如果支持的话,然后再获取浏览器的录音权限,获取权限之后,我们的页面上分别由录音按钮和播放音频的标签audio,然后我们就需要设计逻辑,在点击录音按钮的时候就开始记录音频(实现这一步的前提是我们需要创建录音实例),然后实现启动录音和结束录音,录音结束之后,我们就把获取的录音实例放在audio中,当我们点击播放的时候就可以实现将录音播放出来。二、具体细节和函数浏览器获取录音的权限
  /*获取浏览器的录音权限,contraint是需要获取权限的列表*/const constraints = { audio: true };//返回的是Promise对象,因为需要等到用户确定授予权限的时候,我们才会处理下面的步骤,navigator是浏览器对象,我们就是通过navigator获取录音权限,成功回调的话就会获取到一个stream,然后将这个stream放入到我们下面创建的录音实例里面去navigator.mediaDevices.getUserMedia(constraints)
  创建录音实例
  //通过该方法创建录音实例var mediaRecorder = new MediaRecorder(stream);
  启动录音
  //通过点击按钮来启动或者结束录音//获取按钮节点const recordBtn = document.querySelector(".record-btn");//创建录音实例const mediaRecorder = new MediaRecorder(stream);<br />recordBtn.onclick = () => { mediaRecorder.start(); console.log("录音中...");};//
  MediaRecorder 实例上有个 state 状态,可用来判断录音器当前的活动状态,总共有三种值:
  inactive:处于休息状态,要么是没开始,要么是开始后已经停止。
  recording:录音中
  paused:已经开始,但被暂停了,不是停止也没有被恢复。
  //更加完整的录音逻辑recordBtn.onclick = () => { if (mediaRecorder.state === "recording") { mediaRecorder.stop(); recordBtn.textContent = "record"; console.log("录音结束"); } else { mediaRecorder.start(); console.log("录音中..."); recordBtn.textContent = "stop"; } console.log("录音器状态:", mediaRecorder.state);};
  音频数据的获取
  上面按钮处理来自用户的交互,只负责启动或停止录音。音频的数据还是从 MediaRecorder 实例上通过监听其相应的事件来完成的。
  当录音开始时,会触发其 MediaRecorder.ondataavailable 事件,从该事件回调的入参为 BlobEvent,从它身上取到 event.data 便是我们需要的音频数据。因为数据是一段一段产生的,所以需要暂存到一个数组中。
  const chunks = [];mediaRecorder.ondataavailable = function(e) { chunks.push(e.data);};
  录音的结束和音频的播放,通过监听 MediaRecorder.onstop 事件,将收集好的音频数据创建成Blob 对象,然后 通过 URL.createObjectURL 创建成 html 中 标签可使用的资源链接。
  mediaRecorder.onstop = e => { var blob = new Blob(chunks, { type: "audio/ogg; codecs=opus" }); chunks = []; var audioURL = window.URL.createObjectURL(blob); audio.src = audioURL;};
  三、详细完整代码
  实现在网页上录音recordrecordif (navigator.mediaDevices.getUserMedia) {const constraints = { audio: true };navigator.mediaDevices.getUserMedia(constraints).then(stream => {console.log("授权成功!");const recordBtn = document.querySelector(".record-btn");const mediaRecorder = new MediaRecorder(stream);var chunks = [];recordBtn.onclick = () => {if (mediaRecorder.state === "recording") {mediaRecorder.stop();console.log(chunks)mediaRecorder.onstop = e => {var blob= new Blob(chunks, { type: "audio/ogg; codecs=opus" });chunks = [];var audioURL = window.URL.createObjectURL(blob);const audioSrc = document.querySelector(".audio-player");audioSrc.src = audioURL;};recordBtn.textContent = "record";console.log("录音结束");} else {mediaRecorder.start();mediaRecorder.ondataavailable = function(e) {chunks.push(e.data);};console.log(chunks)console.log("录音中...");recordBtn.textContent = "stop";}console.log("录音器状态:", mediaRecorder.state);};<br />},() => {console.error("授权失败!");});} else {console.error("浏览器不支持 getUserMedia");}if (navigator.mediaDevices.getUserMedia) {const constraints1 = { audio: true };navigator.mediaDevices.getUserMedia(constraints1).then(stream1 => {console.log("授权成功!");const recordBtn1 = document.querySelector(".record-btn1");const mediaRecorder1 = new MediaRecorder(stream1);var chunks1 = [];recordBtn1.onclick = () => {if (mediaRecorder1.state === "recording") {mediaRecorder1.stop();//console.log(chunks)mediaRecorder1.onstop = e => {var blob1 = new Blob(chunks1, { type: "audio/ogg; codecs=opus" });chunks1 = [];var audioURL1 = window.URL.createObjectURL(blob1);const audioSrc1 = document.querySelector(".audio-player1");audioSrc1.src = audioURL1;};recordBtn1.textContent = "record";console.log("录音结束");} else {mediaRecorder1.start();mediaRecorder1.ondataavailable = function(e) {chunks1.push(e.data);};//console.log(chunks)console.log("录音中...");recordBtn1.textContent = "stop";}console.log("录音器状态:", mediaRecorder1.state);};<br />},() => {console.error("授权失败!");});} else {console.error("浏览器不支持 getUserMedia");}
  (这个代码可以直接复制粘贴使用,查看效果,然后再一步步的学习细节)
  MediaRecorder 实例上有个 state 状态,可用来判断录音器当前的活动状态,总共有三种值:
  inactive:处于休息状态,要么是没开始,要么是开始后已经停止。
  recording:录音中
  paused:已经开始,但被暂停了,不是停止也没有被恢复。
  本文完~
   查看全部

  前端实现在浏览器网页中录音
  
  一、整体实现的思想页面中实现录音需要使用浏览器提供的MediaRecorder API,所以要实现页面录音就需要浏览器支持MediaStream Recording相关的功能,即浏览器能够获取浏览器的录音权限。页面内容,需要一个记录录音开始和结束的按钮,以及一个用于播放录音的标签然后设计具体的实现细节:首先我们进入页面需要判断浏览器是否支持该API,如果支持的话,然后再获取浏览器的录音权限,获取权限之后,我们的页面上分别由录音按钮和播放音频的标签audio,然后我们就需要设计逻辑,在点击录音按钮的时候就开始记录音频(实现这一步的前提是我们需要创建录音实例),然后实现启动录音和结束录音,录音结束之后,我们就把获取的录音实例放在audio中,当我们点击播放的时候就可以实现将录音播放出来。二、具体细节和函数浏览器获取录音的权限
  /*获取浏览器的录音权限,contraint是需要获取权限的列表*/const constraints = { audio: true };//返回的是Promise对象,因为需要等到用户确定授予权限的时候,我们才会处理下面的步骤,navigator是浏览器对象,我们就是通过navigator获取录音权限,成功回调的话就会获取到一个stream,然后将这个stream放入到我们下面创建的录音实例里面去navigator.mediaDevices.getUserMedia(constraints)
  创建录音实例
  //通过该方法创建录音实例var mediaRecorder = new MediaRecorder(stream);
  启动录音
  //通过点击按钮来启动或者结束录音//获取按钮节点const recordBtn = document.querySelector(".record-btn");//创建录音实例const mediaRecorder = new MediaRecorder(stream);<br />recordBtn.onclick = () => { mediaRecorder.start(); console.log("录音中...");};//
  MediaRecorder 实例上有个 state 状态,可用来判断录音器当前的活动状态,总共有三种值:
  inactive:处于休息状态,要么是没开始,要么是开始后已经停止。
  recording:录音中
  paused:已经开始,但被暂停了,不是停止也没有被恢复。
  //更加完整的录音逻辑recordBtn.onclick = () => { if (mediaRecorder.state === "recording") { mediaRecorder.stop(); recordBtn.textContent = "record"; console.log("录音结束"); } else { mediaRecorder.start(); console.log("录音中..."); recordBtn.textContent = "stop"; } console.log("录音器状态:", mediaRecorder.state);};
  音频数据的获取
  上面按钮处理来自用户的交互,只负责启动或停止录音。音频的数据还是从 MediaRecorder 实例上通过监听其相应的事件来完成的。
  当录音开始时,会触发其 MediaRecorder.ondataavailable 事件,从该事件回调的入参为 BlobEvent,从它身上取到 event.data 便是我们需要的音频数据。因为数据是一段一段产生的,所以需要暂存到一个数组中。
  const chunks = [];mediaRecorder.ondataavailable = function(e) { chunks.push(e.data);};
  录音的结束和音频的播放,通过监听 MediaRecorder.onstop 事件,将收集好的音频数据创建成Blob 对象,然后 通过 URL.createObjectURL 创建成 html 中 标签可使用的资源链接。
  mediaRecorder.onstop = e => { var blob = new Blob(chunks, { type: "audio/ogg; codecs=opus" }); chunks = []; var audioURL = window.URL.createObjectURL(blob); audio.src = audioURL;};
  三、详细完整代码
  实现在网页上录音recordrecordif (navigator.mediaDevices.getUserMedia) {const constraints = { audio: true };navigator.mediaDevices.getUserMedia(constraints).then(stream => {console.log("授权成功!");const recordBtn = document.querySelector(".record-btn");const mediaRecorder = new MediaRecorder(stream);var chunks = [];recordBtn.onclick = () => {if (mediaRecorder.state === "recording") {mediaRecorder.stop();console.log(chunks)mediaRecorder.onstop = e => {var blob= new Blob(chunks, { type: "audio/ogg; codecs=opus" });chunks = [];var audioURL = window.URL.createObjectURL(blob);const audioSrc = document.querySelector(".audio-player");audioSrc.src = audioURL;};recordBtn.textContent = "record";console.log("录音结束");} else {mediaRecorder.start();mediaRecorder.ondataavailable = function(e) {chunks.push(e.data);};console.log(chunks)console.log("录音中...");recordBtn.textContent = "stop";}console.log("录音器状态:", mediaRecorder.state);};<br />},() => {console.error("授权失败!");});} else {console.error("浏览器不支持 getUserMedia");}if (navigator.mediaDevices.getUserMedia) {const constraints1 = { audio: true };navigator.mediaDevices.getUserMedia(constraints1).then(stream1 => {console.log("授权成功!");const recordBtn1 = document.querySelector(".record-btn1");const mediaRecorder1 = new MediaRecorder(stream1);var chunks1 = [];recordBtn1.onclick = () => {if (mediaRecorder1.state === "recording") {mediaRecorder1.stop();//console.log(chunks)mediaRecorder1.onstop = e => {var blob1 = new Blob(chunks1, { type: "audio/ogg; codecs=opus" });chunks1 = [];var audioURL1 = window.URL.createObjectURL(blob1);const audioSrc1 = document.querySelector(".audio-player1");audioSrc1.src = audioURL1;};recordBtn1.textContent = "record";console.log("录音结束");} else {mediaRecorder1.start();mediaRecorder1.ondataavailable = function(e) {chunks1.push(e.data);};//console.log(chunks)console.log("录音中...");recordBtn1.textContent = "stop";}console.log("录音器状态:", mediaRecorder1.state);};<br />},() => {console.error("授权失败!");});} else {console.error("浏览器不支持 getUserMedia");}
  (这个代码可以直接复制粘贴使用,查看效果,然后再一步步的学习细节)
  MediaRecorder 实例上有个 state 状态,可用来判断录音器当前的活动状态,总共有三种值:
  inactive:处于休息状态,要么是没开始,要么是开始后已经停止。
  recording:录音中
  paused:已经开始,但被暂停了,不是停止也没有被恢复。
  本文完~
  

使用极简浏览器 Min 浏览网页 | Linux 中国

网站优化优采云 发表了文章 • 0 个评论 • 156 次浏览 • 2022-06-12 16:02 • 来自相关话题

  使用极简浏览器 Min 浏览网页 | Linux 中国
  
  并非所有 web 浏览器都要做到无所不能,Min 就是一个极简主义风格的浏览器。-- Scott Nesbitt
  有用的原文链接请访问文末的“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。致谢编译自|
  作者|Scott Nesbitt
  译者|Hank Chow (HankChow) 共计翻译:23.0篇 贡献时间:341 天
  并非所有 web 浏览器都要做到无所不能,Min 就是一个极简主义风格的浏览器。
  现在还有开发新的 Web 浏览器的需要吗?即使现在浏览器领域已经成为了寡头市场,但仍然不断涌现出各种前所未有的浏览器产品。
  Min[1]就是其中一个。顾名思义,Min 是一个小的浏览器,也是一个极简主义的浏览器。但它麻雀虽小五脏俱全,而且还是一个开源的浏览器,它的 Apache 2.0 许可证引起了我的注意。
  让我们来看看 Min 有什么值得关注的方面。
  开始
  Min 基于Electron[2]框架开发,值得一提的是,Atom 文本编辑器[3]也是基于这个框架开发的。它提供 Linux、MacOS 和 Windows 的安装程序[4],当然也可以从 GitHub 获取它的源代码[5]自行编译安装。
  我使用的 Linux 发行版是 Manjaro,但没有完全匹配这个发行版的安装程序。还好,我通过 Manjaro 的包管理器也能安装 Min。
  安装完成后,在终端就可以直接启动 Min。
  
  Min 号称是更智能、更快速的浏览器。经过尝试以后,我觉得它比我在其它电脑上使用过的 Firefox 和 Chrome 浏览器启动得更快。
  而使用 Min 浏览网页的过程则和 Firefox 或 Chrome 一样,只要再地址栏输入 URL,回车,就好了。
  Min 的功能
  尽管 Min 不可能带有 Firefox 或 Chrome 等浏览器得所有功能,但它也有可取之处。
  Min 和其它浏览器一样,支持页面选项卡。它还有一个称为 Tasks 的功能,可以对打开的选项卡进行分组。
  DuckDuckGo[6]是我最喜欢的搜索引擎,而 Min 的默认搜索引擎恰好就是它,这正合我意。当然,如果你喜欢另一个搜索引擎,也可以在 Min 的偏好设置中配置你喜欢的搜索引擎作为默认搜索引擎。
  Min 没有使用类似 AdBlock 这样的插件来过滤你不想看到的内容,而是使用了一个名为EasyList[7]的内置的广告拦截器,你可以使用它来屏蔽脚本和图片。另外 Min 还带有一个内置的防跟踪软件。
  类似 Firefox,Min 有一个名为叫做 Reading List 的阅读模式。只需点击地址栏中的对应图标,就可以去除页面中的大部分无关内容,让你专注于正在阅读的内容。网页在阅读列表中可以保留 30 天。
  
  Min 还有一个专注模式,可以隐藏其它选项卡并阻止你打开新的选项卡。在专注模式下,如果一个 web 页面中进行工作,需要多点击好几次才能打开一个新页面。
  Min 也有很多快捷键让你快速使用某个功能。你可以在 GitHub 上[8]找到这些这些快捷键的参考文档,也可以在 Min 的偏好设置中进行更改。
  我发现 Min 可以在 YouTube、Vimeo、Dailymotion 等视频网站上播放视频,还可以在音乐网站 7Digital 上播放音乐。但由于我没有账号,所以没法测试是否能在 Spotify 或 Last.fm 等这些网站上播放音乐。
  
  Min 的弱点
  Min 确实也有自己的缺点,例如它无法将网站添加为书签。替代方案要么是查看 Min 的搜索历史来找回你需要的链接,要么是使用一个第三方的书签服务。
  最大的缺点是 Min 不支持插件。这对我来说不是一件坏事,因为浏览器启动速度和运行速度快的主要原因就在于此。当然也有一些人非常喜欢使用浏览器插件,Min 就不是他们的选择。
  总结
  Min 算是一个中规中矩的浏览器,它可以凭借轻量、快速的优点吸引很多极简主义的用户。但是对于追求多功能的用户来说,Min 就显得相当捉襟见肘了。
  所以,如果你想摆脱当今多功能浏览器的束缚,我觉得可以试用一下 Min。
  via:
  作者:Scott Nesbitt[10]选题:lujun9972译者:HankChow校对:wxy
  本文由LCTT原创编译,Linux中国荣誉推出 查看全部

  使用极简浏览器 Min 浏览网页 | Linux 中国
  
  并非所有 web 浏览器都要做到无所不能,Min 就是一个极简主义风格的浏览器。-- Scott Nesbitt
  有用的原文链接请访问文末的“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。致谢编译自|
  作者|Scott Nesbitt
  译者|Hank Chow (HankChow) 共计翻译:23.0篇 贡献时间:341 天
  并非所有 web 浏览器都要做到无所不能,Min 就是一个极简主义风格的浏览器。
  现在还有开发新的 Web 浏览器的需要吗?即使现在浏览器领域已经成为了寡头市场,但仍然不断涌现出各种前所未有的浏览器产品。
  Min[1]就是其中一个。顾名思义,Min 是一个小的浏览器,也是一个极简主义的浏览器。但它麻雀虽小五脏俱全,而且还是一个开源的浏览器,它的 Apache 2.0 许可证引起了我的注意。
  让我们来看看 Min 有什么值得关注的方面。
  开始
  Min 基于Electron[2]框架开发,值得一提的是,Atom 文本编辑器[3]也是基于这个框架开发的。它提供 Linux、MacOS 和 Windows 的安装程序[4],当然也可以从 GitHub 获取它的源代码[5]自行编译安装。
  我使用的 Linux 发行版是 Manjaro,但没有完全匹配这个发行版的安装程序。还好,我通过 Manjaro 的包管理器也能安装 Min。
  安装完成后,在终端就可以直接启动 Min。
  
  Min 号称是更智能、更快速的浏览器。经过尝试以后,我觉得它比我在其它电脑上使用过的 Firefox 和 Chrome 浏览器启动得更快。
  而使用 Min 浏览网页的过程则和 Firefox 或 Chrome 一样,只要再地址栏输入 URL,回车,就好了。
  Min 的功能
  尽管 Min 不可能带有 Firefox 或 Chrome 等浏览器得所有功能,但它也有可取之处。
  Min 和其它浏览器一样,支持页面选项卡。它还有一个称为 Tasks 的功能,可以对打开的选项卡进行分组。
  DuckDuckGo[6]是我最喜欢的搜索引擎,而 Min 的默认搜索引擎恰好就是它,这正合我意。当然,如果你喜欢另一个搜索引擎,也可以在 Min 的偏好设置中配置你喜欢的搜索引擎作为默认搜索引擎。
  Min 没有使用类似 AdBlock 这样的插件来过滤你不想看到的内容,而是使用了一个名为EasyList[7]的内置的广告拦截器,你可以使用它来屏蔽脚本和图片。另外 Min 还带有一个内置的防跟踪软件。
  类似 Firefox,Min 有一个名为叫做 Reading List 的阅读模式。只需点击地址栏中的对应图标,就可以去除页面中的大部分无关内容,让你专注于正在阅读的内容。网页在阅读列表中可以保留 30 天。
  
  Min 还有一个专注模式,可以隐藏其它选项卡并阻止你打开新的选项卡。在专注模式下,如果一个 web 页面中进行工作,需要多点击好几次才能打开一个新页面。
  Min 也有很多快捷键让你快速使用某个功能。你可以在 GitHub 上[8]找到这些这些快捷键的参考文档,也可以在 Min 的偏好设置中进行更改。
  我发现 Min 可以在 YouTube、Vimeo、Dailymotion 等视频网站上播放视频,还可以在音乐网站 7Digital 上播放音乐。但由于我没有账号,所以没法测试是否能在 Spotify 或 Last.fm 等这些网站上播放音乐。
  
  Min 的弱点
  Min 确实也有自己的缺点,例如它无法将网站添加为书签。替代方案要么是查看 Min 的搜索历史来找回你需要的链接,要么是使用一个第三方的书签服务。
  最大的缺点是 Min 不支持插件。这对我来说不是一件坏事,因为浏览器启动速度和运行速度快的主要原因就在于此。当然也有一些人非常喜欢使用浏览器插件,Min 就不是他们的选择。
  总结
  Min 算是一个中规中矩的浏览器,它可以凭借轻量、快速的优点吸引很多极简主义的用户。但是对于追求多功能的用户来说,Min 就显得相当捉襟见肘了。
  所以,如果你想摆脱当今多功能浏览器的束缚,我觉得可以试用一下 Min。
  via:
  作者:Scott Nesbitt[10]选题:lujun9972译者:HankChow校对:wxy
  本文由LCTT原创编译,Linux中国荣誉推出

6张图让你搞懂浏览器渲染网页过程

网站优化优采云 发表了文章 • 0 个评论 • 114 次浏览 • 2022-06-12 16:01 • 来自相关话题

  6张图让你搞懂浏览器渲染网页过程
  我的想法:如果我要构建快速可靠的网站,需要真正了解浏览器渲染网页的每个步骤机制,这样就可以在开发过程中对每个步骤进行优化。这篇文章是我在较高水平上对端到端过程的学习总结。
  好了,废话不多说,我们开始吧。这个过程可以分为以下几个主要阶段:
  开始解析HTML获取外部资源解析 CSS 并构建CSSOM执行 JavaScript合并 DOM 和 CSSOM 以构造渲染树计算布局和绘制1.开始解析HTML
  当浏览器通过网络接收页面的HTML数据时,它会立即设置解析器将HTML转换为文档对象模型(DOM)。
  文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。
  解析过程的第一步是将HTML分解并表示为开始标记、结束标记及其内容标记,然后它可以构造DOM。
  
  2. 获取外部资源
  当解析器遇到外部资源(如CSS或JavaScript文件)时,解析器将提取这些文件。解析器在加载CSS文件时继续运行,此时会阻止页面渲染,直到资源加载解析完(稍后会详细介绍)。
  JavaScript 文件略有不同-默认情况下,解析器会在加载 JS 文件然后进行解析同时会阻止对HTML的解析。可以将两个属性添加到脚本标签中以减轻这种情况:defer 和async。两者都允许解析器在后台加载JavaScript 文件的同时继续运行,但是它们的执行方式不同。
  关于这一点后面还会再讲一点,但总的来说:
  defer表示文件的执行将被延迟,直到文档的解析完成为止。如果多个文件具有defer属性,则将按照页面放置的顺序依次执行。
  <br />
  async 意味着文件将在加载后立即执行,这可能是在解析过程中或在解析过程之后执行的,因此不能保证异步脚本的执行顺序。
  <br />
  预加载资源
  元素的 rel 属性的属性值preload能够让你在你的HTML页面中 元素内部书写一些声明式的资源获取请求,可以指明哪些资源是在页面加载完成后即刻需要的。
  对于这种即刻需要的资源,你可能希望在页面加载的生命周期的早期阶段就开始获取,在浏览器的主渲染机制介入前就进行预加载。
  这一机制使得资源可以更早的得到加载并可用,且更不易阻塞页面的初步渲染,进而提升性能。
  <br />
  
  3.解析CSS并构建CSSOM
  你可能很早就知道DOM,但对**CSSOM(CSS对象模型)**可能听得少,反正我也没听过几次。
  CSS 对象模型 (CSSOM) 是树形形式的所有CSS选择器和每个选择器的相关属性的映射,具有树的根节点,同级,后代,子级和其他关系。CSSOM 与 文档对象模型(DOM) 非常相似。两者都是关键渲染路径的一部分,也是正确渲染一个网站必须采
  取的一系列步骤。
  CSSOM 与 DOM一起构建渲染树,浏览器依次使用渲染树来布局和绘制网页。
  与HTML文件和DOM相似,加载CSS文件时,必须将它们解析并转换为树-这次是CSSOM。它描述了页面上的所有CSS选择器,它们的层次结构和属性。
  CSSOM 与 DOM的不同之处在于它不能以增量方式构建,因为CSS规则由于特定性而可以在各个不同的点相互覆盖。
  这就是CSS 阻塞渲染的原因,因为在解析所有CSS并构建CSSOM之前,浏览器无法知道每个元素在屏幕上的位置。
  
  4.执行JavaScript
  不同的浏览器有不同的 JS 引擎来执行此任务。从计算机资源的角度来看,解析 JS 可能是一个昂贵的过程,比其他类型的资源更昂贵,因此优化它对于获得良好的性能是如此重要。
  载入事件
  加载的JS和DOM被完全解析并准备就绪后就会emitdocument.DOMContentLoaded事件。对于需要访问DOM的任何脚本,例如以某种方式进行操作或侦听用户交互事件,优良作法是在执行脚本之前先等待此事件。
  document.addEventListener('DOMContentLoaded', (event) => {<br />    // 这里面可以安全地访问DOM了<br />});<br />
  在所有其他内容(例如异步JavaScript,图像等)完成加载后,将触发window.load事件。
  window.addEventListener('load', (event) => {<br />    // 页面现已完全加载<br />});<br />
  
  5.合并DOM和CSSOM 构建渲染树
  渲染树是DOM和CSSOM的组合,表示将要渲染到页面上的所有内容。这并不一定意味着渲染树中的所有节点都将在视觉上呈现,例如,将包含opacity: 0或visibility: hidden的样式的节点,并仍然可以被屏幕阅读器等读取,而display: none不包括任何内容。
  此外,诸如之类的不包含任何视觉信息的标签将始终被忽略。
  与 JS 引擎一样,不同的浏览器具有不同的渲染引擎。
  
  6. 计算布局和绘制
  现在我们有了完整的渲染树,浏览器知道了要渲染什么,但是不知道在哪里渲染。因此,必须计算页面的布局(即每个节点的位置和大小)。渲染引擎从顶部开始一直向下遍历渲染树,计算应显示每个节点的坐标。
  完成之后,最后一步是获取布局信息并将像素绘制到屏幕上。
   查看全部

  6张图让你搞懂浏览器渲染网页过程
  我的想法:如果我要构建快速可靠的网站,需要真正了解浏览器渲染网页的每个步骤机制,这样就可以在开发过程中对每个步骤进行优化。这篇文章是我在较高水平上对端到端过程的学习总结。
  好了,废话不多说,我们开始吧。这个过程可以分为以下几个主要阶段:
  开始解析HTML获取外部资源解析 CSS 并构建CSSOM执行 JavaScript合并 DOM 和 CSSOM 以构造渲染树计算布局和绘制1.开始解析HTML
  当浏览器通过网络接收页面的HTML数据时,它会立即设置解析器将HTML转换为文档对象模型(DOM)。
  文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。
  解析过程的第一步是将HTML分解并表示为开始标记、结束标记及其内容标记,然后它可以构造DOM。
  
  2. 获取外部资源
  当解析器遇到外部资源(如CSS或JavaScript文件)时,解析器将提取这些文件。解析器在加载CSS文件时继续运行,此时会阻止页面渲染,直到资源加载解析完(稍后会详细介绍)。
  JavaScript 文件略有不同-默认情况下,解析器会在加载 JS 文件然后进行解析同时会阻止对HTML的解析。可以将两个属性添加到脚本标签中以减轻这种情况:defer 和async。两者都允许解析器在后台加载JavaScript 文件的同时继续运行,但是它们的执行方式不同。
  关于这一点后面还会再讲一点,但总的来说:
  defer表示文件的执行将被延迟,直到文档的解析完成为止。如果多个文件具有defer属性,则将按照页面放置的顺序依次执行。
  <br />
  async 意味着文件将在加载后立即执行,这可能是在解析过程中或在解析过程之后执行的,因此不能保证异步脚本的执行顺序。
  <br />
  预加载资源
  元素的 rel 属性的属性值preload能够让你在你的HTML页面中 元素内部书写一些声明式的资源获取请求,可以指明哪些资源是在页面加载完成后即刻需要的。
  对于这种即刻需要的资源,你可能希望在页面加载的生命周期的早期阶段就开始获取,在浏览器的主渲染机制介入前就进行预加载。
  这一机制使得资源可以更早的得到加载并可用,且更不易阻塞页面的初步渲染,进而提升性能。
  <br />
  
  3.解析CSS并构建CSSOM
  你可能很早就知道DOM,但对**CSSOM(CSS对象模型)**可能听得少,反正我也没听过几次。
  CSS 对象模型 (CSSOM) 是树形形式的所有CSS选择器和每个选择器的相关属性的映射,具有树的根节点,同级,后代,子级和其他关系。CSSOM 与 文档对象模型(DOM) 非常相似。两者都是关键渲染路径的一部分,也是正确渲染一个网站必须采
  取的一系列步骤。
  CSSOM 与 DOM一起构建渲染树,浏览器依次使用渲染树来布局和绘制网页。
  与HTML文件和DOM相似,加载CSS文件时,必须将它们解析并转换为树-这次是CSSOM。它描述了页面上的所有CSS选择器,它们的层次结构和属性。
  CSSOM 与 DOM的不同之处在于它不能以增量方式构建,因为CSS规则由于特定性而可以在各个不同的点相互覆盖。
  这就是CSS 阻塞渲染的原因,因为在解析所有CSS并构建CSSOM之前,浏览器无法知道每个元素在屏幕上的位置。
  
  4.执行JavaScript
  不同的浏览器有不同的 JS 引擎来执行此任务。从计算机资源的角度来看,解析 JS 可能是一个昂贵的过程,比其他类型的资源更昂贵,因此优化它对于获得良好的性能是如此重要。
  载入事件
  加载的JS和DOM被完全解析并准备就绪后就会emitdocument.DOMContentLoaded事件。对于需要访问DOM的任何脚本,例如以某种方式进行操作或侦听用户交互事件,优良作法是在执行脚本之前先等待此事件。
  document.addEventListener('DOMContentLoaded', (event) => {<br />    // 这里面可以安全地访问DOM了<br />});<br />
  在所有其他内容(例如异步JavaScript,图像等)完成加载后,将触发window.load事件。
  window.addEventListener('load', (event) => {<br />    // 页面现已完全加载<br />});<br />
  
  5.合并DOM和CSSOM 构建渲染树
  渲染树是DOM和CSSOM的组合,表示将要渲染到页面上的所有内容。这并不一定意味着渲染树中的所有节点都将在视觉上呈现,例如,将包含opacity: 0或visibility: hidden的样式的节点,并仍然可以被屏幕阅读器等读取,而display: none不包括任何内容。
  此外,诸如之类的不包含任何视觉信息的标签将始终被忽略。
  与 JS 引擎一样,不同的浏览器具有不同的渲染引擎。
  
  6. 计算布局和绘制
  现在我们有了完整的渲染树,浏览器知道了要渲染什么,但是不知道在哪里渲染。因此,必须计算页面的布局(即每个节点的位置和大小)。渲染引擎从顶部开始一直向下遍历渲染树,计算应显示每个节点的坐标。
  完成之后,最后一步是获取布局信息并将像素绘制到屏幕上。
  

汇总:selenium控制浏览器获取数据(java 版本)

网站优化优采云 发表了文章 • 0 个评论 • 119 次浏览 • 2022-09-24 19:05 • 来自相关话题

  汇总:selenium控制浏览器获取数据(java 版本)
  
  前段时间,突然更新了一个数据源网站,原来通过websocket爬取的数据突然变成了gg。没有办法,只能用最原创的方法来爬取想要的数据。我爬过很多网站数据,这里就不讨论爬虫的合理性和合法性了。纯分享一点我知道的技术网站大致分为三种(对于爬虫)⒈网站直接通过接口获取数据(json和pages)。简单的事情就是通过传递一些参数来获取不同的数据,这是最简单的。通过requests模块,你可以很方便的得到你想要的数据。 JSON数据说起来容易,直接解析JSON就好了。另一个是接口返回网页的源代码,稍微麻烦一点,也不难。 scrapy框架好用,xpath也是神器。简单的学习,爬一个网站不成问题。 ⒉第二
  
  秘密武器:爬虫神器之selenium的使用
  目录
  Selenium 介绍及安装
  Selenium 是一个用于 Web 的自动化测试工具,最初是为 网站 自动化测试而开发的。类型就像我们用来玩游戏的按键精灵,可以根据指定的指令自动操作。不同之处在于 Selenium 可以直接在浏览器上运行。对,它支持所有主流浏览器(包括 PhantomJS 这些无接口浏览器)。
  根据我们的说明,Selenium 可以让浏览器自动加载页面,获取所需的数据,甚至对页面进行截图,或者判断 网站 上的某些动作是否发生。
  Selenium 没有自己的浏览器,不支持浏览器的功能。它需要与第三方浏览器结合使用。但是我们有时需要让它在代码中内联运行,所以我们可以用一个叫做 PhantomJS 的工具来代替真正的浏览器。
  PyPI网站下载Selenium库嗯,也可以使用第三方管理器Selenium官方参考文档:o/index.html
  安装
  pip install selenium
  安装 Firefox geckodriver
  安装最新版本的 Firefox 并将 Firefox 可执行文件添加到系统环境变量中。记得关闭火狐的自动更新
  firefox下载地下:es把下载的geckodriver.exe放到路径D:\Python\python_version\
  安装 ChromeDriver
  注意版本号要对应
  测试代码
  # 导入 webdriver
from selenium import webdriver
# 要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys importKeys
# 调用环境变量指定的PhantomJS浏览器创建浏览器对象
driver = webdriver.Chrome()
# 如果没有在环境变量指定PhantomJS位置
# driver = webdriver.Chrome(executable_path="./phantomjs"))
# get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2)
driver.get("http://www.baidu.com/")
# 打印网页渲染后的源代码
print(driver.page_source)
# 生成新的页面快照
driver.save_screenshot("python爬虫.png")
# 获取当前url
print(driver.current_url)
# 关闭浏览器
driver.quit()
  selenium 控制浏览器
  最大化窗口
  我们知道调用启动的浏览器不是全屏的,所以不会影响脚本的执行,但是有时候会影响我们的“watch”脚本的执行。
  browser = webdriver.Chrome()
url= &#39;http://www.baidu.com&#39;
browser.get(url)
borwser.maximize_window()
  设置宽度和高度
  最大化还是不够灵活,可以自由设置浏览显示的宽高吗?当然这是可能的。
  browser = webdriver.Chrome()
url= &#39;http://www.baidu.com&#39;
browser.get(url)
borwser.set_window_size(500,600)
  浏览器前进后退
  浏览器上有后退和前进按钮,对于浏览网页的人来说更方便;对于做web自动化测试的同学来说应该算是一道难题。事实上,这很简单。下面我们来看看python的实现。
  browser = webdriver.Chrome()#访问百度首页
first_url= &#39;http://www.baidu.com&#39;
browser.get(first_url)
time.sleep(2)#访问新闻页面
second_url=&#39;http://news.baidu.com&#39;
browser.get(second_url)
time.sleep(2)#返回(后退)到百度首页print "back to %s "%(first_url)
browser.back()
time.sleep(1) #前进到新闻页print "forward to %s"%(second_url)
browser.forward()
time.sleep(2)
browser.quit()
  硒元素定位
  对象定位应该是自动化的核心。要操作一个对象,首先要识别对象。一个对象就像一个人,他会有各种各样的特征(属性),比如我们可以通过一个人的身份证号、姓名,或者他住在哪条街、哪个楼层、哪个门牌号来找到这个人。
  物体定位
  webdriver提供对象定位方法
  使用 By 类确定选择哪种方法
  from selenium.webdriver.common.by import By
chrome.find_element(by=By.ID,value=&#39;su&#39;)
  By类的一些属性如下
  动作元素
  如前所述,很多知识是一个定位元素。定位只是第一步。定位后,需要对该元件进行操作。鼠标点击还是键盘输入取决于我们定位的是按钮还是输入框。
  一般来说,webdriver中比较常用的操作对象的方法有以下几种:
  from selenium import webdriver
from selenium.webdriver.chrome.service
import Service
from time import sleep
from selenium.webdriver.common.by import By
def test_element():
# 创建驱动对象
s =Service(executable_path=&#39;./chromedriver.exe&#39;)
# 创建一个浏览器
driver = webdriver.Chrome(service=s)
# 打个百度
driver.get(&#39;https://cn.bing.com/&#39;)
sleep(2)
# 获取 搜索框,并输出“学习”
driver.find_element(By.ID,&#39;sb_form_q&#39;).send_keys(&#39;学习&#39;)
sleep(1)
# 获取 搜索按钮,并点击

driver.find_element(By.ID,&#39;search_icon&#39;).click()
if __name__ ==&#39;__main__&#39;:
test_element()
  selenium 定位下拉菜单
  包括下拉菜单页面
  


Level Locate




Level locate



Link1

Action
Another action
Something else here

Separated link







Link2

Action
Another action
Something else here

Separated link






  选定的元素
  from selenium import webdriver
from selenium.webdriver.chrome.service
import Service
from selenium.webdriver.common.by import By
import os
from time import sleep
def test_down_menu():
# 创建一个驱动
s =Service(executable_path=&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
# 设置方位的文件地址
file_path = &#39;file:///&#39;+os.path.abspath(&#39;./html/test01.html&#39;)
# 访问页面
driver.get(file_path)
# 定位父级元素

driver.find_element(By.LINK_TEXT,&#39;Link1&#39;).click()
# 找到要移动的位置
menu = driver.find_element(By.LINK_TEXT,&#39;Action&#39;)
# 做一个移动光标的动作
# 定义一个动作在driver 移动到menu的位置 执行动作

webdriver.ActionChains(driver).move_to_element(menu).perform()
# sleep(2)
# 定位子级元素
menu.click()
# 睡眠2秒
sleep(2)
# 关闭浏览器
driver.quit()
if __name__ == &#39;__main__&#39;:
test_down_menu()
  硒级定位
  窗口定位
  对于一个现代的web应用来说,往往会有框架(frame)或者窗口(window)的应用,这给我们的定位带来了一个难题。有时候我们定位一个元素,定位器没有问题,但是一直无法定位。这时,我们需要检查元素是否在一个框架中。Seelnium webdriver提供了switch_to_frame方法,可以轻松解决这个问题。
  多层框架或窗口的定位:driver.switch_to.frame()
  框架.html
  

frame




frame


  内部.html
  

inner


inner


  switch_to_frame()
  from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
import os
from time import sleep
def select_frame():
# 创建驱动
s = Service(executable_path=&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/outer.html&#39;)
# 打开网页
driver.get(file_path)
# 切换frame
driver.switch_to.frame(&#39;f1&#39;)
driver.switch_to.frame(&#39;f2&#39;)
# 定位元素,输入要搜索的内容
driver.find_element(By.ID,&#39;sb_form_q&#39;).send_keys(&#39;百战&#39;)
# 定位按钮,点击搜索
driver.find_element(By.ID,&#39;search_icon&#39;).click()
sleep(3)
driver.quit()
if __name__ ==&#39;__main__&#39;:
select_frame()
  selenium 处理下拉框
  爬取数据时,有时数据过多,官网提供了过滤功能select标签。对于这样的数据,我们只需要定位元素并点击它。
  drop_down.html
  


UPS Next Day Air ==> $12.51
UPS Next Day Air Saver ==> $11.61
UPS 3 Day Select ==> $10.69
UPS 2nd Day Air ==> $9.03
UPS Ground ==> $8.34
USPS Priority Mail Insured ==> $9.25
USPS Priority Mail ==> $7.45
USPS First Class ==> $3.20


UPS Next Day Air ==> $12.51
UPS Next Day Air Saver ==> $11.61
UPS 3 Day Select ==> $10.69
UPS 2nd Day Air ==> $9.03
UPS Ground ==> $8.34
USPS Priority Mail Insured ==> $9.25
USPS Priority Mail ==> $7.45
USPS First Class ==> $3.20


  from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import os
def choose_option():
# 创建驱动
s = Service(&#39;./chromedriver.exe&#39;)
# 创建浏览器对象
driver = webdriver.Chrome(service=s)
# 访问页面
# 设置页面地址
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/test02.html&#39;)
driver.get(file_path)
# 定位下拉框里面选项
sleep(2)
driver.find_element(By.XPATH,&#39;//select[@id="ShippingMethod"]/option[@value="10.69"]&#39;).click()
sleep(2)
driver.find_element(By.XPATH,&#39;//select[@id="ShippingMethod2"]/option[@value="9.25"]&#39;).click()
# 关闭浏览器
sleep(5)
driver.quit()
if __name__ == &#39;__main__&#39;:
choose_option()
  selenium 处理弹出窗口
  有时,页面可能要弹出窗口。只需转到定位弹出窗口上的“确定”按钮
  html
  

This is a page

Hello,Python Spider

alert(&#39;这个是测试弹窗&#39;)
  from lib2to3.pgen2 import driver
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from time import sleep
import os
def test_windows():
# 创建驱动对象
s = Service(&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
# 访问页面
# 设置页面地址
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/test03.html&#39;)
driver.get(file_path)
sleep(3)
# 定位弹出窗口,并点击
driver.switch_to.alert.accept()
sleep(3)
driver.quit()
if __name__ ==&#39;__main__&#39;:
test_windows()
  selenium 拖放元素
  要完成元素的拖拽,首先需要指定被拖拽元素和拖拽目标元素,然后使用ActionChains类来实现,ActionChains用于自定义动作。通过 ActionChains 对象中的 perform() 执行动作,
  html
  


jQuery UI Draggable - Auto-scroll


#draggable, #draggable2, #draggable3 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; }
body {font-family: Arial, Helvetica, sans-serif;}
table {font-size: 1em;}
.ui-draggable, .ui-droppable {background-position: top;}




$( function() {
$( "#draggable" ).draggable({ scroll: true });
$( "#draggable2" ).draggable({ scroll: true, scrollSensitivity: 100 });
$( "#draggable3" ).draggable({ scroll: true, scrollSpeed: 100 });
} );

<p>Scroll set to true, default settings

  scrollSensitivity set to 100

  scrollSpeed set to 100
</p>
  Python
  from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import os
<p>
def test_drop():
# 创建驱动对象
s = Service(&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
# 访问页面
# 设置页面地址
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/test04.html&#39;)
driver.get(file_path)
# 定位要拖拽的元素
div1 = driver.find_element(By.ID,&#39;draggable&#39;)
div2 = driver.find_element(By.ID,&#39;draggable2&#39;)
div3 = driver.find_element(By.ID,&#39;draggable3&#39;)
# 开始拖拽
# 定义事件
sleep(2)
webdriver.ActionChains(driver).drag_and_drop(div1,div2).perform()
for i in range(10):
webdriver.ActionChains(driver).drag_and_drop_by_offset(div3,10,10).perform()
sleep(0.5)
# 关闭浏览器
sleep(3)
driver.quit()
if __name__ ==&#39;__main__&#39;:
test_drop()</p>
  selenium 调用 js 方法
  有时候我们需要控制页面滚动条上的滚动条,但是滚动条并不是页面上的一个元素。这时候我们需要使用js来操作
  滚动条的操作一般有两种场景:
  调用js方法
  execute_script(script, *args)
  滚动条回到顶部:
  js="document.getElementById(&#39;id&#39;).scrollTop=0"
driver.execute_script(js)
  滚动条到底部
  js="document.documentElement.scrollTop=10000"
driver.execute_script(js)
  可以修改scrollTop的值,使滚动条位于右侧,0为顶部,10000为底部
  以上方法在火狐和IE浏览器上都可以,但是用Chrome浏览器,我发现不行。Chrome浏览器解决方案:
  js = "document.body.scrollTop=0"
driver.execute_script(js)
  水平滚动条
  js = "window.scrollTo(100,400)"
driver.execute_script(js)
  硒等待元素
  被迫等待
  使用时间.sleep
  功能:当代码运行到强制等待的那一行时,无论什么原因,都强制等待指定时间,需要通过time模块实现
  优点:简单
  缺点:无法做出有效判断,会浪费时间
  隐式等待
  chrome.implicitly_wait(time_num)
  过了一定时间,发现元素还没有加载,继续等待我们指定的时间。如果超过指定时间还没有加载,就会抛出异常。如果它没有等待就已经加载,它将立即执行。
  优点:设置一次
  缺点:必须等待加载完成才能进行后续操作,或者等待超时才能进行后续操作
  显示等待
  从 selenium.webdriver.support.wait 导入 WebDriverWait
  指定等待条件并指定最长等待时间。在这段时间内判断是否满足等待条件。如果是真的,它会立即返回。如果不是真的,它将一直等待,直到等待您指定的最长等待时间。如果仍然不满足则抛出异常,如果满足则正常返回
  优点:专门用于等待指定元素,加载后可以运行后续代码
  缺点:需要设置多个元素分别等待
  url = &#39;https://www.guazi.com/nj/buy/&#39;
driver = webdriver.Chrome()
driver.get(url)
wait = WebDriverWait(driver,10,0.5)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, &#39;next&#39;)))
print(driver.page_source)
  selenium 参数用法
  包括无头模式、代理模式、绕过检测
  from selenium.webdriver.chrome.service import Service
from selenium.webdriver import Chrome,ChromeOptions,DesiredCapabilities
from time import sleep
def test_headless():
# 设置参数,将浏览器隐藏起来(无头浏览器)
options = ChromeOptions()
options.add_argument(&#39;--headless&#39;)
# 设置驱动
service = Service(&#39;./chromedriver&#39;)
# 启动Chrome浏览器
driver = Chrome(service=service,options=options)
# 访问页面
driver.get(&#39;https://www.baidu.com&#39;)
# 打印代码
print(driver.page_source)
# 关闭浏览器
driver.quit()
def test_proxy1():
# 设置参数,给浏览器设置代理
options = ChromeOptions()
# options.add_argument(&#39;--proxy-server=http://ip:port&#39;)
options.add_argument(&#39;--proxy-server=http://221.199.36.122:35414&#39;)
# 设置驱动
service = Service(&#39;./chromedriver&#39;)
# 启动Chrome浏览器
driver = Chrome(service=service,options=options)
# 访问页面 "134.195.101.16",
driver.get(&#39;http://httpbin.org/get&#39;)
# 打印代码
print(driver.page_source)
# 关闭浏览器
driver.quit()
def test_proxy2():
from selenium.webdriver.common.proxy import ProxyType,Proxy
# 设置参数,给浏览器设置代理
ip = &#39;http://113.76.133.238:35680&#39;
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = ip
proxy.ssl_proxy = ip
# 关联浏览器
capabilities = DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
# 设置驱动
service = Service(&#39;./chromedriver&#39;)
# 启动Chrome浏览器
driver = Chrome(service=service,desired_capabilities=capabilities)
# 访问页面 "134.195.101.16",
driver.get(&#39;http://httpbin.org/get&#39;)
# 打印代码
print(driver.page_source)
# 关闭浏览器
driver.quit()
def test_find():
options = ChromeOptions()
options.add_experimental_option(&#39;excludeSwitches&#39;, [&#39;enable-automation&#39;])
options.add_experimental_option(&#39;useAutomationExtension&#39;, False)
chrome = Chrome(chrome_options=options)
chrome.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, &#39;webdriver&#39;, {
get: () => false
})
"""
})
chrome.get(&#39;http://httpbin.org/get&#39;)
info = chrome.page_source
print(info)
sleep(20)
if __name__ ==&#39;__main__&#39;:
# test_headless()
# test_proxy1()
# test_proxy2()
test_find()
  硒实用案例
  from selenium.webdriver.chrome.service import Service
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from lxml import etree
def spider_huya():
# 创建一个驱动
service = Service(&#39;./chromedriver.exe&#39;)
# 创建一个浏览器
driver = Chrome(service=service)
# 设置隐式等待
driver.implicitly_wait(5)
# 访问网址
driver.get(&#39;https://www.huya.com/g/lol&#39;)
count = 1
while True:
# print(&#39;获取了第%d页&#39; % count)
# count += 1
# 提取数据
e = etree.HTML(driver.page_source)
names = e.xpath(&#39;//i[@class="nick"]/@title&#39;)
person_nums = e.xpath(&#39;//i[@class="js-num"]/text()&#39;)
# 打印数据
# for n,p in zip(names,person_nums):
# print(f&#39;主播名:{n} 人气:{p}&#39;)

# 找到下一页的按钮
# try:
# next_btn = driver.find_element(By.XPATH,&#39;//a[@class="laypage_next"]&#39;)
# next_btn.click()
# except Exception as e:
# break
if driver.page_source.find(&#39;laypage_next&#39;) == -1:
break
next_btn = driver.find_element(By.XPATH,&#39;//a[@class="laypage_next"]&#39;)
next_btn.click()

# 关闭浏览器
driver.quit()
if __name__ == &#39;__main__&#39;:
spider_huya() 查看全部

  汇总:selenium控制浏览器获取数据(java 版本)
  
  前段时间,突然更新了一个数据源网站,原来通过websocket爬取的数据突然变成了gg。没有办法,只能用最原创的方法来爬取想要的数据。我爬过很多网站数据,这里就不讨论爬虫的合理性和合法性了。纯分享一点我知道的技术网站大致分为三种(对于爬虫)⒈网站直接通过接口获取数据(json和pages)。简单的事情就是通过传递一些参数来获取不同的数据,这是最简单的。通过requests模块,你可以很方便的得到你想要的数据。 JSON数据说起来容易,直接解析JSON就好了。另一个是接口返回网页的源代码,稍微麻烦一点,也不难。 scrapy框架好用,xpath也是神器。简单的学习,爬一个网站不成问题。 ⒉第二
  
  秘密武器:爬虫神器之selenium的使用
  目录
  Selenium 介绍及安装
  Selenium 是一个用于 Web 的自动化测试工具,最初是为 网站 自动化测试而开发的。类型就像我们用来玩游戏的按键精灵,可以根据指定的指令自动操作。不同之处在于 Selenium 可以直接在浏览器上运行。对,它支持所有主流浏览器(包括 PhantomJS 这些无接口浏览器)。
  根据我们的说明,Selenium 可以让浏览器自动加载页面,获取所需的数据,甚至对页面进行截图,或者判断 网站 上的某些动作是否发生。
  Selenium 没有自己的浏览器,不支持浏览器的功能。它需要与第三方浏览器结合使用。但是我们有时需要让它在代码中内联运行,所以我们可以用一个叫做 PhantomJS 的工具来代替真正的浏览器。
  PyPI网站下载Selenium库嗯,也可以使用第三方管理器Selenium官方参考文档:o/index.html
  安装
  pip install selenium
  安装 Firefox geckodriver
  安装最新版本的 Firefox 并将 Firefox 可执行文件添加到系统环境变量中。记得关闭火狐的自动更新
  firefox下载地下:es把下载的geckodriver.exe放到路径D:\Python\python_version\
  安装 ChromeDriver
  注意版本号要对应
  测试代码
  # 导入 webdriver
from selenium import webdriver
# 要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys importKeys
# 调用环境变量指定的PhantomJS浏览器创建浏览器对象
driver = webdriver.Chrome()
# 如果没有在环境变量指定PhantomJS位置
# driver = webdriver.Chrome(executable_path="./phantomjs"))
# get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2)
driver.get("http://www.baidu.com/";)
# 打印网页渲染后的源代码
print(driver.page_source)
# 生成新的页面快照
driver.save_screenshot("python爬虫.png")
# 获取当前url
print(driver.current_url)
# 关闭浏览器
driver.quit()
  selenium 控制浏览器
  最大化窗口
  我们知道调用启动的浏览器不是全屏的,所以不会影响脚本的执行,但是有时候会影响我们的“watch”脚本的执行。
  browser = webdriver.Chrome()
url= &#39;http://www.baidu.com&#39;
browser.get(url)
borwser.maximize_window()
  设置宽度和高度
  最大化还是不够灵活,可以自由设置浏览显示的宽高吗?当然这是可能的。
  browser = webdriver.Chrome()
url= &#39;http://www.baidu.com&#39;
browser.get(url)
borwser.set_window_size(500,600)
  浏览器前进后退
  浏览器上有后退和前进按钮,对于浏览网页的人来说更方便;对于做web自动化测试的同学来说应该算是一道难题。事实上,这很简单。下面我们来看看python的实现。
  browser = webdriver.Chrome()#访问百度首页
first_url= &#39;http://www.baidu.com&#39;
browser.get(first_url)
time.sleep(2)#访问新闻页面
second_url=&#39;http://news.baidu.com&#39;
browser.get(second_url)
time.sleep(2)#返回(后退)到百度首页print "back to %s "%(first_url)
browser.back()
time.sleep(1) #前进到新闻页print "forward to %s"%(second_url)
browser.forward()
time.sleep(2)
browser.quit()
  硒元素定位
  对象定位应该是自动化的核心。要操作一个对象,首先要识别对象。一个对象就像一个人,他会有各种各样的特征(属性),比如我们可以通过一个人的身份证号、姓名,或者他住在哪条街、哪个楼层、哪个门牌号来找到这个人。
  物体定位
  webdriver提供对象定位方法
  使用 By 类确定选择哪种方法
  from selenium.webdriver.common.by import By
chrome.find_element(by=By.ID,value=&#39;su&#39;)
  By类的一些属性如下
  动作元素
  如前所述,很多知识是一个定位元素。定位只是第一步。定位后,需要对该元件进行操作。鼠标点击还是键盘输入取决于我们定位的是按钮还是输入框。
  一般来说,webdriver中比较常用的操作对象的方法有以下几种:
  from selenium import webdriver
from selenium.webdriver.chrome.service
import Service
from time import sleep
from selenium.webdriver.common.by import By
def test_element():
# 创建驱动对象
s =Service(executable_path=&#39;./chromedriver.exe&#39;)
# 创建一个浏览器
driver = webdriver.Chrome(service=s)
# 打个百度
driver.get(&#39;https://cn.bing.com/&#39;)
sleep(2)
# 获取 搜索框,并输出“学习”
driver.find_element(By.ID,&#39;sb_form_q&#39;).send_keys(&#39;学习&#39;)
sleep(1)
# 获取 搜索按钮,并点击

driver.find_element(By.ID,&#39;search_icon&#39;).click()
if __name__ ==&#39;__main__&#39;:
test_element()
  selenium 定位下拉菜单
  包括下拉菜单页面
  


Level Locate




Level locate



Link1

Action
Another action
Something else here

Separated link







Link2

Action
Another action
Something else here

Separated link






  选定的元素
  from selenium import webdriver
from selenium.webdriver.chrome.service
import Service
from selenium.webdriver.common.by import By
import os
from time import sleep
def test_down_menu():
# 创建一个驱动
s =Service(executable_path=&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
# 设置方位的文件地址
file_path = &#39;file:///&#39;+os.path.abspath(&#39;./html/test01.html&#39;)
# 访问页面
driver.get(file_path)
# 定位父级元素

driver.find_element(By.LINK_TEXT,&#39;Link1&#39;).click()
# 找到要移动的位置
menu = driver.find_element(By.LINK_TEXT,&#39;Action&#39;)
# 做一个移动光标的动作
# 定义一个动作在driver 移动到menu的位置 执行动作

webdriver.ActionChains(driver).move_to_element(menu).perform()
# sleep(2)
# 定位子级元素
menu.click()
# 睡眠2秒
sleep(2)
# 关闭浏览器
driver.quit()
if __name__ == &#39;__main__&#39;:
test_down_menu()
  硒级定位
  窗口定位
  对于一个现代的web应用来说,往往会有框架(frame)或者窗口(window)的应用,这给我们的定位带来了一个难题。有时候我们定位一个元素,定位器没有问题,但是一直无法定位。这时,我们需要检查元素是否在一个框架中。Seelnium webdriver提供了switch_to_frame方法,可以轻松解决这个问题。
  多层框架或窗口的定位:driver.switch_to.frame()
  框架.html
  

frame




frame


  内部.html
  

inner


inner


  switch_to_frame()
  from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
import os
from time import sleep
def select_frame():
# 创建驱动
s = Service(executable_path=&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/outer.html&#39;)
# 打开网页
driver.get(file_path)
# 切换frame
driver.switch_to.frame(&#39;f1&#39;)
driver.switch_to.frame(&#39;f2&#39;)
# 定位元素,输入要搜索的内容
driver.find_element(By.ID,&#39;sb_form_q&#39;).send_keys(&#39;百战&#39;)
# 定位按钮,点击搜索
driver.find_element(By.ID,&#39;search_icon&#39;).click()
sleep(3)
driver.quit()
if __name__ ==&#39;__main__&#39;:
select_frame()
  selenium 处理下拉框
  爬取数据时,有时数据过多,官网提供了过滤功能select标签。对于这样的数据,我们只需要定位元素并点击它。
  drop_down.html
  


UPS Next Day Air ==> $12.51
UPS Next Day Air Saver ==> $11.61
UPS 3 Day Select ==> $10.69
UPS 2nd Day Air ==> $9.03
UPS Ground ==> $8.34
USPS Priority Mail Insured ==> $9.25
USPS Priority Mail ==> $7.45
USPS First Class ==> $3.20


UPS Next Day Air ==> $12.51
UPS Next Day Air Saver ==> $11.61
UPS 3 Day Select ==> $10.69
UPS 2nd Day Air ==> $9.03
UPS Ground ==> $8.34
USPS Priority Mail Insured ==> $9.25
USPS Priority Mail ==> $7.45
USPS First Class ==> $3.20


  from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import os
def choose_option():
# 创建驱动
s = Service(&#39;./chromedriver.exe&#39;)
# 创建浏览器对象
driver = webdriver.Chrome(service=s)
# 访问页面
# 设置页面地址
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/test02.html&#39;)
driver.get(file_path)
# 定位下拉框里面选项
sleep(2)
driver.find_element(By.XPATH,&#39;//select[@id="ShippingMethod"]/option[@value="10.69"]&#39;).click()
sleep(2)
driver.find_element(By.XPATH,&#39;//select[@id="ShippingMethod2"]/option[@value="9.25"]&#39;).click()
# 关闭浏览器
sleep(5)
driver.quit()
if __name__ == &#39;__main__&#39;:
choose_option()
  selenium 处理弹出窗口
  有时,页面可能要弹出窗口。只需转到定位弹出窗口上的“确定”按钮
  html
  

This is a page

Hello,Python Spider

alert(&#39;这个是测试弹窗&#39;)
  from lib2to3.pgen2 import driver
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from time import sleep
import os
def test_windows():
# 创建驱动对象
s = Service(&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
# 访问页面
# 设置页面地址
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/test03.html&#39;)
driver.get(file_path)
sleep(3)
# 定位弹出窗口,并点击
driver.switch_to.alert.accept()
sleep(3)
driver.quit()
if __name__ ==&#39;__main__&#39;:
test_windows()
  selenium 拖放元素
  要完成元素的拖拽,首先需要指定被拖拽元素和拖拽目标元素,然后使用ActionChains类来实现,ActionChains用于自定义动作。通过 ActionChains 对象中的 perform() 执行动作,
  html
  


jQuery UI Draggable - Auto-scroll


#draggable, #draggable2, #draggable3 { width: 100px; height: 100px; padding: 0.5em; float: left; margin: 0 10px 10px 0; }
body {font-family: Arial, Helvetica, sans-serif;}
table {font-size: 1em;}
.ui-draggable, .ui-droppable {background-position: top;}




$( function() {
$( "#draggable" ).draggable({ scroll: true });
$( "#draggable2" ).draggable({ scroll: true, scrollSensitivity: 100 });
$( "#draggable3" ).draggable({ scroll: true, scrollSpeed: 100 });
} );

<p>Scroll set to true, default settings

  scrollSensitivity set to 100

  scrollSpeed set to 100
</p>
  Python
  from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import os
<p>
def test_drop():
# 创建驱动对象
s = Service(&#39;./chromedriver.exe&#39;)
# 创建浏览器
driver = webdriver.Chrome(service=s)
# 访问页面
# 设置页面地址
file_path = &#39;file:///&#39; + os.path.abspath(&#39;./html/test04.html&#39;)
driver.get(file_path)
# 定位要拖拽的元素
div1 = driver.find_element(By.ID,&#39;draggable&#39;)
div2 = driver.find_element(By.ID,&#39;draggable2&#39;)
div3 = driver.find_element(By.ID,&#39;draggable3&#39;)
# 开始拖拽
# 定义事件
sleep(2)
webdriver.ActionChains(driver).drag_and_drop(div1,div2).perform()
for i in range(10):
webdriver.ActionChains(driver).drag_and_drop_by_offset(div3,10,10).perform()
sleep(0.5)
# 关闭浏览器
sleep(3)
driver.quit()
if __name__ ==&#39;__main__&#39;:
test_drop()</p>
  selenium 调用 js 方法
  有时候我们需要控制页面滚动条上的滚动条,但是滚动条并不是页面上的一个元素。这时候我们需要使用js来操作
  滚动条的操作一般有两种场景:
  调用js方法
  execute_script(script, *args)
  滚动条回到顶部:
  js="document.getElementById(&#39;id&#39;).scrollTop=0"
driver.execute_script(js)
  滚动条到底部
  js="document.documentElement.scrollTop=10000"
driver.execute_script(js)
  可以修改scrollTop的值,使滚动条位于右侧,0为顶部,10000为底部
  以上方法在火狐和IE浏览器上都可以,但是用Chrome浏览器,我发现不行。Chrome浏览器解决方案:
  js = "document.body.scrollTop=0"
driver.execute_script(js)
  水平滚动条
  js = "window.scrollTo(100,400)"
driver.execute_script(js)
  硒等待元素
  被迫等待
  使用时间.sleep
  功能:当代码运行到强制等待的那一行时,无论什么原因,都强制等待指定时间,需要通过time模块实现
  优点:简单
  缺点:无法做出有效判断,会浪费时间
  隐式等待
  chrome.implicitly_wait(time_num)
  过了一定时间,发现元素还没有加载,继续等待我们指定的时间。如果超过指定时间还没有加载,就会抛出异常。如果它没有等待就已经加载,它将立即执行。
  优点:设置一次
  缺点:必须等待加载完成才能进行后续操作,或者等待超时才能进行后续操作
  显示等待
  从 selenium.webdriver.support.wait 导入 WebDriverWait
  指定等待条件并指定最长等待时间。在这段时间内判断是否满足等待条件。如果是真的,它会立即返回。如果不是真的,它将一直等待,直到等待您指定的最长等待时间。如果仍然不满足则抛出异常,如果满足则正常返回
  优点:专门用于等待指定元素,加载后可以运行后续代码
  缺点:需要设置多个元素分别等待
  url = &#39;https://www.guazi.com/nj/buy/&#39;
driver = webdriver.Chrome()
driver.get(url)
wait = WebDriverWait(driver,10,0.5)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, &#39;next&#39;)))
print(driver.page_source)
  selenium 参数用法
  包括无头模式、代理模式、绕过检测
  from selenium.webdriver.chrome.service import Service
from selenium.webdriver import Chrome,ChromeOptions,DesiredCapabilities
from time import sleep
def test_headless():
# 设置参数,将浏览器隐藏起来(无头浏览器)
options = ChromeOptions()
options.add_argument(&#39;--headless&#39;)
# 设置驱动
service = Service(&#39;./chromedriver&#39;)
# 启动Chrome浏览器
driver = Chrome(service=service,options=options)
# 访问页面
driver.get(&#39;https://www.baidu.com&#39;)
# 打印代码
print(driver.page_source)
# 关闭浏览器
driver.quit()
def test_proxy1():
# 设置参数,给浏览器设置代理
options = ChromeOptions()
# options.add_argument(&#39;--proxy-server=http://ip:port&#39;)
options.add_argument(&#39;--proxy-server=http://221.199.36.122:35414&#39;)
# 设置驱动
service = Service(&#39;./chromedriver&#39;)
# 启动Chrome浏览器
driver = Chrome(service=service,options=options)
# 访问页面 "134.195.101.16",
driver.get(&#39;http://httpbin.org/get&#39;)
# 打印代码
print(driver.page_source)
# 关闭浏览器
driver.quit()
def test_proxy2():
from selenium.webdriver.common.proxy import ProxyType,Proxy
# 设置参数,给浏览器设置代理
ip = &#39;http://113.76.133.238:35680&#39;
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = ip
proxy.ssl_proxy = ip
# 关联浏览器
capabilities = DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
# 设置驱动
service = Service(&#39;./chromedriver&#39;)
# 启动Chrome浏览器
driver = Chrome(service=service,desired_capabilities=capabilities)
# 访问页面 "134.195.101.16",
driver.get(&#39;http://httpbin.org/get&#39;)
# 打印代码
print(driver.page_source)
# 关闭浏览器
driver.quit()
def test_find():
options = ChromeOptions()
options.add_experimental_option(&#39;excludeSwitches&#39;, [&#39;enable-automation&#39;])
options.add_experimental_option(&#39;useAutomationExtension&#39;, False)
chrome = Chrome(chrome_options=options)
chrome.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, &#39;webdriver&#39;, {
get: () => false
})
"""
})
chrome.get(&#39;http://httpbin.org/get&#39;)
info = chrome.page_source
print(info)
sleep(20)
if __name__ ==&#39;__main__&#39;:
# test_headless()
# test_proxy1()
# test_proxy2()
test_find()
  硒实用案例
  from selenium.webdriver.chrome.service import Service
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from lxml import etree
def spider_huya():
# 创建一个驱动
service = Service(&#39;./chromedriver.exe&#39;)
# 创建一个浏览器
driver = Chrome(service=service)
# 设置隐式等待
driver.implicitly_wait(5)
# 访问网址
driver.get(&#39;https://www.huya.com/g/lol&#39;)
count = 1
while True:
# print(&#39;获取了第%d页&#39; % count)
# count += 1
# 提取数据
e = etree.HTML(driver.page_source)
names = e.xpath(&#39;//i[@class="nick"]/@title&#39;)
person_nums = e.xpath(&#39;//i[@class="js-num"]/text()&#39;)
# 打印数据
# for n,p in zip(names,person_nums):
# print(f&#39;主播名:{n} 人气:{p}&#39;)

# 找到下一页的按钮
# try:
# next_btn = driver.find_element(By.XPATH,&#39;//a[@class="laypage_next"]&#39;)
# next_btn.click()
# except Exception as e:
# break
if driver.page_source.find(&#39;laypage_next&#39;) == -1:
break
next_btn = driver.find_element(By.XPATH,&#39;//a[@class="laypage_next"]&#39;)
next_btn.click()

# 关闭浏览器
driver.quit()
if __name__ == &#39;__main__&#39;:
spider_huya()

内容分享:BackStreet Browser(离线浏览器)与一键获取网页内所有链接工具下

网站优化优采云 发表了文章 • 0 个评论 • 186 次浏览 • 2022-09-24 18:19 • 来自相关话题

  内容分享:BackStreet Browser(离线浏览器)与一键获取网页内所有链接工具下
  
  软件介绍
  
  后街浏览器软件是离线浏览的好帮手。 BackStreet Browser软件的特点是多个线程可以同时访问目标网站,充分利用带宽,不必因网络流量情况而延迟,延长等待时间。对于不想花时间等待不必要的时间的BackStreetBrowser来说,这是一个不错的选择。 BackStreet Browser(离线浏览器)是当今互联网上常用的软件之一。本软件绿色、安全、无毒,让您放心使用!如果BackStreet Browser(离线浏览器)是你需要的工具,来这里吧!本站为您提供BackStreet Browser(离线浏览器)的官方下载。
  免费获取:4个完全不收费的资源搜索网站,只有你想不到,没有你搜不到!
  在网上找不到您要查找的内容?今天小编给大家分享4个完全免费的资源搜索网站,快速搜索各类学习资源,只有你想不到,没有你也搜不到!
  1.Panc 搜索
  Panc 搜索也称为胖搜索。这是一个资源非常完整的搜索网站。 网站 中的资源类型非常丰富。用它来寻找资源是对的。还可以向P友求资源帮助,资源问答,不怕找资源。
  
  2.不飞溅的免费图片
  unsplash免费图片,这是一张无版权可商用的海量高清图片网站,多种风格图片任你选择,不用担心图片侵权等问题~
  3.Ncckl
  ncckl,一个类似于云盘精灵的网站。自从云盘精灵收费后,很多人都开始使用了。它有两个亮点,就是可以看到网盘密码并分享给会员。 (在 网站 上分享其他一些免费会员帐户。)
  
  4.昆虫部落
  昆虫部落,强大的搜索网站,这个网站上有各种搜索引擎,可以搜索小程序、表情、gif、图标等各种素材,非常实用。
  除了这四个网站,你还知道哪些有用的资源网站?知道的就在评论区分享给大家吧~
  PS:需要转换文件格式,可以试试【迅捷PDF转换器】~ 查看全部

  内容分享:BackStreet Browser(离线浏览器)与一键获取网页内所有链接工具下
  
  软件介绍
  
  后街浏览器软件是离线浏览的好帮手。 BackStreet Browser软件的特点是多个线程可以同时访问目标网站,充分利用带宽,不必因网络流量情况而延迟,延长等待时间。对于不想花时间等待不必要的时间的BackStreetBrowser来说,这是一个不错的选择。 BackStreet Browser(离线浏览器)是当今互联网上常用的软件之一。本软件绿色、安全、无毒,让您放心使用!如果BackStreet Browser(离线浏览器)是你需要的工具,来这里吧!本站为您提供BackStreet Browser(离线浏览器)的官方下载。
  免费获取:4个完全不收费的资源搜索网站,只有你想不到,没有你搜不到!
  在网上找不到您要查找的内容?今天小编给大家分享4个完全免费的资源搜索网站,快速搜索各类学习资源,只有你想不到,没有你也搜不到!
  1.Panc 搜索
  Panc 搜索也称为胖搜索。这是一个资源非常完整的搜索网站。 网站 中的资源类型非常丰富。用它来寻找资源是对的。还可以向P友求资源帮助,资源问答,不怕找资源。
  
  2.不飞溅的免费图片
  unsplash免费图片,这是一张无版权可商用的海量高清图片网站,多种风格图片任你选择,不用担心图片侵权等问题~
  3.Ncckl
  ncckl,一个类似于云盘精灵的网站。自从云盘精灵收费后,很多人都开始使用了。它有两个亮点,就是可以看到网盘密码并分享给会员。 (在 网站 上分享其他一些免费会员帐户。)
  
  4.昆虫部落
  昆虫部落,强大的搜索网站,这个网站上有各种搜索引擎,可以搜索小程序、表情、gif、图标等各种素材,非常实用。
  除了这四个网站,你还知道哪些有用的资源网站?知道的就在评论区分享给大家吧~
  PS:需要转换文件格式,可以试试【迅捷PDF转换器】~

最新版本:Selenium浏览器自动化 - HTML元素定位

网站优化优采云 发表了文章 • 0 个评论 • 203 次浏览 • 2022-09-24 18:17 • 来自相关话题

  最新版本:Selenium浏览器自动化 - HTML元素定位
  过去,Selenium 中有 7 种常见的定位方法,如下所示。新方法请直接查看下面的python代码。
  id定位:find_element_by_id是通过元素的id属性查找元素的方式。
  名称定位:通过元素的name属性查找元素的方法是find_element_by_name。
  类定位:通过类名定位元素的方法是find_element_by_class_name。
  标签定位:每个元素都可以看成一个标签,但是HTML页面的标签重复性很强,这种方法很少用于定位。方法是 find_element_by_tag_name。
  链接定位:专门用来定位文本链接,方法是find_element_by_link_text。
  XPath(XML Path Language,XML路径语言)定位:通过XPath定位元素的方法是find_element_by_xpath。
  CSS定位:CSS使用选择器将属性绑定到页面元素,可以灵活选择控件的任意属性。方法是find_element_by_css_selector。
  通过浏览器开发者模式,找到百度的搜索框定位元素。
  #!/usr/bin/env python
# -*- coding:utf-8 -*-
<p>
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
def get_driver():
# 获取浏览器驱动对象
# 设置chromedriver的执行路径,需要将下载解压好的chromedriver与本脚本放在同一文件夹下,或者补全执行路径。
chromedriver = &#39;chromedriver&#39;
driver = webdriver.Chrome(executable_path=chromedriver)
return driver
  
driver = get_driver()
driver.get(&#39;https://www.baidu.com&#39;)
# 通过class name定位搜索框
search_input = driver.find_element(by=By.CLASS_NAME, value=&#39;s_ipt&#39;)
# 在搜索框输入“python”
search_input.send_keys(&#39;python&#39;)
# 在搜索框按“Enter”键
search_input.send_keys(Keys.ENTER)
</p>
  最新版本:什么是搜寻引擎优化(SEO)?
  什么是搜索引擎优化 (SEO)?
  
  2021-12-12 22:38·清宁书房
  SEO 是一种营销方法,通过自然排名(无需付费)来提高网页的知名度。搜索引擎优化涉及技术和创造力,以提高页面排名、流量并增加页面在搜索引擎上的可见度。 SEO 可以通过多种方式从页面上的文本或其他 网站 链接链接到您的页面,有时 SEO 只是确保搜索引擎能够理解您的 网站 结构的简单方法。
  
  搜索引擎优化不仅仅是建立搜索引擎友好的网页,搜索引擎优化可以使网页更容易被人们访问并为人们带来更多的信息,我们相信这些与搜索引擎优化的原则密切相关。 查看全部

  最新版本:Selenium浏览器自动化 - HTML元素定位
  过去,Selenium 中有 7 种常见的定位方法,如下所示。新方法请直接查看下面的python代码。
  id定位:find_element_by_id是通过元素的id属性查找元素的方式。
  名称定位:通过元素的name属性查找元素的方法是find_element_by_name。
  类定位:通过类名定位元素的方法是find_element_by_class_name。
  标签定位:每个元素都可以看成一个标签,但是HTML页面的标签重复性很强,这种方法很少用于定位。方法是 find_element_by_tag_name。
  链接定位:专门用来定位文本链接,方法是find_element_by_link_text。
  XPath(XML Path Language,XML路径语言)定位:通过XPath定位元素的方法是find_element_by_xpath。
  CSS定位:CSS使用选择器将属性绑定到页面元素,可以灵活选择控件的任意属性。方法是find_element_by_css_selector。
  通过浏览器开发者模式,找到百度的搜索框定位元素。
  #!/usr/bin/env python
# -*- coding:utf-8 -*-
<p>
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
def get_driver():
# 获取浏览器驱动对象
# 设置chromedriver的执行路径,需要将下载解压好的chromedriver与本脚本放在同一文件夹下,或者补全执行路径。
chromedriver = &#39;chromedriver&#39;
driver = webdriver.Chrome(executable_path=chromedriver)
return driver
  
driver = get_driver()
driver.get(&#39;https://www.baidu.com&#39;)
# 通过class name定位搜索框
search_input = driver.find_element(by=By.CLASS_NAME, value=&#39;s_ipt&#39;)
# 在搜索框输入“python”
search_input.send_keys(&#39;python&#39;)
# 在搜索框按“Enter”键
search_input.send_keys(Keys.ENTER)
</p>
  最新版本:什么是搜寻引擎优化(SEO)?
  什么是搜索引擎优化 (SEO)?
  
  2021-12-12 22:38·清宁书房
  SEO 是一种营销方法,通过自然排名(无需付费)来提高网页的知名度。搜索引擎优化涉及技术和创造力,以提高页面排名、流量并增加页面在搜索引擎上的可见度。 SEO 可以通过多种方式从页面上的文本或其他 网站 链接链接到您的页面,有时 SEO 只是确保搜索引擎能够理解您的 网站 结构的简单方法。
  
  搜索引擎优化不仅仅是建立搜索引擎友好的网页,搜索引擎优化可以使网页更容易被人们访问并为人们带来更多的信息,我们相信这些与搜索引擎优化的原则密切相关。

事实:浏览器抓取网页的时候,从来都不是把所有的网页都抓取下来

网站优化优采云 发表了文章 • 0 个评论 • 118 次浏览 • 2022-09-22 15:05 • 来自相关话题

  事实:浏览器抓取网页的时候,从来都不是把所有的网页都抓取下来
  浏览器抓取网页的时候,从来都不是把所有的网页都抓取下来,而是只抓取自己想要的内容。在浏览器中控制台抓取输入框的数据,一般有三种做法。parse,通过javascript去读取javascript中关于网页的内容。acronym和bopool,利用ajax,就可以在不用到网页内容的情况下,控制网页的输入内容。
  parse:parse方法主要会返回一个json对象。如果json对象内容是文本,就会转换成一个json字符串,如果json对象内容是链接,会转换成一个json对象。bopool:json也是可以自己通过ajax(异步请求)实现的。parse方法和bopool方法相对来说比较简单,而且ajax也是可以自己通过ajax去请求网页的内容。
  
  一种是parse,一种是bopool。那么问题来了,ajax是如何请求json的呢?两种方法:分别是eval和parse。eval()中,eval()直接创建一个javascript对象,里面包含了该请求网页的所有内容。eval()的实现思路如下:。
  1、把要请求的javascript内容,全部转换成纯文本。
  2、给纯文本的每一个字符串重新赋值一个类似"\0x00"或者"\00a"之类的符号。
  
  3、把转换过的javascript值用'\0'符号连接起来。
  4、编码转换过程中失败,会把结果直接作为参数发送给request,返回一个json对象。parse()方法就是返回一个json对象。parse()不能带参数,传入值会报错。eval()依然也不能加参数,json对象本身可以作为参数。如果需要加一个参数,就是eval("p"),eval()创建一个字符串。
  parse()方法也不能带参数,json对象本身也可以作为参数。然后我们再来看一下scrapy中parse_json的源码实现。scrapy中parse_json实现:它在每次请求网页时,初始化一个evalbody类,作为parse方法的第一个参数传入。evalbody类拥有parse_json函数和bopool函数两个抽象类,其中,parse_json函数的第一个参数是json格式的一个object对象,bopool函数的第一个参数是一个json对象(也可以是jsonstring对象)。
  parse_json会调用json格式的object对象中的parse()方法完成json格式解析,bopool不会管,直接返回一个json对象。然后我们post一个简单的http请求:./json.parse({"user_name":"cvtulsn","password":"12345678"})效果如下:它其实是利用bopool实现的!在bopool方法中使用evalbody类和parsejson类完成了json格式的解析:json类解析一个json对象实际上是通过bopool实现的。bopool属于纯函数,而且带有参数。所以,可以通过bopool添加一个参数。evalbody类中。 查看全部

  事实:浏览器抓取网页的时候,从来都不是把所有的网页都抓取下来
  浏览器抓取网页的时候,从来都不是把所有的网页都抓取下来,而是只抓取自己想要的内容。在浏览器中控制台抓取输入框的数据,一般有三种做法。parse,通过javascript去读取javascript中关于网页的内容。acronym和bopool,利用ajax,就可以在不用到网页内容的情况下,控制网页的输入内容。
  parse:parse方法主要会返回一个json对象。如果json对象内容是文本,就会转换成一个json字符串,如果json对象内容是链接,会转换成一个json对象。bopool:json也是可以自己通过ajax(异步请求)实现的。parse方法和bopool方法相对来说比较简单,而且ajax也是可以自己通过ajax去请求网页的内容。
  
  一种是parse,一种是bopool。那么问题来了,ajax是如何请求json的呢?两种方法:分别是eval和parse。eval()中,eval()直接创建一个javascript对象,里面包含了该请求网页的所有内容。eval()的实现思路如下:。
  1、把要请求的javascript内容,全部转换成纯文本。
  2、给纯文本的每一个字符串重新赋值一个类似"\0x00"或者"\00a"之类的符号。
  
  3、把转换过的javascript值用'\0'符号连接起来。
  4、编码转换过程中失败,会把结果直接作为参数发送给request,返回一个json对象。parse()方法就是返回一个json对象。parse()不能带参数,传入值会报错。eval()依然也不能加参数,json对象本身可以作为参数。如果需要加一个参数,就是eval("p"),eval()创建一个字符串。
  parse()方法也不能带参数,json对象本身也可以作为参数。然后我们再来看一下scrapy中parse_json的源码实现。scrapy中parse_json实现:它在每次请求网页时,初始化一个evalbody类,作为parse方法的第一个参数传入。evalbody类拥有parse_json函数和bopool函数两个抽象类,其中,parse_json函数的第一个参数是json格式的一个object对象,bopool函数的第一个参数是一个json对象(也可以是jsonstring对象)。
  parse_json会调用json格式的object对象中的parse()方法完成json格式解析,bopool不会管,直接返回一个json对象。然后我们post一个简单的http请求:./json.parse({"user_name":"cvtulsn","password":"12345678"})效果如下:它其实是利用bopool实现的!在bopool方法中使用evalbody类和parsejson类完成了json格式的解析:json类解析一个json对象实际上是通过bopool实现的。bopool属于纯函数,而且带有参数。所以,可以通过bopool添加一个参数。evalbody类中。

内容分享:谷歌浏览器获取cookie以及抓包获取真实链接

网站优化优采云 发表了文章 • 0 个评论 • 115 次浏览 • 2022-09-22 13:10 • 来自相关话题

  内容分享:谷歌浏览器获取cookie以及抓包获取真实链接
  目前大部分浏览器都有自己的开发者工具(一般是按f12出现),打开网站后就可以看到网页的cookies和加载的各种信息。
  以谷歌浏览器为例:
  1.在谷歌浏览器中打开网址
  在分页上点击网址时,会发现网址没有变化。这是一个典型的帖子 URL,需要捕获包的真实链接。
  2.从右上角的自定义控件打开开发者工具或者直接按f12运行,
  
  3.打开工具点击页面后,工具中出现一个链接,是网站翻页的请求信息
  4.有些网站有不止一个翻页请求信息。如果对请求不确定,可以通过查看请求信息的回执内容来判断真正的翻页请求,如图
  5. 接下来根据header中的信息判断翻页URL是get还是post。get URL一般可以直接打开访问(但不带特殊头信息),post URL不能直接打开(只能在软件中直接打开)
  
  6. 查看header中的信息,你会发现这是一个post请求,但是这里并没有post请求参数,但是可以看到header后面有一个payload,参数其实是放在这里
  通过以上步骤,基本获得了内容页面的制作和获取规则的相关信息。设置了以下规则
  1.例如从pesponse获取内容页面相关参数
  2.post参数设置,可以点击payload中的view sorce获取如下参数
  解密:二、爬虫如何抓取网页数据
  3.从 HTML 页面中提取有用的数据
  一个。如果需要,保存数据
  湾。如果是页面中的另一个 URL,则进行第二步。
  2.3 如何抓取 HTML 页面
  HTTP请求处理:urllib、urllib2、request 处理后的请求可以模拟浏览器发送请求,得到服务器响应的文件。
  2.4 解析服务器响应的内容
  
  re、xpath、BeautifulSoup4(bs4)、jsonpath、pyquery 等。
  2.5 如何采集动态HTML,验证码处理
  采集 用于一般动态页面:Selenium+PhantomJs(无界面),模拟真实浏览器加载
  三、万能爬虫,专注爬虫
  3.1 通用爬虫:搜索引擎的爬虫系统。
  1.目标:就是尽可能的把网上所有的网页下载下来,放到本地服务器形成的备份库中,然后对这些网页做相关的处理(提取关键词,去除广告),并提取有用的东西
  2.爬取过程:
  
  a:优先选择一部分已有的URL,将这些URL放入爬虫队列。
  b:从队列中取出这些URL,然后解析DNS得到主机IP,然后到该IP对应的服务器下载HTML页面。宝初到搜索引擎本地服务器后,将爬取的URL放入爬取队列
  c:分析网页内容,找出网页上的其他链接,继续执行第二步,直到找到相关信息
  3.2 搜索引擎如何获取 网站 URL
  1.主动提交给搜索引擎网站
  2.其他网站设置网站的连接
  3.搜索引擎将与DNS服务商合作快速收录新网站,DNS:是一种将域名解析为IP的技术。 查看全部

  内容分享:谷歌浏览器获取cookie以及抓包获取真实链接
  目前大部分浏览器都有自己的开发者工具(一般是按f12出现),打开网站后就可以看到网页的cookies和加载的各种信息。
  以谷歌浏览器为例:
  1.在谷歌浏览器中打开网址
  在分页上点击网址时,会发现网址没有变化。这是一个典型的帖子 URL,需要捕获包的真实链接。
  2.从右上角的自定义控件打开开发者工具或者直接按f12运行,
  
  3.打开工具点击页面后,工具中出现一个链接,是网站翻页的请求信息
  4.有些网站有不止一个翻页请求信息。如果对请求不确定,可以通过查看请求信息的回执内容来判断真正的翻页请求,如图
  5. 接下来根据header中的信息判断翻页URL是get还是post。get URL一般可以直接打开访问(但不带特殊头信息),post URL不能直接打开(只能在软件中直接打开)
  
  6. 查看header中的信息,你会发现这是一个post请求,但是这里并没有post请求参数,但是可以看到header后面有一个payload,参数其实是放在这里
  通过以上步骤,基本获得了内容页面的制作和获取规则的相关信息。设置了以下规则
  1.例如从pesponse获取内容页面相关参数
  2.post参数设置,可以点击payload中的view sorce获取如下参数
  解密:二、爬虫如何抓取网页数据
  3.从 HTML 页面中提取有用的数据
  一个。如果需要,保存数据
  湾。如果是页面中的另一个 URL,则进行第二步。
  2.3 如何抓取 HTML 页面
  HTTP请求处理:urllib、urllib2、request 处理后的请求可以模拟浏览器发送请求,得到服务器响应的文件。
  2.4 解析服务器响应的内容
  
  re、xpath、BeautifulSoup4(bs4)、jsonpath、pyquery 等。
  2.5 如何采集动态HTML,验证码处理
  采集 用于一般动态页面:Selenium+PhantomJs(无界面),模拟真实浏览器加载
  三、万能爬虫,专注爬虫
  3.1 通用爬虫:搜索引擎的爬虫系统。
  1.目标:就是尽可能的把网上所有的网页下载下来,放到本地服务器形成的备份库中,然后对这些网页做相关的处理(提取关键词,去除广告),并提取有用的东西
  2.爬取过程:
  
  a:优先选择一部分已有的URL,将这些URL放入爬虫队列。
  b:从队列中取出这些URL,然后解析DNS得到主机IP,然后到该IP对应的服务器下载HTML页面。宝初到搜索引擎本地服务器后,将爬取的URL放入爬取队列
  c:分析网页内容,找出网页上的其他链接,继续执行第二步,直到找到相关信息
  3.2 搜索引擎如何获取 网站 URL
  1.主动提交给搜索引擎网站
  2.其他网站设置网站的连接
  3.搜索引擎将与DNS服务商合作快速收录新网站,DNS:是一种将域名解析为IP的技术。

浏览器抓取网页的时候是不是经常遇到这个问题?

网站优化优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2022-08-10 18:01 • 来自相关话题

  浏览器抓取网页的时候是不是经常遇到这个问题?
  
  浏览器抓取网页的时候是不是经常遇到这个问题?下载一个app下来是全局都可用,但是其他app就不能用了。可以通过浏览器的代理工具获取到源代码地址,解析地址获取到目标页面即可。其实我们需要的是一个可以在网页全局可用的代理(注意是全局!!),那么现在知道一个办法可以实现网页全局可用代理,对于页面保存是可以非常方便的了。
  
  没错,知乎上的答主分享的浏览器代理就可以完成网页全局可用代理。首先登录一个知乎网站,注册成功之后,会自动创建一个帐号,登录之后就会发现是登录界面,你在该页面的topic可以看到自己关注的问题列表,关注的人。下面这段代码就是关注者名字的全局代理地址,即chrome插件,可以直接修改google地址或者手动添加。
  //全局代理chrome插件//默认方式:$('.f2').open('txt','xxx.xxx.xxx');chrome插件地址,$('.f2')其实是全局代理chrome插件地址,你关注的人或者文章都会默认出现在你的浏览器全局代理列表中$('.f2').open('xxx.xxx.xxx','xxx.xxx.xxx');通过点击/找到方式可以获取全局代理地址://访问页面/是你默认关注的人,你也可以修改问题个数$('.f2').open('tag','xxx.xxx.xxx');$('.f2').open('xxx.xxx.xxx','xxx.xxx.xxx');通过在某个文章页面点击右键复制粘贴到别的文章页面:在浏览器全局代理地址页面,右键粘贴即可。是不是简单粗暴。 查看全部

  浏览器抓取网页的时候是不是经常遇到这个问题?
  
  浏览器抓取网页的时候是不是经常遇到这个问题?下载一个app下来是全局都可用,但是其他app就不能用了。可以通过浏览器的代理工具获取到源代码地址,解析地址获取到目标页面即可。其实我们需要的是一个可以在网页全局可用的代理(注意是全局!!),那么现在知道一个办法可以实现网页全局可用代理,对于页面保存是可以非常方便的了。
  
  没错,知乎上的答主分享的浏览器代理就可以完成网页全局可用代理。首先登录一个知乎网站,注册成功之后,会自动创建一个帐号,登录之后就会发现是登录界面,你在该页面的topic可以看到自己关注的问题列表,关注的人。下面这段代码就是关注者名字的全局代理地址,即chrome插件,可以直接修改google地址或者手动添加。
  //全局代理chrome插件//默认方式:$('.f2').open('txt','xxx.xxx.xxx');chrome插件地址,$('.f2')其实是全局代理chrome插件地址,你关注的人或者文章都会默认出现在你的浏览器全局代理列表中$('.f2').open('xxx.xxx.xxx','xxx.xxx.xxx');通过点击/找到方式可以获取全局代理地址://访问页面/是你默认关注的人,你也可以修改问题个数$('.f2').open('tag','xxx.xxx.xxx');$('.f2').open('xxx.xxx.xxx','xxx.xxx.xxx');通过在某个文章页面点击右键复制粘贴到别的文章页面:在浏览器全局代理地址页面,右键粘贴即可。是不是简单粗暴。

web前端编程,浏览器抓取网页数据的方法有哪些

网站优化优采云 发表了文章 • 0 个评论 • 99 次浏览 • 2022-07-15 01:00 • 来自相关话题

  web前端编程,浏览器抓取网页数据的方法有哪些
  浏览器抓取网页数据的方法有很多,如手动抓取等等,利用web开发有nbwebview,高版本浏览器可以直接下载插件,有免费也有收费。还有一种是用chrome的高级模式截取,开启了高级模式就可以抓取网页任意页面,我在文章it网-web前端编程,
  1、给chrome浏览器设置过滤广告的开关
  2、系统推荐启用、禁用网页下载速度计算
  
  3、更改快捷键windows用户f12,
  4、我们用chrome+网页浏览器浏览器浏览网页或者我们新建一个页面,
  将点击抓取网页数据到excel,以excel格式存在本地,chrome打开即可下载。
  极速网页下载大师
  
  如果只是网页抓取,不是需要解析的话,可以考虑用chrome代替qq浏览器浏览器,然后下载插件将html下载,然后js,css等拖进去转化。更牛逼的可以使用xx狗,然后转化。
  可以使用idm下载
  qq浏览器f12看curl设置,
  看标题,我以为你是想要抓取网页中特定的js文件,我想想呢,可以试试这个,就算用插件,也是可以抓取网页并编译到excel的。
  我还以为要抓取.json文件,要到js代码里面找呢没想到竟然是f12,如果都要抓包的话,那没法快了。如果只是抓取图片,编辑器一行一行的抓吧,其实图片抓取也有很多可以抓包的方法的。还是建议楼主尽快买个mac吧,这样的话你可以把现有代码发给我, 查看全部

  web前端编程,浏览器抓取网页数据的方法有哪些
  浏览器抓取网页数据的方法有很多,如手动抓取等等,利用web开发有nbwebview,高版本浏览器可以直接下载插件,有免费也有收费。还有一种是用chrome的高级模式截取,开启了高级模式就可以抓取网页任意页面,我在文章it网-web前端编程,
  1、给chrome浏览器设置过滤广告的开关
  2、系统推荐启用、禁用网页下载速度计算
  
  3、更改快捷键windows用户f12,
  4、我们用chrome+网页浏览器浏览器浏览网页或者我们新建一个页面,
  将点击抓取网页数据到excel,以excel格式存在本地,chrome打开即可下载。
  极速网页下载大师
  
  如果只是网页抓取,不是需要解析的话,可以考虑用chrome代替qq浏览器浏览器,然后下载插件将html下载,然后js,css等拖进去转化。更牛逼的可以使用xx狗,然后转化。
  可以使用idm下载
  qq浏览器f12看curl设置,
  看标题,我以为你是想要抓取网页中特定的js文件,我想想呢,可以试试这个,就算用插件,也是可以抓取网页并编译到excel的。
  我还以为要抓取.json文件,要到js代码里面找呢没想到竟然是f12,如果都要抓包的话,那没法快了。如果只是抓取图片,编辑器一行一行的抓吧,其实图片抓取也有很多可以抓包的方法的。还是建议楼主尽快买个mac吧,这样的话你可以把现有代码发给我,

浏览器抓取网页不是一个简单的工作,必须要有网页的图片和视频

网站优化优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2022-07-12 16:00 • 来自相关话题

  浏览器抓取网页不是一个简单的工作,必须要有网页的图片和视频
  浏览器抓取网页不是一个简单的工作,涉及到代码和服务器的配合,我们通常用的浏览器网页抓取,抓取的是网页,而不是网页的图片,视频,和其他的内容。要想浏览器就可以抓取网页,必须要有网页的图片和视频。1,为什么必须是网页。如果是.http.server或者.http.proxy这类的网页,或者是java.util.links,或者是其他java平台上已经有的file.jar包,那么他就属于web应用,我们可以把这些web应用封装成jar包,把用户的图片或者视频封装成jar包,并封装到网页上即可。
  
  那么java程序员就可以无视http协议,直接调用jar包里的api。如果你要做一个动态web程序,那么肯定需要写一个web容器,那么我们封装成jar包是不现实的,如果这个web容器完成不了,我们肯定不能封装进入,否则直接报错,因为使用web容器一方面要看开发人员的水平,一方面也要考虑跨平台的兼容性。
  正是由于我们不考虑跨平台,如果不用网页,不用程序,那么我们就得去抓网页中的图片和视频。2,为什么需要分析网页首先http有get,post,put,patch,pattern这些方法,大家都可以去看一下。当有人封装一个web应用程序的时候,这些方法都能够帮你抓取到图片和视频,用的是不同的server。
  
  有了这些方法,你完全可以不考虑浏览器,直接拿程序去连接请求网页,那么就不用操心服务器的问题,毕竟服务器是管理web应用程序的,不是浏览器。我们抓取图片或者视频,是要拿到图片和视频的jpg,bmp,mp4等格式文件,我们可以封装成jar包。这样我们就可以不需要手动解析js和css文件,解析出来的代码有很多,很容易出问题,并且直接写在web容器里。
  当然,用原生方法解析java程序是不可能的,因为原生程序太复杂,需要处理的对象有上百个。所以,我们用的是webkit的signalhook技术,用webkit的signal去抓取。通过两个函数来控制hook来实现,1是javavoidmodels()voidredirect(protocol,request)2是javavoidapply(protocol,request)上面的函数都会被signalhook处理掉,那么在程序里就不能调用java的全局变量。
  当apply对方法被调用的时候,就会出错,但是我们还能请求到图片或者视频,也不是没有办法,有两种方法。1,原生代码针对请求服务器方法,可以通过java.util.pairs.filelinksfor(xxx,xxx,xxx)来实现解析图片或者视频。有一个比较明显的缺点就是返回的是xml格式。2,可以通过java.util.viewfilesy。 查看全部

  浏览器抓取网页不是一个简单的工作,必须要有网页的图片和视频
  浏览器抓取网页不是一个简单的工作,涉及到代码和服务器的配合,我们通常用的浏览器网页抓取,抓取的是网页,而不是网页的图片,视频,和其他的内容。要想浏览器就可以抓取网页,必须要有网页的图片和视频。1,为什么必须是网页。如果是.http.server或者.http.proxy这类的网页,或者是java.util.links,或者是其他java平台上已经有的file.jar包,那么他就属于web应用,我们可以把这些web应用封装成jar包,把用户的图片或者视频封装成jar包,并封装到网页上即可。
  
  那么java程序员就可以无视http协议,直接调用jar包里的api。如果你要做一个动态web程序,那么肯定需要写一个web容器,那么我们封装成jar包是不现实的,如果这个web容器完成不了,我们肯定不能封装进入,否则直接报错,因为使用web容器一方面要看开发人员的水平,一方面也要考虑跨平台的兼容性。
  正是由于我们不考虑跨平台,如果不用网页,不用程序,那么我们就得去抓网页中的图片和视频。2,为什么需要分析网页首先http有get,post,put,patch,pattern这些方法,大家都可以去看一下。当有人封装一个web应用程序的时候,这些方法都能够帮你抓取到图片和视频,用的是不同的server。
  
  有了这些方法,你完全可以不考虑浏览器,直接拿程序去连接请求网页,那么就不用操心服务器的问题,毕竟服务器是管理web应用程序的,不是浏览器。我们抓取图片或者视频,是要拿到图片和视频的jpg,bmp,mp4等格式文件,我们可以封装成jar包。这样我们就可以不需要手动解析js和css文件,解析出来的代码有很多,很容易出问题,并且直接写在web容器里。
  当然,用原生方法解析java程序是不可能的,因为原生程序太复杂,需要处理的对象有上百个。所以,我们用的是webkit的signalhook技术,用webkit的signal去抓取。通过两个函数来控制hook来实现,1是javavoidmodels()voidredirect(protocol,request)2是javavoidapply(protocol,request)上面的函数都会被signalhook处理掉,那么在程序里就不能调用java的全局变量。
  当apply对方法被调用的时候,就会出错,但是我们还能请求到图片或者视频,也不是没有办法,有两种方法。1,原生代码针对请求服务器方法,可以通过java.util.pairs.filelinksfor(xxx,xxx,xxx)来实现解析图片或者视频。有一个比较明显的缺点就是返回的是xml格式。2,可以通过java.util.viewfilesy。

C#(csharp)用CefSharp开发实现一个浏览器,抓取网站任意资源

网站优化优采云 发表了文章 • 0 个评论 • 483 次浏览 • 2022-07-09 05:42 • 来自相关话题

  C#(csharp)用CefSharp开发实现一个浏览器,抓取网站任意资源
  前言:
  不少网站会保护自己,防止别人下载图片。
  因此下载器,先后改了好几次,不断技术升级。
  早期 用WebClient 下载 HTML 分析 URL 下载。
  后来 为了下载 手机网站的图片,用上了 User-Agent 特性,模拟手机浏览器。
  之前遇到一个复杂些的 网站M ,页面用 JS 加载生成。无法直接获得HTML。
  用Chrome一番分析后,发现其图片地址 有固定格式。文件名是 3位数数字,从1开始累加。
  因此只要在浏览器 取到第一个图,后面的图片URL 生成下 也得到了。批量下载搞定。
  前段时间 网站M 升级。图片展示使用 HTML5 canavs 显示,而且 图片路径 也加随机字符。难以生成了。
  对于Chrome来说依然没有遮挡效果。依然可以取到 URL,可以手工保存图片, 然而 无法批量下载了。
  问题来了:
  无法取到 HTML分析出 图片路径,而且路径名称随机。那么如何批量下载图片?
  既然 图片展示到我们面前,数据必然也已经到了 我们这边,就看我们这么取得了。
  解决办法:
  
  WebClient不行,于是想到了 Winform 的 WebBrowser 实现浏览器,能显示必然能取到数据。
  WebBrowser对于大部分网站还是可以的。然而对于 HTML5的 或者 新特性的 网站就有些 不方便了。有时候不能正常显示网站。例如,网站M.
  它依赖 操作系统的 IE浏览器,而且默认是系统里老版本的 IE。可能是 IE7 吧。
  一番资料查找 发现CefSharp。这个是Chrome 的另一个开源项目, C# 调用。可以在Winform,Wpf 等中 嵌入浏览器。
  CefSharp在网上有一些资料,不多。为了弄明白CefSharp里 取得 图片URL,图片数据。花了一番功夫,查资料,看源码。
  倾情大放送,来一大波代码:
  开发环境:VS2015 framework 4.5.2 x86模式 CefSharp 63.0.30
  winform:
  
  有了上面的代码,便可以获取到 目标网站的 任意资源了。
  END
  ●
  ●
  ●
  ●
  ●
  ●
  扫描二维码
  获取更多精彩
  关注服务号 查看全部

  C#(csharp)用CefSharp开发实现一个浏览器,抓取网站任意资源
  前言:
  不少网站会保护自己,防止别人下载图片。
  因此下载器,先后改了好几次,不断技术升级。
  早期 用WebClient 下载 HTML 分析 URL 下载。
  后来 为了下载 手机网站的图片,用上了 User-Agent 特性,模拟手机浏览器。
  之前遇到一个复杂些的 网站M ,页面用 JS 加载生成。无法直接获得HTML。
  用Chrome一番分析后,发现其图片地址 有固定格式。文件名是 3位数数字,从1开始累加。
  因此只要在浏览器 取到第一个图,后面的图片URL 生成下 也得到了。批量下载搞定。
  前段时间 网站M 升级。图片展示使用 HTML5 canavs 显示,而且 图片路径 也加随机字符。难以生成了。
  对于Chrome来说依然没有遮挡效果。依然可以取到 URL,可以手工保存图片, 然而 无法批量下载了。
  问题来了:
  无法取到 HTML分析出 图片路径,而且路径名称随机。那么如何批量下载图片?
  既然 图片展示到我们面前,数据必然也已经到了 我们这边,就看我们这么取得了。
  解决办法:
  
  WebClient不行,于是想到了 Winform 的 WebBrowser 实现浏览器,能显示必然能取到数据。
  WebBrowser对于大部分网站还是可以的。然而对于 HTML5的 或者 新特性的 网站就有些 不方便了。有时候不能正常显示网站。例如,网站M.
  它依赖 操作系统的 IE浏览器,而且默认是系统里老版本的 IE。可能是 IE7 吧。
  一番资料查找 发现CefSharp。这个是Chrome 的另一个开源项目, C# 调用。可以在Winform,Wpf 等中 嵌入浏览器。
  CefSharp在网上有一些资料,不多。为了弄明白CefSharp里 取得 图片URL,图片数据。花了一番功夫,查资料,看源码。
  倾情大放送,来一大波代码:
  开发环境:VS2015 framework 4.5.2 x86模式 CefSharp 63.0.30
  winform:
  
  有了上面的代码,便可以获取到 目标网站的 任意资源了。
  END
  ●
  ●
  ●
  ●
  ●
  ●
  扫描二维码
  获取更多精彩
  关注服务号

浏览器插件提取方法【方法篇】

网站优化优采云 发表了文章 • 0 个评论 • 1037 次浏览 • 2022-07-08 09:38 • 来自相关话题

  浏览器插件提取方法【方法篇】
  Hello,大家好,今天给大家带来的是浏览器插件提取的方法。
  之前给大家分享过一个的插件,可以到Windows商店直接下载,但是有小伙伴在问,如何把下载好的插件提取出来?
  今天就跟大家一起来探讨方法
  需要软件(不了解的小伙伴可直接点击跳转文章)进行配合,主要是为了快速找到目录位置。
  那么我们现在开始,以AdGuard 广告拦截器插件为例
  一、打开浏览器拓展
  
  找到插件的版本号,将其数值复制下来。
  二、打开everything
  将版本号输入进去,进行查找。右击复制完整路径和文件名。
  这里因为哆啦的电脑上有两个浏览器,并且两个浏览器都安装了此插件,所以会有两个目录。
  三、打包扩展
  
  点击打包扩展,然后在扩展根目录处输入刚才复制的完整路径和文件名,点击打包扩展就OK了。私钥文件可以不填。
  打包完之后,在everything输入插件的版本号,就可以找到一个后缀为”.crx”的文件,这个就是提取出来的插件了。
  关注、点赞、在看是对哆啦最大的肯定
  后续会带来更多好玩的软件、网站、黑科技 查看全部

  浏览器插件提取方法【方法篇】
  Hello,大家好,今天给大家带来的是浏览器插件提取的方法。
  之前给大家分享过一个的插件,可以到Windows商店直接下载,但是有小伙伴在问,如何把下载好的插件提取出来?
  今天就跟大家一起来探讨方法
  需要软件(不了解的小伙伴可直接点击跳转文章)进行配合,主要是为了快速找到目录位置。
  那么我们现在开始,以AdGuard 广告拦截器插件为例
  一、打开浏览器拓展
  
  找到插件的版本号,将其数值复制下来。
  二、打开everything
  将版本号输入进去,进行查找。右击复制完整路径和文件名。
  这里因为哆啦的电脑上有两个浏览器,并且两个浏览器都安装了此插件,所以会有两个目录。
  三、打包扩展
  
  点击打包扩展,然后在扩展根目录处输入刚才复制的完整路径和文件名,点击打包扩展就OK了。私钥文件可以不填。
  打包完之后,在everything输入插件的版本号,就可以找到一个后缀为”.crx”的文件,这个就是提取出来的插件了。
  关注、点赞、在看是对哆啦最大的肯定
  后续会带来更多好玩的软件、网站、黑科技

深入浏览器原理系列(3)浏览器页面也是有生命周期的

网站优化优采云 发表了文章 • 0 个评论 • 90 次浏览 • 2022-07-02 22:16 • 来自相关话题

  深入浏览器原理系列(3)浏览器页面也是有生命周期的
  Android、iOS 和最新的 Windows 系统可以随时自主地停止后台进程,及时释放系统资源。也就是说,网页可能随时被系统丢弃掉。Page Visibility API 只在网页对用户不可见时触发,至于网页会不会被系统丢弃掉,它就无能为力了。
  为了解决这个问题,W3C 新制定了一个 Page Lifecycle API,统一了网页从诞生到卸载的行为模式,并且定义了新的事件,允许开发者响应网页状态的各种转换。
  有了这个 API,开发者就可以预测网页下一步的状态,从而进行各种针对性的处理。Chrome 68 支持这个 API,对于老式浏览器可以使用谷歌开发的兼容库 PageLifecycle.js。
  一、生命周期阶段
  网页的生命周期分成六个阶段,每个时刻只可能处于其中一个阶段。
  (1)Active 阶段
  在 Active 阶段,网页处于可见状态,且拥有输入焦点。
  (2)Passive 阶段
  在 Passive 阶段,网页可见,但没有输入焦点,无法接受输入。UI 更新(比如动画)仍然在执行。该阶段只可能发生在桌面同时有多个窗口的情况。
  (3)Hidden 阶段
  在 Hidden 阶段,用户的桌面被其他窗口占据,网页不可见,但尚未冻结。UI 更新不再执行。
  (4)Terminated 阶段
  在 Terminated 阶段,由于用户主动关闭窗口,或者在同一个窗口前往其他页面,导致当前页面开始被浏览器卸载并从内存中清除。注意,这个阶段总是在 Hidden 阶段之后发生,也就是说,用户主动离开当前页面,总是先进入 Hidden 阶段,再进入 Terminated 阶段。
  这个阶段会导致网页卸载,任何新任务都不会在这个阶段启动,并且如果运行时间太长,正在进行的任务可能会被终止。
  (5)Frozen 阶段
  如果网页处于 Hidden 阶段的时间过久,用户又不关闭网页,浏览器就有可能冻结网页,使其进入 Frozen 阶段。不过,也有可能,处于可见状态的页面长时间没有操作,也会进入 Frozen 阶段。
  这个阶段的特征是,网页不会再被分配 CPU 计算资源。定时器、回调函数、网络请求、DOM 操作都不会执行,不过正在运行的任务会执行完。浏览器可能会允许 Frozen 阶段的页面,周期性复苏一小段时间,短暂变回 Hidden 状态,允许一小部分任务执行。
  (6)Discarded 阶段
  如果网页长时间处于 Frozen 阶段,用户又不唤醒页面,那么就会进入 Discarded 阶段,即浏览器自动卸载网页,清除该网页的内存占用。不过,Passive 阶段的网页如果长时间没有互动,也可能直接进入 Discarded 阶段。
  这一般是在用户没有介入的情况下,由系统强制执行。任何类型的新任务或 JavaScript 代码,都不能在此阶段执行,因为这时通常处在资源限制的状况下。
  网页被浏览器自动 Discarded 以后,它的 Tab 窗口还是在的。如果用户重新访问这个 Tab 页,浏览器将会重新向服务器发出请求,再一次重新加载网页,回到 Active 阶段。
  二、常见场景
  
  以下是几个常见场景的网页生命周期变化。
  (1)用户打开网页后,又切换到其他 App,但只过了一会又回到网页。
  网页由 Active 变成 Hidden,又变回 Active。
  (2)用户打开网页后,又切换到其他 App,并且长时候使用后者,导致系统自动丢弃网页。
  网页由 Active 变成 Hidden,再变成 Frozen,最后 Discarded。
  (3)用户打开网页后,又切换到其他 App,然后从任务管理器里面将浏览器进程清除。
  网页由 Active 变成 Hidden,然后 Terminated。
  (4)系统丢弃了某个 Tab 里面的页面后,用户重新打开这个 Tab。
  网页由 Discarded 变成 Active。
  三、事件
  生命周期的各个阶段都有自己的事件,以供开发者指定监听函数。这些事件里面,只有两个是新定义的(freeze事件和resume事件),其它都是现有的。
  注意,网页的生命周期事件是在所有帧(frame)触发,不管是底层的帧,还是内嵌的帧。也就是说,内嵌的网页跟顶层网页一样,都会同时监听到下面的事件。
  3.1 focus 事件
  focus事件在页面获得输入焦点时触发,比如网页从 Passive 阶段变为 Active 阶段。
  3.2 blur 事件
  blur事件在页面失去输入焦点时触发,比如网页从 Active 阶段变为 Passive 阶段。
  3.3 visibilitychange 事件
  visibilitychange事件在网页可见状态发生变化时触发,一般发生在以下几种场景。
  可以通过document.onvisibilitychange属性指定这个事件的回调函数。
  3.4 freeze 事件
  freeze事件在网页进入 Frozen 阶段时触发。
  可以通过document.onfreeze属性指定在进入 Frozen 阶段时调用的回调函数。
  function handleFreeze(e) {<br /> // Handle transition to FROZEN<br />}<br />document.addEventListener('freeze', handleFreeze);<br /><br /># 或者<br />document.onfreeze = function() { ... }
  这个事件的监听函数,最长只能运行500毫秒。并且只能复用已经打开的网络连接,不能发起新的网络请求。
  
  注意,从 Frozen 阶段进入 Discarded 阶段,不会触发任何事件,无法指定回调函数,只能在进入 Frozen 阶段时指定回调函数。
  3.5 resume 事件
  resume事件在网页离开 Frozen 阶段,变为 Active / Passive / Hidden 阶段时触发。
  document.onresume属性指的是页面离开 Frozen 阶段、进入可用状态时调用的回调函数。
  function handleResume(e) {<br /> // handle state transition FROZEN -> ACTIVE<br />}<br />document.addEventListener("resume", handleResume);<br /><br /># 或者<br />document.onresume = function() { ... }
  3.6 pageshow 事件
  pageshow事件在用户加载网页时触发。这时,有可能是全新的页面加载,也可能是从缓存中获取的页面。如果是从缓存中获取,则该事件对象的event.persisted属性为true,否则为false。
  这个事件的名字有点误导,它跟页面的可见性其实毫无关系,只跟浏览器的 History 记录的变化有关。
  3.7 pagehide 事件
  pagehide事件在用户离开当前网页、进入另一个网页时触发。它的前提是浏览器的 History 记录必须发生变化,跟网页是否可见无关。
  如果浏览器能够将当前页面添加到缓存以供稍后重用,则事件对象的event.persisted属性为true。如果为true。如果页面添加到了缓存,则页面进入 Frozen 状态,否则进入 Terminatied 状态。
  3.8 beforeunload 事件
  beforeunload事件在窗口或文档即将卸载时触发。该事件发生时,文档仍然可见,此时卸载仍可取消。经过这个事件,网页进入 Terminated 状态。
  3.9 unload 事件
  unload事件在页面正在卸载时触发。经过这个事件,网页进入 Terminated 状态。
  四、获取当前阶段
  如果网页处于 Active、Passive 或 Hidden 阶段,可以通过下面的代码,获得网页当前的状态。
  const getState = () => {<br /> if (document.visibilityState === 'hidden') {<br /> return 'hidden';<br /> }<br /> if (document.hasFocus()) {<br /> return 'active';<br /> }<br /> return 'passive';<br />};
  如果网页处于 Frozen 和 Terminated 状态,由于定时器代码不会执行,只能通过事件监听判断状态。进入 Frozen 阶段,可以监听freeze事件;进入 Terminated 阶段,可以监听pagehide事件。
  五、document.wasDiscarded
  如果某个选项卡处于 Frozen 阶段,就随时有可能被系统丢弃,进入 Discarded 阶段。如果后来用户再次点击该选项卡,浏览器会重新加载该页面。
  这时,开发者可以通过判断document.wasDiscarded属性,了解先前的网页是否被丢弃了。
  if (document.wasDiscarded) {<br /> // 该网页已经不是原来的状态了,曾经被浏览器丢弃过<br /> // 恢复以前的状态<br /> getPersistedState(self.discardedClientId);<br />}
  同时,window对象上会新增window.clientId和window.discardedClientId两个属性,用来恢复丢弃前的状态。
  六、参考链接 查看全部

  深入浏览器原理系列(3)浏览器页面也是有生命周期的
  Android、iOS 和最新的 Windows 系统可以随时自主地停止后台进程,及时释放系统资源。也就是说,网页可能随时被系统丢弃掉。Page Visibility API 只在网页对用户不可见时触发,至于网页会不会被系统丢弃掉,它就无能为力了。
  为了解决这个问题,W3C 新制定了一个 Page Lifecycle API,统一了网页从诞生到卸载的行为模式,并且定义了新的事件,允许开发者响应网页状态的各种转换。
  有了这个 API,开发者就可以预测网页下一步的状态,从而进行各种针对性的处理。Chrome 68 支持这个 API,对于老式浏览器可以使用谷歌开发的兼容库 PageLifecycle.js。
  一、生命周期阶段
  网页的生命周期分成六个阶段,每个时刻只可能处于其中一个阶段。
  (1)Active 阶段
  在 Active 阶段,网页处于可见状态,且拥有输入焦点。
  (2)Passive 阶段
  在 Passive 阶段,网页可见,但没有输入焦点,无法接受输入。UI 更新(比如动画)仍然在执行。该阶段只可能发生在桌面同时有多个窗口的情况。
  (3)Hidden 阶段
  在 Hidden 阶段,用户的桌面被其他窗口占据,网页不可见,但尚未冻结。UI 更新不再执行。
  (4)Terminated 阶段
  在 Terminated 阶段,由于用户主动关闭窗口,或者在同一个窗口前往其他页面,导致当前页面开始被浏览器卸载并从内存中清除。注意,这个阶段总是在 Hidden 阶段之后发生,也就是说,用户主动离开当前页面,总是先进入 Hidden 阶段,再进入 Terminated 阶段。
  这个阶段会导致网页卸载,任何新任务都不会在这个阶段启动,并且如果运行时间太长,正在进行的任务可能会被终止。
  (5)Frozen 阶段
  如果网页处于 Hidden 阶段的时间过久,用户又不关闭网页,浏览器就有可能冻结网页,使其进入 Frozen 阶段。不过,也有可能,处于可见状态的页面长时间没有操作,也会进入 Frozen 阶段。
  这个阶段的特征是,网页不会再被分配 CPU 计算资源。定时器、回调函数、网络请求、DOM 操作都不会执行,不过正在运行的任务会执行完。浏览器可能会允许 Frozen 阶段的页面,周期性复苏一小段时间,短暂变回 Hidden 状态,允许一小部分任务执行。
  (6)Discarded 阶段
  如果网页长时间处于 Frozen 阶段,用户又不唤醒页面,那么就会进入 Discarded 阶段,即浏览器自动卸载网页,清除该网页的内存占用。不过,Passive 阶段的网页如果长时间没有互动,也可能直接进入 Discarded 阶段。
  这一般是在用户没有介入的情况下,由系统强制执行。任何类型的新任务或 JavaScript 代码,都不能在此阶段执行,因为这时通常处在资源限制的状况下。
  网页被浏览器自动 Discarded 以后,它的 Tab 窗口还是在的。如果用户重新访问这个 Tab 页,浏览器将会重新向服务器发出请求,再一次重新加载网页,回到 Active 阶段。
  二、常见场景
  
  以下是几个常见场景的网页生命周期变化。
  (1)用户打开网页后,又切换到其他 App,但只过了一会又回到网页。
  网页由 Active 变成 Hidden,又变回 Active。
  (2)用户打开网页后,又切换到其他 App,并且长时候使用后者,导致系统自动丢弃网页。
  网页由 Active 变成 Hidden,再变成 Frozen,最后 Discarded。
  (3)用户打开网页后,又切换到其他 App,然后从任务管理器里面将浏览器进程清除。
  网页由 Active 变成 Hidden,然后 Terminated。
  (4)系统丢弃了某个 Tab 里面的页面后,用户重新打开这个 Tab。
  网页由 Discarded 变成 Active。
  三、事件
  生命周期的各个阶段都有自己的事件,以供开发者指定监听函数。这些事件里面,只有两个是新定义的(freeze事件和resume事件),其它都是现有的。
  注意,网页的生命周期事件是在所有帧(frame)触发,不管是底层的帧,还是内嵌的帧。也就是说,内嵌的网页跟顶层网页一样,都会同时监听到下面的事件。
  3.1 focus 事件
  focus事件在页面获得输入焦点时触发,比如网页从 Passive 阶段变为 Active 阶段。
  3.2 blur 事件
  blur事件在页面失去输入焦点时触发,比如网页从 Active 阶段变为 Passive 阶段。
  3.3 visibilitychange 事件
  visibilitychange事件在网页可见状态发生变化时触发,一般发生在以下几种场景。
  可以通过document.onvisibilitychange属性指定这个事件的回调函数。
  3.4 freeze 事件
  freeze事件在网页进入 Frozen 阶段时触发。
  可以通过document.onfreeze属性指定在进入 Frozen 阶段时调用的回调函数。
  function handleFreeze(e) {<br /> // Handle transition to FROZEN<br />}<br />document.addEventListener('freeze', handleFreeze);<br /><br /># 或者<br />document.onfreeze = function() { ... }
  这个事件的监听函数,最长只能运行500毫秒。并且只能复用已经打开的网络连接,不能发起新的网络请求。
  
  注意,从 Frozen 阶段进入 Discarded 阶段,不会触发任何事件,无法指定回调函数,只能在进入 Frozen 阶段时指定回调函数。
  3.5 resume 事件
  resume事件在网页离开 Frozen 阶段,变为 Active / Passive / Hidden 阶段时触发。
  document.onresume属性指的是页面离开 Frozen 阶段、进入可用状态时调用的回调函数。
  function handleResume(e) {<br /> // handle state transition FROZEN -> ACTIVE<br />}<br />document.addEventListener("resume", handleResume);<br /><br /># 或者<br />document.onresume = function() { ... }
  3.6 pageshow 事件
  pageshow事件在用户加载网页时触发。这时,有可能是全新的页面加载,也可能是从缓存中获取的页面。如果是从缓存中获取,则该事件对象的event.persisted属性为true,否则为false。
  这个事件的名字有点误导,它跟页面的可见性其实毫无关系,只跟浏览器的 History 记录的变化有关。
  3.7 pagehide 事件
  pagehide事件在用户离开当前网页、进入另一个网页时触发。它的前提是浏览器的 History 记录必须发生变化,跟网页是否可见无关。
  如果浏览器能够将当前页面添加到缓存以供稍后重用,则事件对象的event.persisted属性为true。如果为true。如果页面添加到了缓存,则页面进入 Frozen 状态,否则进入 Terminatied 状态。
  3.8 beforeunload 事件
  beforeunload事件在窗口或文档即将卸载时触发。该事件发生时,文档仍然可见,此时卸载仍可取消。经过这个事件,网页进入 Terminated 状态。
  3.9 unload 事件
  unload事件在页面正在卸载时触发。经过这个事件,网页进入 Terminated 状态。
  四、获取当前阶段
  如果网页处于 Active、Passive 或 Hidden 阶段,可以通过下面的代码,获得网页当前的状态。
  const getState = () => {<br /> if (document.visibilityState === 'hidden') {<br /> return 'hidden';<br /> }<br /> if (document.hasFocus()) {<br /> return 'active';<br /> }<br /> return 'passive';<br />};
  如果网页处于 Frozen 和 Terminated 状态,由于定时器代码不会执行,只能通过事件监听判断状态。进入 Frozen 阶段,可以监听freeze事件;进入 Terminated 阶段,可以监听pagehide事件。
  五、document.wasDiscarded
  如果某个选项卡处于 Frozen 阶段,就随时有可能被系统丢弃,进入 Discarded 阶段。如果后来用户再次点击该选项卡,浏览器会重新加载该页面。
  这时,开发者可以通过判断document.wasDiscarded属性,了解先前的网页是否被丢弃了。
  if (document.wasDiscarded) {<br /> // 该网页已经不是原来的状态了,曾经被浏览器丢弃过<br /> // 恢复以前的状态<br /> getPersistedState(self.discardedClientId);<br />}
  同时,window对象上会新增window.clientId和window.discardedClientId两个属性,用来恢复丢弃前的状态。
  六、参考链接

手机浏览器抓取网页在重新渲染还是很不错?

网站优化优采云 发表了文章 • 0 个评论 • 88 次浏览 • 2022-06-30 22:00 • 来自相关话题

  手机浏览器抓取网页在重新渲染还是很不错?
  浏览器抓取网页在重新渲染还是很不错,比如网页上写了个点击xxx可以购买,但是我电脑上没有这个,现在有这么一种方法就是先截图,然后再网上淘一个假的该网页的截图,或者直接做一个验证码,这样抓取网页就可以转化为图片。
  action=open('test.php','wb')body=action.get('user-agent')
  还有php脚本有一个直接自动抓取ajaxhttp协议页面的就是用一个url解析器转换后再转换成html所以速度不快
  
  通过ajax加载其他页面
  通过ajax加载图片
  高配手机可能可以借助app抓包工具弄出来;低配可能只能手动了。
  
  手机浏览器也能抓包,
  这个就像你开车游玩,有一种叫导航的东西,我不知道你是否能抓包弄个导航软件出来,
  chrome或者firefox中有crossjson抓包工具,可以抓。不过,其实各大浏览器都自带这个功能,所以还是建议用chrome或者firefox抓,很多网站的js都绑定在浏览器里面的。而且chrome的抓包也不会出什么问题,我通常通过ff就可以拿到js代码。ps:同意@nezhangcheng的说法,ajax的问题,一般抓包是抓不到的,可以用纯javascript抓包,不过这样速度就会慢一些。
  要抓包的是http协议页面,所以可以通过控制webpack在一定程度上可以提高效率。其他如果不是特殊需求,使用传统的xmlhttprequest就可以实现(几乎没有抓包的必要)。而我相信很多抓包工具都不支持xmlhttprequest的ajax请求,这方面可以再研究一下。(xmlhttprequest的请求速度也不快)。 查看全部

  手机浏览器抓取网页在重新渲染还是很不错?
  浏览器抓取网页在重新渲染还是很不错,比如网页上写了个点击xxx可以购买,但是我电脑上没有这个,现在有这么一种方法就是先截图,然后再网上淘一个假的该网页的截图,或者直接做一个验证码,这样抓取网页就可以转化为图片。
  action=open('test.php','wb')body=action.get('user-agent')
  还有php脚本有一个直接自动抓取ajaxhttp协议页面的就是用一个url解析器转换后再转换成html所以速度不快
  
  通过ajax加载其他页面
  通过ajax加载图片
  高配手机可能可以借助app抓包工具弄出来;低配可能只能手动了。
  
  手机浏览器也能抓包,
  这个就像你开车游玩,有一种叫导航的东西,我不知道你是否能抓包弄个导航软件出来,
  chrome或者firefox中有crossjson抓包工具,可以抓。不过,其实各大浏览器都自带这个功能,所以还是建议用chrome或者firefox抓,很多网站的js都绑定在浏览器里面的。而且chrome的抓包也不会出什么问题,我通常通过ff就可以拿到js代码。ps:同意@nezhangcheng的说法,ajax的问题,一般抓包是抓不到的,可以用纯javascript抓包,不过这样速度就会慢一些。
  要抓包的是http协议页面,所以可以通过控制webpack在一定程度上可以提高效率。其他如果不是特殊需求,使用传统的xmlhttprequest就可以实现(几乎没有抓包的必要)。而我相信很多抓包工具都不支持xmlhttprequest的ajax请求,这方面可以再研究一下。(xmlhttprequest的请求速度也不快)。

钓鱼网站可利用浏览器“自动填充”功能获取用户信息

网站优化优采云 发表了文章 • 0 个评论 • 256 次浏览 • 2022-06-26 14:13 • 来自相关话题

  钓鱼网站可利用浏览器“自动填充”功能获取用户信息
  01/浏览器自动填充功能
  昨天看到了一篇关于Chrome自动填充安全相关的文章。
  文中提到:“自动填充是个非常方便的浏览器特性,不过该特性在 Chrome 上会存在一定的信息泄露的风险。Chrome 最近才修复了某个久负盛名漏洞。简单而言,黑客能够利用自动填充窃取你并不想提交给该网站的信息”。
  效果如下图:
  并提供了一段js来演示漏洞:
  仅测试这段js,发现并不能复现此漏洞,但是这个思路引起了我的思考。
  02/ 浏览器新特性--autocomplete
  再次研究发现,html中要实现浏览器中的表单自动填充主要依靠于autocomplete属性。
  起初autocomplete属性只支持on或off。比如下面代码:
  上面代码开启了整个表单的autocomplete却对email关闭了autocomplete,我们在点击非email的其他字段即可打开自动填充功能:
  但在email中不能展开自动填充功能:
  后来HTML5标准加入了对autocomplete的支持,并且给autocomplete加入了更多的标示符,以保证让浏览器准确的知道哪些信息对应着表单里的哪些字段。
  比如如下代码:
  在autocomplete属性中写入了语义化的字符,比如name、street-address等。
  通过这些标识,浏览器即可准确的把相应的信息填入到相应的表单中。
  03/钓鱼网站可能会这么用
  通过如上demo我们可以发现,当我们选择自动填充以后,chrome不仅会把当前表单字段填充到input中,也会把其他表单字段填充到input中。
  那么如果写一些type为hidden的input标签,并且加上autocomplete属性,chrome是否会自动补上带有hidden属性的input标签的信息呢。
  我们使用如下代码:
  将第一个姓名字段设置为hidden,然后使用自动填充,并且提交表单,查看请求包:
  
  发现type属性为hidden的表单并没有获取到,但其他非hidden的信息都拿到了。
  既然type设置成hidden浏览器不会发送数据,隐藏浏览器元素还有很多方法,比如:
  在表单外层放一个div,让整个div,display:none。
  然而也是不行的:
  看来chrome已经在这里做了足够防护。
  其实在文章最初提供的js代码也是使用这样的方式来进行攻击的。
  现在已经被修复了。那么还有别的办法吗?
  04/可利用的方式
  让浏览器认识且没有做防护,并且让用户看不见这个表单的方法有很多,比如如下方法:
  效果如下:
  bingo!!
  这种方式浏览器并没有防护,其实让用户看不到表单的方式还有很多,还比如设置成透明等等……
  由此想到,如果钓鱼网站利用了这个功能,在用户不知情的情况下,拿到用户浏览器存储的其他信息,会造成很可怕的后果。
  在线测试地址:
  05/如何防护
  既然这个功能是浏览器的功能,在浏览器还未完全将不可见的表单字段设置为不可填充之前,我们只好通过设置,来避免使用这个功能。
  通过打开chrome浏览器的设置--高级设置,然后点掉下图中的复选框,关闭自动填充功能。
  06/参考资料
  HTML标准 - 表单自动填充
  SegmentFault 查看全部

  钓鱼网站可利用浏览器“自动填充”功能获取用户信息
  01/浏览器自动填充功能
  昨天看到了一篇关于Chrome自动填充安全相关的文章。
  文中提到:“自动填充是个非常方便的浏览器特性,不过该特性在 Chrome 上会存在一定的信息泄露的风险。Chrome 最近才修复了某个久负盛名漏洞。简单而言,黑客能够利用自动填充窃取你并不想提交给该网站的信息”。
  效果如下图:
  并提供了一段js来演示漏洞:
  仅测试这段js,发现并不能复现此漏洞,但是这个思路引起了我的思考。
  02/ 浏览器新特性--autocomplete
  再次研究发现,html中要实现浏览器中的表单自动填充主要依靠于autocomplete属性。
  起初autocomplete属性只支持on或off。比如下面代码:
  上面代码开启了整个表单的autocomplete却对email关闭了autocomplete,我们在点击非email的其他字段即可打开自动填充功能:
  但在email中不能展开自动填充功能:
  后来HTML5标准加入了对autocomplete的支持,并且给autocomplete加入了更多的标示符,以保证让浏览器准确的知道哪些信息对应着表单里的哪些字段。
  比如如下代码:
  在autocomplete属性中写入了语义化的字符,比如name、street-address等。
  通过这些标识,浏览器即可准确的把相应的信息填入到相应的表单中。
  03/钓鱼网站可能会这么用
  通过如上demo我们可以发现,当我们选择自动填充以后,chrome不仅会把当前表单字段填充到input中,也会把其他表单字段填充到input中。
  那么如果写一些type为hidden的input标签,并且加上autocomplete属性,chrome是否会自动补上带有hidden属性的input标签的信息呢。
  我们使用如下代码:
  将第一个姓名字段设置为hidden,然后使用自动填充,并且提交表单,查看请求包:
  
  发现type属性为hidden的表单并没有获取到,但其他非hidden的信息都拿到了。
  既然type设置成hidden浏览器不会发送数据,隐藏浏览器元素还有很多方法,比如:
  在表单外层放一个div,让整个div,display:none。
  然而也是不行的:
  看来chrome已经在这里做了足够防护。
  其实在文章最初提供的js代码也是使用这样的方式来进行攻击的。
  现在已经被修复了。那么还有别的办法吗?
  04/可利用的方式
  让浏览器认识且没有做防护,并且让用户看不见这个表单的方法有很多,比如如下方法:
  效果如下:
  bingo!!
  这种方式浏览器并没有防护,其实让用户看不到表单的方式还有很多,还比如设置成透明等等……
  由此想到,如果钓鱼网站利用了这个功能,在用户不知情的情况下,拿到用户浏览器存储的其他信息,会造成很可怕的后果。
  在线测试地址:
  05/如何防护
  既然这个功能是浏览器的功能,在浏览器还未完全将不可见的表单字段设置为不可填充之前,我们只好通过设置,来避免使用这个功能。
  通过打开chrome浏览器的设置--高级设置,然后点掉下图中的复选框,关闭自动填充功能。
  06/参考资料
  HTML标准 - 表单自动填充
  SegmentFault

Linux奇技淫巧:一款特别轻量级的网页浏览器

网站优化优采云 发表了文章 • 0 个评论 • 535 次浏览 • 2022-06-20 00:29 • 来自相关话题

  Linux奇技淫巧:一款特别轻量级的网页浏览器
  
  
  Dillo,一款小巧非常轻量级的网络浏览器。(源代码约420 KB,二进制程序约350KB。),遵循GPL协议。用C语言编写,使用了GTK+ toolkit,该浏览器特别适合运行于老计算机,以及嵌入系统。
  Dillo目前还不支持CSS、JavaScript等,对框架的支持也很有限。(主页地址:,目前已经停止更新。)Dillo特别适合安装在Raspbian系统中,在树梅派上,Dillo加载网页运行速度很快快。
  由于GTK+2 的功能变更很大,不符合Dillo "短小精悍"的需求,所以 Dillo转向以FLTK2作graphic toolkit。目前porting到FLTK2的工作已经近乎完成一些UNIX/Linux发行版本,包括Debian、RedHat、NetBSD等,有Dillo的安装包,一些小型的Linux系统,包括Damn Small Linux、Feather Linux,将Dillo作为主力浏览器。Dillo的特点是轻巧、快速。一般安装完dillo之后是不能正确显示中文的,所有中文都显示为口样方块(如下图)。没事,修改一下配置文件中的字体即可。
  1、安装dillo和文泉驿中文字体sudo apt-get install dillo
  2、安装中文字体(很重要)sudo apt-get install ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy
  3、修改Dillo配置文件,修改字体部分。(重要)先复制到主目录 cp /etc/dillo/dillorc $HOME/.dillo/
  
  用编辑器打开$HOME/.dillo/dillorc,在最后增加以下配置内容:font_serif="Serif"
  font_sans_serif="Sans"
  font_cursive="Sans"
  font_fantasy="Sans"
  font_monospace="Sans Mono"
  
  到此就OK,Dillo可正常显示中文,效果图见本文最上面。那么你想尝试下这款小巧的网页浏览器呢?
  
  -------------------------
  知乎:良许LinuxB站:程序员良许抖音:良许微博:良许Linux
  <p style="margin: 0.5em 8px;max-width: 100%;min-height: 1em;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);white-space: pre-wrap;border-color: rgb(160, 160, 160);border-top-width: 1px;color: transparent;border-top-style: dashed;text-align: center;line-height: 1.75em;box-sizing: border-box !important;word-wrap: break-word !important;"><br style="max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />
  打卡送书活动
  活动介绍:打卡送书活动暂停通知
  赞助商:清华大学出版社
  本书采用丰富的图例来阐述基本概念,并以简洁清晰的语言来诠释重要的理论和算法,同时配合完整的范例程序代码,使读者可以通过“实例 实践”来熟悉数据结构。
  <br style="max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  推荐阅读:<br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  12306崩了,90%的人都用过这三款抢票工具<br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  30 张图带你彻底理解红黑树<br />
  8种常见SQL错误用法
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「1024」,即可免费获取!!
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" /></p> 查看全部

  Linux奇技淫巧:一款特别轻量级的网页浏览器
  
  
  Dillo,一款小巧非常轻量级的网络浏览器。(源代码约420 KB,二进制程序约350KB。),遵循GPL协议。用C语言编写,使用了GTK+ toolkit,该浏览器特别适合运行于老计算机,以及嵌入系统。
  Dillo目前还不支持CSS、JavaScript等,对框架的支持也很有限。(主页地址:,目前已经停止更新。)Dillo特别适合安装在Raspbian系统中,在树梅派上,Dillo加载网页运行速度很快快。
  由于GTK+2 的功能变更很大,不符合Dillo "短小精悍"的需求,所以 Dillo转向以FLTK2作graphic toolkit。目前porting到FLTK2的工作已经近乎完成一些UNIX/Linux发行版本,包括Debian、RedHat、NetBSD等,有Dillo的安装包,一些小型的Linux系统,包括Damn Small Linux、Feather Linux,将Dillo作为主力浏览器。Dillo的特点是轻巧、快速。一般安装完dillo之后是不能正确显示中文的,所有中文都显示为口样方块(如下图)。没事,修改一下配置文件中的字体即可。
  1、安装dillo和文泉驿中文字体sudo apt-get install dillo
  2、安装中文字体(很重要)sudo apt-get install ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy
  3、修改Dillo配置文件,修改字体部分。(重要)先复制到主目录 cp /etc/dillo/dillorc $HOME/.dillo/
  
  用编辑器打开$HOME/.dillo/dillorc,在最后增加以下配置内容:font_serif="Serif"
  font_sans_serif="Sans"
  font_cursive="Sans"
  font_fantasy="Sans"
  font_monospace="Sans Mono"
  
  到此就OK,Dillo可正常显示中文,效果图见本文最上面。那么你想尝试下这款小巧的网页浏览器呢?
  
  -------------------------
  知乎:良许LinuxB站:程序员良许抖音:良许微博:良许Linux
  <p style="margin: 0.5em 8px;max-width: 100%;min-height: 1em;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);white-space: pre-wrap;border-color: rgb(160, 160, 160);border-top-width: 1px;color: transparent;border-top-style: dashed;text-align: center;line-height: 1.75em;box-sizing: border-box !important;word-wrap: break-word !important;"><br style="max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />
  打卡送书活动
  活动介绍:打卡送书活动暂停通知
  赞助商:清华大学出版社
  本书采用丰富的图例来阐述基本概念,并以简洁清晰的语言来诠释重要的理论和算法,同时配合完整的范例程序代码,使读者可以通过“实例 实践”来熟悉数据结构。
  <br style="max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  推荐阅读:<br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  12306崩了,90%的人都用过这三款抢票工具<br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  30 张图带你彻底理解红黑树<br />
  8种常见SQL错误用法
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" />
  5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「1024」,即可免费获取!!
  <br style="max-width: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);box-sizing: border-box !important;word-wrap: break-word !important;" /></p>

使用谷歌浏览器扩展程序提取插件另类访问、搜索下载RuTracker资源站详细教程

网站优化优采云 发表了文章 • 0 个评论 • 295 次浏览 • 2022-06-19 03:08 • 来自相关话题

  使用谷歌浏览器扩展程序提取插件另类访问、搜索下载RuTracker资源站详细教程
  Hello大家好,最近因为战斗民族冲突,最后呢全俄最大的好好好资源站rutracer解锁了,真是我辈喜闻乐见呀,所以今天也给大家分享下都在热谈的RuTracker访问、搜索下载的教程。一、谷歌浏览器提取RuTracker插件现在有很多介绍RuTracker的访问下载的方法,但都是直接到某某下载成品插件使用,小白很容易找晕,我使用的是谷歌浏览器扩展程序提取此插件并保存使用的方式。首要条件就是pc已经安装谷歌浏览器,并且已经安装了GG助手插件,这是因为很多用谷歌浏览器的很多朋友已经安装了GG助手插件,此扩展插件比直接下载RuTracker简单方便,不需要绕上一圈。
  很多伙伴直接访问RuTracker都是1020错误,此图留念。直接上成品图
  
  全部设置好就可直接访问,速度较快。
  
  首先打开谷歌浏览器(红圈内是GG插件已经提前安装好)
  右上角菜单打开,在更多工具,打开扩展程序。
  
  在扩展程序左下角,打开网上应用。
  左上角搜索rutracker,这时出现2个相似图标的扩展程序,下面有org网址的是正确的,注意不要安装错了,点击进去
  在说明页面点安装即可(因为安装过了所以显示的是删除,这个可以忽略)
  
  这时我们可以到扩展程序看到的访问插件。此时就可以直接用谷歌浏览器直接访问了。但平时很多朋友不用谷歌浏览器怎么办,所以以上还只是前提方式,我们只要提取出谷歌浏览器安装好的RuTracker插件就可以供其它国产浏览器使用了。在上图的RuTracker红色方框,点击详情。
  
  可以在详情内RuTracker插件的ID串,这时我们可以使用文件搜索工具如everything或者资源管理器内直接搜索ID字符串,当然,对谷歌插件目录熟悉的也可以直接找到该文件夹。这时可以通过搜索或直接找到RuTracker插件文件夹。我们可以把些文件夹整个复制到其它位置备用即可(不单独复制出来也可以)二、浏览器安装RuTracker插件及搜索下载
  
  
  这时我们打开自己常用的国产浏览器。这里我测试使用的是yandex浏览器,哈哈,俄罗斯产的浏览器访问俄罗斯的资源站。在菜单打开,扩展插件。
  
  在扩展插件页直接把刚才的RuTracker整个文件夹拖放到插件页即可成功安装
  这里可以直接看到RuTracker扩展已经启动,访问下吧
  
  默认的是俄文,当然有很多翻译插件,这个不多说,国产浏览器点下翻译很容易,当然,弹窗广告也很容易。那正常访问后我们如何下载自己想要的资源呢?
  
  其它只要在浏览器内输入资源名称后面加上就会显示出来搜索结果。以现在最火的艾尔登法环游戏为例。
  直接输入游戏英文名称(或加上:)就可以显示出第一个搜索结果就是RuTracker资源站的。当然我这里是Yandex浏览器默认的搜索,很方便。必应也可以。国产的常用浏览器是没有的。
  
  
  按搜索结果找到后,可以看到下载链接,这就是我们要找到的。
  
  没有BT、QB等等,直接用爱拿上传的知名下载软件测试,300M的宽带速度最高可以到40M下载速度,很感动,哈哈。另外使用谷歌浏览器提取出的RuTracker也在国产浏览器安装测试,结果是ok的。
  
  在Q浏览器菜单,打开应用中心
  同样是直接把rutracker整个文件夹拖放进来,自动安装好扩展应用。
  
  然后直接就可以访问了。第一次真是贴心的右上角提示立即翻译为中文。总结:以上是先用谷歌浏览器提取插件,然后提取出来的插件再安装到其它常用浏览器使用。这对于很多有谷歌浏览器和GG助手的朋友就不用绕圈子到处找rutracker去了。重点:以上所有内容资源仅供学习、研究使用,下载后请自行删除。
  需要使用rutracker浏览器插件的可以关注回复“rutracker”即可下载 查看全部

  使用谷歌浏览器扩展程序提取插件另类访问、搜索下载RuTracker资源站详细教程
  Hello大家好,最近因为战斗民族冲突,最后呢全俄最大的好好好资源站rutracer解锁了,真是我辈喜闻乐见呀,所以今天也给大家分享下都在热谈的RuTracker访问、搜索下载的教程。一、谷歌浏览器提取RuTracker插件现在有很多介绍RuTracker的访问下载的方法,但都是直接到某某下载成品插件使用,小白很容易找晕,我使用的是谷歌浏览器扩展程序提取此插件并保存使用的方式。首要条件就是pc已经安装谷歌浏览器,并且已经安装了GG助手插件,这是因为很多用谷歌浏览器的很多朋友已经安装了GG助手插件,此扩展插件比直接下载RuTracker简单方便,不需要绕上一圈。
  很多伙伴直接访问RuTracker都是1020错误,此图留念。直接上成品图
  
  全部设置好就可直接访问,速度较快。
  
  首先打开谷歌浏览器(红圈内是GG插件已经提前安装好)
  右上角菜单打开,在更多工具,打开扩展程序。
  
  在扩展程序左下角,打开网上应用。
  左上角搜索rutracker,这时出现2个相似图标的扩展程序,下面有org网址的是正确的,注意不要安装错了,点击进去
  在说明页面点安装即可(因为安装过了所以显示的是删除,这个可以忽略)
  
  这时我们可以到扩展程序看到的访问插件。此时就可以直接用谷歌浏览器直接访问了。但平时很多朋友不用谷歌浏览器怎么办,所以以上还只是前提方式,我们只要提取出谷歌浏览器安装好的RuTracker插件就可以供其它国产浏览器使用了。在上图的RuTracker红色方框,点击详情。
  
  可以在详情内RuTracker插件的ID串,这时我们可以使用文件搜索工具如everything或者资源管理器内直接搜索ID字符串,当然,对谷歌插件目录熟悉的也可以直接找到该文件夹。这时可以通过搜索或直接找到RuTracker插件文件夹。我们可以把些文件夹整个复制到其它位置备用即可(不单独复制出来也可以)二、浏览器安装RuTracker插件及搜索下载
  
  
  这时我们打开自己常用的国产浏览器。这里我测试使用的是yandex浏览器,哈哈,俄罗斯产的浏览器访问俄罗斯的资源站。在菜单打开,扩展插件。
  
  在扩展插件页直接把刚才的RuTracker整个文件夹拖放到插件页即可成功安装
  这里可以直接看到RuTracker扩展已经启动,访问下吧
  
  默认的是俄文,当然有很多翻译插件,这个不多说,国产浏览器点下翻译很容易,当然,弹窗广告也很容易。那正常访问后我们如何下载自己想要的资源呢?
  
  其它只要在浏览器内输入资源名称后面加上就会显示出来搜索结果。以现在最火的艾尔登法环游戏为例。
  直接输入游戏英文名称(或加上:)就可以显示出第一个搜索结果就是RuTracker资源站的。当然我这里是Yandex浏览器默认的搜索,很方便。必应也可以。国产的常用浏览器是没有的。
  
  
  按搜索结果找到后,可以看到下载链接,这就是我们要找到的。
  
  没有BT、QB等等,直接用爱拿上传的知名下载软件测试,300M的宽带速度最高可以到40M下载速度,很感动,哈哈。另外使用谷歌浏览器提取出的RuTracker也在国产浏览器安装测试,结果是ok的。
  
  在Q浏览器菜单,打开应用中心
  同样是直接把rutracker整个文件夹拖放进来,自动安装好扩展应用。
  
  然后直接就可以访问了。第一次真是贴心的右上角提示立即翻译为中文。总结:以上是先用谷歌浏览器提取插件,然后提取出来的插件再安装到其它常用浏览器使用。这对于很多有谷歌浏览器和GG助手的朋友就不用绕圈子到处找rutracker去了。重点:以上所有内容资源仅供学习、研究使用,下载后请自行删除。
  需要使用rutracker浏览器插件的可以关注回复“rutracker”即可下载

Selenium通过无页面浏览器执行用例

网站优化优采云 发表了文章 • 0 个评论 • 92 次浏览 • 2022-06-16 03:25 • 来自相关话题

  Selenium通过无页面浏览器执行用例
  
  出品|51Testing软件测试网
  
  前言
  在跑UI自动化测试的时候,每次执行脚本都会弹出浏览器框,如果只是想看断言结果,不想看执行过程的话,我们可以直接通过无页面浏览器进行打开,不会占用电脑屏幕。那么如何通过Selenium实现无页面浏览器操作呢?
  
  chrome浏览器无页面启动
  先介绍一种大家经常使用的chrome浏览器,Selenium支持chrome配置信息。我们可以通过加上对应的配置信息来让浏览器通过无页面启动。
  from selenium import webdriveropt = webdriver.ChromeOptions()opt.headless = True # 把Chrome设置成可视化无界面模式driver = webdriver.Chrome(options=opt) # 创建Chrome无界面对象
  (左右滑动查看完整代码)
  下面安静通过禅道登录的实例的形式给大家展示chrome浏览器无页面启动内容。
  from selenium import webdriverimport timeopt = webdriver.ChromeOptions()opt.headless = True # 把Chrome设置成可视化无界面模式driver = webdriver.Chrome(options=opt) # 创建Chrome无界面对象driver.get('http://127.0.0.1/pro/user-login.html')driver.find_element_by_id('account').send_keys('test')driver.find_element_by_name('password').send_keys('test123456')driver.find_element_by_id('submit').click()time.sleep(2)# 获取账号的名称。name = driver.find_element_by_xpath('//*[@class="dropdown-toggle"]').textprint('登录用户名:{}'.format(name))# 断言登录的用户名assert name == '测试'# 获取浏览器标题print('登录成功的浏览器标题是:{}'.format(driver.title))# 获取浏览器的urlprint('登录成功后的url地址:{}'.format(driver.current_url))
  (左右滑动查看完整代码)
  通过执行代码,安静这里给大家附上了动图,可以看到已经成功的完成了登录并获取到了登录成功后的浏览器标题以及浏览器的url地址。

  
  phantomjs无页面启动
  phantomjs一个基于webkit的JavaScript API,可以用来访问浏览器访问的内容,俗称一个隐形的浏览器,这里它也可以帮助我们进行实现无页面浏览器执行自动化。
  ......
  本文为51Testing软件测试网
  第六十一期电子杂志内容
  剩余精彩内容请点击下方 查看全部

  Selenium通过无页面浏览器执行用例
  
  出品|51Testing软件测试网
  
  前言
  在跑UI自动化测试的时候,每次执行脚本都会弹出浏览器框,如果只是想看断言结果,不想看执行过程的话,我们可以直接通过无页面浏览器进行打开,不会占用电脑屏幕。那么如何通过Selenium实现无页面浏览器操作呢?
  
  chrome浏览器无页面启动
  先介绍一种大家经常使用的chrome浏览器,Selenium支持chrome配置信息。我们可以通过加上对应的配置信息来让浏览器通过无页面启动。
  from selenium import webdriveropt = webdriver.ChromeOptions()opt.headless = True # 把Chrome设置成可视化无界面模式driver = webdriver.Chrome(options=opt) # 创建Chrome无界面对象
  (左右滑动查看完整代码)
  下面安静通过禅道登录的实例的形式给大家展示chrome浏览器无页面启动内容。
  from selenium import webdriverimport timeopt = webdriver.ChromeOptions()opt.headless = True # 把Chrome设置成可视化无界面模式driver = webdriver.Chrome(options=opt) # 创建Chrome无界面对象driver.get('http://127.0.0.1/pro/user-login.html')driver.find_element_by_id('account').send_keys('test')driver.find_element_by_name('password').send_keys('test123456')driver.find_element_by_id('submit').click()time.sleep(2)# 获取账号的名称。name = driver.find_element_by_xpath('//*[@class="dropdown-toggle"]').textprint('登录用户名:{}'.format(name))# 断言登录的用户名assert name == '测试'# 获取浏览器标题print('登录成功的浏览器标题是:{}'.format(driver.title))# 获取浏览器的urlprint('登录成功后的url地址:{}'.format(driver.current_url))
  (左右滑动查看完整代码)
  通过执行代码,安静这里给大家附上了动图,可以看到已经成功的完成了登录并获取到了登录成功后的浏览器标题以及浏览器的url地址。

  
  phantomjs无页面启动
  phantomjs一个基于webkit的JavaScript API,可以用来访问浏览器访问的内容,俗称一个隐形的浏览器,这里它也可以帮助我们进行实现无页面浏览器执行自动化。
  ......
  本文为51Testing软件测试网
  第六十一期电子杂志内容
  剩余精彩内容请点击下方

【手机软件】利用Alook浏览器抓取Cookies

网站优化优采云 发表了文章 • 0 个评论 • 988 次浏览 • 2022-06-12 18:38 • 来自相关话题

  【手机软件】利用Alook浏览器抓取Cookies
  简介软件名称:Alook(苹果也有但是AppStore收费6元)测试系统:安卓9测试手机:华为p30多号用户请不要直接退出,请看教程!!!第一步:安卓用户可以去应用商店搜索alook,或者在公众号后台发送“alook”字获取app。苹果用户在appstore下载即可!据说某宝有几毛钱的alook兑换码!!!第二步:下载并打开登录京东网址(或者你要取cookie的网站,这里以京东为例)地址栏输入
  m.jd.com

  然后点击不允许跳转(允许就会打开京东)

  然后登录你京东,注意这里不要使用qq登录,可以是手机号+验证码登录,也可以是密码登录!!!
  登录上后,就可以用开发者工具抓取cookie了!!!如图:
  
  
  
  

  到这里cookie就已经抓好了,不需要去找ptkey,ptpin,直接点拷贝复制全部即可!!!苹果alook步骤类似,如果你有多个账号,需要开启无痕模式,或者每次点一下清除数据!!!好了,今天的教程就到这里了!每天一个小技巧!!!
  喜欢什么类型的教程,留言告诉我!!! 查看全部

  【手机软件】利用Alook浏览器抓取Cookies
  简介软件名称:Alook(苹果也有但是AppStore收费6元)测试系统:安卓9测试手机:华为p30多号用户请不要直接退出,请看教程!!!第一步:安卓用户可以去应用商店搜索alook,或者在公众号后台发送“alook”字获取app。苹果用户在appstore下载即可!据说某宝有几毛钱的alook兑换码!!!第二步:下载并打开登录京东网址(或者你要取cookie的网站,这里以京东为例)地址栏输入
  m.jd.com

  然后点击不允许跳转(允许就会打开京东)

  然后登录你京东,注意这里不要使用qq登录,可以是手机号+验证码登录,也可以是密码登录!!!
  登录上后,就可以用开发者工具抓取cookie了!!!如图:
  
  
  
  

  到这里cookie就已经抓好了,不需要去找ptkey,ptpin,直接点拷贝复制全部即可!!!苹果alook步骤类似,如果你有多个账号,需要开启无痕模式,或者每次点一下清除数据!!!好了,今天的教程就到这里了!每天一个小技巧!!!
  喜欢什么类型的教程,留言告诉我!!!

前端实现在浏览器网页中录音

网站优化优采云 发表了文章 • 0 个评论 • 189 次浏览 • 2022-06-12 17:09 • 来自相关话题

  前端实现在浏览器网页中录音
  
  一、整体实现的思想页面中实现录音需要使用浏览器提供的MediaRecorder API,所以要实现页面录音就需要浏览器支持MediaStream Recording相关的功能,即浏览器能够获取浏览器的录音权限。页面内容,需要一个记录录音开始和结束的按钮,以及一个用于播放录音的标签然后设计具体的实现细节:首先我们进入页面需要判断浏览器是否支持该API,如果支持的话,然后再获取浏览器的录音权限,获取权限之后,我们的页面上分别由录音按钮和播放音频的标签audio,然后我们就需要设计逻辑,在点击录音按钮的时候就开始记录音频(实现这一步的前提是我们需要创建录音实例),然后实现启动录音和结束录音,录音结束之后,我们就把获取的录音实例放在audio中,当我们点击播放的时候就可以实现将录音播放出来。二、具体细节和函数浏览器获取录音的权限
  /*获取浏览器的录音权限,contraint是需要获取权限的列表*/const constraints = { audio: true };//返回的是Promise对象,因为需要等到用户确定授予权限的时候,我们才会处理下面的步骤,navigator是浏览器对象,我们就是通过navigator获取录音权限,成功回调的话就会获取到一个stream,然后将这个stream放入到我们下面创建的录音实例里面去navigator.mediaDevices.getUserMedia(constraints)
  创建录音实例
  //通过该方法创建录音实例var mediaRecorder = new MediaRecorder(stream);
  启动录音
  //通过点击按钮来启动或者结束录音//获取按钮节点const recordBtn = document.querySelector(".record-btn");//创建录音实例const mediaRecorder = new MediaRecorder(stream);<br />recordBtn.onclick = () => { mediaRecorder.start(); console.log("录音中...");};//
  MediaRecorder 实例上有个 state 状态,可用来判断录音器当前的活动状态,总共有三种值:
  inactive:处于休息状态,要么是没开始,要么是开始后已经停止。
  recording:录音中
  paused:已经开始,但被暂停了,不是停止也没有被恢复。
  //更加完整的录音逻辑recordBtn.onclick = () => { if (mediaRecorder.state === "recording") { mediaRecorder.stop(); recordBtn.textContent = "record"; console.log("录音结束"); } else { mediaRecorder.start(); console.log("录音中..."); recordBtn.textContent = "stop"; } console.log("录音器状态:", mediaRecorder.state);};
  音频数据的获取
  上面按钮处理来自用户的交互,只负责启动或停止录音。音频的数据还是从 MediaRecorder 实例上通过监听其相应的事件来完成的。
  当录音开始时,会触发其 MediaRecorder.ondataavailable 事件,从该事件回调的入参为 BlobEvent,从它身上取到 event.data 便是我们需要的音频数据。因为数据是一段一段产生的,所以需要暂存到一个数组中。
  const chunks = [];mediaRecorder.ondataavailable = function(e) { chunks.push(e.data);};
  录音的结束和音频的播放,通过监听 MediaRecorder.onstop 事件,将收集好的音频数据创建成Blob 对象,然后 通过 URL.createObjectURL 创建成 html 中 标签可使用的资源链接。
  mediaRecorder.onstop = e => { var blob = new Blob(chunks, { type: "audio/ogg; codecs=opus" }); chunks = []; var audioURL = window.URL.createObjectURL(blob); audio.src = audioURL;};
  三、详细完整代码
  实现在网页上录音recordrecordif (navigator.mediaDevices.getUserMedia) {const constraints = { audio: true };navigator.mediaDevices.getUserMedia(constraints).then(stream => {console.log("授权成功!");const recordBtn = document.querySelector(".record-btn");const mediaRecorder = new MediaRecorder(stream);var chunks = [];recordBtn.onclick = () => {if (mediaRecorder.state === "recording") {mediaRecorder.stop();console.log(chunks)mediaRecorder.onstop = e => {var blob= new Blob(chunks, { type: "audio/ogg; codecs=opus" });chunks = [];var audioURL = window.URL.createObjectURL(blob);const audioSrc = document.querySelector(".audio-player");audioSrc.src = audioURL;};recordBtn.textContent = "record";console.log("录音结束");} else {mediaRecorder.start();mediaRecorder.ondataavailable = function(e) {chunks.push(e.data);};console.log(chunks)console.log("录音中...");recordBtn.textContent = "stop";}console.log("录音器状态:", mediaRecorder.state);};<br />},() => {console.error("授权失败!");});} else {console.error("浏览器不支持 getUserMedia");}if (navigator.mediaDevices.getUserMedia) {const constraints1 = { audio: true };navigator.mediaDevices.getUserMedia(constraints1).then(stream1 => {console.log("授权成功!");const recordBtn1 = document.querySelector(".record-btn1");const mediaRecorder1 = new MediaRecorder(stream1);var chunks1 = [];recordBtn1.onclick = () => {if (mediaRecorder1.state === "recording") {mediaRecorder1.stop();//console.log(chunks)mediaRecorder1.onstop = e => {var blob1 = new Blob(chunks1, { type: "audio/ogg; codecs=opus" });chunks1 = [];var audioURL1 = window.URL.createObjectURL(blob1);const audioSrc1 = document.querySelector(".audio-player1");audioSrc1.src = audioURL1;};recordBtn1.textContent = "record";console.log("录音结束");} else {mediaRecorder1.start();mediaRecorder1.ondataavailable = function(e) {chunks1.push(e.data);};//console.log(chunks)console.log("录音中...");recordBtn1.textContent = "stop";}console.log("录音器状态:", mediaRecorder1.state);};<br />},() => {console.error("授权失败!");});} else {console.error("浏览器不支持 getUserMedia");}
  (这个代码可以直接复制粘贴使用,查看效果,然后再一步步的学习细节)
  MediaRecorder 实例上有个 state 状态,可用来判断录音器当前的活动状态,总共有三种值:
  inactive:处于休息状态,要么是没开始,要么是开始后已经停止。
  recording:录音中
  paused:已经开始,但被暂停了,不是停止也没有被恢复。
  本文完~
   查看全部

  前端实现在浏览器网页中录音
  
  一、整体实现的思想页面中实现录音需要使用浏览器提供的MediaRecorder API,所以要实现页面录音就需要浏览器支持MediaStream Recording相关的功能,即浏览器能够获取浏览器的录音权限。页面内容,需要一个记录录音开始和结束的按钮,以及一个用于播放录音的标签然后设计具体的实现细节:首先我们进入页面需要判断浏览器是否支持该API,如果支持的话,然后再获取浏览器的录音权限,获取权限之后,我们的页面上分别由录音按钮和播放音频的标签audio,然后我们就需要设计逻辑,在点击录音按钮的时候就开始记录音频(实现这一步的前提是我们需要创建录音实例),然后实现启动录音和结束录音,录音结束之后,我们就把获取的录音实例放在audio中,当我们点击播放的时候就可以实现将录音播放出来。二、具体细节和函数浏览器获取录音的权限
  /*获取浏览器的录音权限,contraint是需要获取权限的列表*/const constraints = { audio: true };//返回的是Promise对象,因为需要等到用户确定授予权限的时候,我们才会处理下面的步骤,navigator是浏览器对象,我们就是通过navigator获取录音权限,成功回调的话就会获取到一个stream,然后将这个stream放入到我们下面创建的录音实例里面去navigator.mediaDevices.getUserMedia(constraints)
  创建录音实例
  //通过该方法创建录音实例var mediaRecorder = new MediaRecorder(stream);
  启动录音
  //通过点击按钮来启动或者结束录音//获取按钮节点const recordBtn = document.querySelector(".record-btn");//创建录音实例const mediaRecorder = new MediaRecorder(stream);<br />recordBtn.onclick = () => { mediaRecorder.start(); console.log("录音中...");};//
  MediaRecorder 实例上有个 state 状态,可用来判断录音器当前的活动状态,总共有三种值:
  inactive:处于休息状态,要么是没开始,要么是开始后已经停止。
  recording:录音中
  paused:已经开始,但被暂停了,不是停止也没有被恢复。
  //更加完整的录音逻辑recordBtn.onclick = () => { if (mediaRecorder.state === "recording") { mediaRecorder.stop(); recordBtn.textContent = "record"; console.log("录音结束"); } else { mediaRecorder.start(); console.log("录音中..."); recordBtn.textContent = "stop"; } console.log("录音器状态:", mediaRecorder.state);};
  音频数据的获取
  上面按钮处理来自用户的交互,只负责启动或停止录音。音频的数据还是从 MediaRecorder 实例上通过监听其相应的事件来完成的。
  当录音开始时,会触发其 MediaRecorder.ondataavailable 事件,从该事件回调的入参为 BlobEvent,从它身上取到 event.data 便是我们需要的音频数据。因为数据是一段一段产生的,所以需要暂存到一个数组中。
  const chunks = [];mediaRecorder.ondataavailable = function(e) { chunks.push(e.data);};
  录音的结束和音频的播放,通过监听 MediaRecorder.onstop 事件,将收集好的音频数据创建成Blob 对象,然后 通过 URL.createObjectURL 创建成 html 中 标签可使用的资源链接。
  mediaRecorder.onstop = e => { var blob = new Blob(chunks, { type: "audio/ogg; codecs=opus" }); chunks = []; var audioURL = window.URL.createObjectURL(blob); audio.src = audioURL;};
  三、详细完整代码
  实现在网页上录音recordrecordif (navigator.mediaDevices.getUserMedia) {const constraints = { audio: true };navigator.mediaDevices.getUserMedia(constraints).then(stream => {console.log("授权成功!");const recordBtn = document.querySelector(".record-btn");const mediaRecorder = new MediaRecorder(stream);var chunks = [];recordBtn.onclick = () => {if (mediaRecorder.state === "recording") {mediaRecorder.stop();console.log(chunks)mediaRecorder.onstop = e => {var blob= new Blob(chunks, { type: "audio/ogg; codecs=opus" });chunks = [];var audioURL = window.URL.createObjectURL(blob);const audioSrc = document.querySelector(".audio-player");audioSrc.src = audioURL;};recordBtn.textContent = "record";console.log("录音结束");} else {mediaRecorder.start();mediaRecorder.ondataavailable = function(e) {chunks.push(e.data);};console.log(chunks)console.log("录音中...");recordBtn.textContent = "stop";}console.log("录音器状态:", mediaRecorder.state);};<br />},() => {console.error("授权失败!");});} else {console.error("浏览器不支持 getUserMedia");}if (navigator.mediaDevices.getUserMedia) {const constraints1 = { audio: true };navigator.mediaDevices.getUserMedia(constraints1).then(stream1 => {console.log("授权成功!");const recordBtn1 = document.querySelector(".record-btn1");const mediaRecorder1 = new MediaRecorder(stream1);var chunks1 = [];recordBtn1.onclick = () => {if (mediaRecorder1.state === "recording") {mediaRecorder1.stop();//console.log(chunks)mediaRecorder1.onstop = e => {var blob1 = new Blob(chunks1, { type: "audio/ogg; codecs=opus" });chunks1 = [];var audioURL1 = window.URL.createObjectURL(blob1);const audioSrc1 = document.querySelector(".audio-player1");audioSrc1.src = audioURL1;};recordBtn1.textContent = "record";console.log("录音结束");} else {mediaRecorder1.start();mediaRecorder1.ondataavailable = function(e) {chunks1.push(e.data);};//console.log(chunks)console.log("录音中...");recordBtn1.textContent = "stop";}console.log("录音器状态:", mediaRecorder1.state);};<br />},() => {console.error("授权失败!");});} else {console.error("浏览器不支持 getUserMedia");}
  (这个代码可以直接复制粘贴使用,查看效果,然后再一步步的学习细节)
  MediaRecorder 实例上有个 state 状态,可用来判断录音器当前的活动状态,总共有三种值:
  inactive:处于休息状态,要么是没开始,要么是开始后已经停止。
  recording:录音中
  paused:已经开始,但被暂停了,不是停止也没有被恢复。
  本文完~
  

使用极简浏览器 Min 浏览网页 | Linux 中国

网站优化优采云 发表了文章 • 0 个评论 • 156 次浏览 • 2022-06-12 16:02 • 来自相关话题

  使用极简浏览器 Min 浏览网页 | Linux 中国
  
  并非所有 web 浏览器都要做到无所不能,Min 就是一个极简主义风格的浏览器。-- Scott Nesbitt
  有用的原文链接请访问文末的“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。致谢编译自|
  作者|Scott Nesbitt
  译者|Hank Chow (HankChow) 共计翻译:23.0篇 贡献时间:341 天
  并非所有 web 浏览器都要做到无所不能,Min 就是一个极简主义风格的浏览器。
  现在还有开发新的 Web 浏览器的需要吗?即使现在浏览器领域已经成为了寡头市场,但仍然不断涌现出各种前所未有的浏览器产品。
  Min[1]就是其中一个。顾名思义,Min 是一个小的浏览器,也是一个极简主义的浏览器。但它麻雀虽小五脏俱全,而且还是一个开源的浏览器,它的 Apache 2.0 许可证引起了我的注意。
  让我们来看看 Min 有什么值得关注的方面。
  开始
  Min 基于Electron[2]框架开发,值得一提的是,Atom 文本编辑器[3]也是基于这个框架开发的。它提供 Linux、MacOS 和 Windows 的安装程序[4],当然也可以从 GitHub 获取它的源代码[5]自行编译安装。
  我使用的 Linux 发行版是 Manjaro,但没有完全匹配这个发行版的安装程序。还好,我通过 Manjaro 的包管理器也能安装 Min。
  安装完成后,在终端就可以直接启动 Min。
  
  Min 号称是更智能、更快速的浏览器。经过尝试以后,我觉得它比我在其它电脑上使用过的 Firefox 和 Chrome 浏览器启动得更快。
  而使用 Min 浏览网页的过程则和 Firefox 或 Chrome 一样,只要再地址栏输入 URL,回车,就好了。
  Min 的功能
  尽管 Min 不可能带有 Firefox 或 Chrome 等浏览器得所有功能,但它也有可取之处。
  Min 和其它浏览器一样,支持页面选项卡。它还有一个称为 Tasks 的功能,可以对打开的选项卡进行分组。
  DuckDuckGo[6]是我最喜欢的搜索引擎,而 Min 的默认搜索引擎恰好就是它,这正合我意。当然,如果你喜欢另一个搜索引擎,也可以在 Min 的偏好设置中配置你喜欢的搜索引擎作为默认搜索引擎。
  Min 没有使用类似 AdBlock 这样的插件来过滤你不想看到的内容,而是使用了一个名为EasyList[7]的内置的广告拦截器,你可以使用它来屏蔽脚本和图片。另外 Min 还带有一个内置的防跟踪软件。
  类似 Firefox,Min 有一个名为叫做 Reading List 的阅读模式。只需点击地址栏中的对应图标,就可以去除页面中的大部分无关内容,让你专注于正在阅读的内容。网页在阅读列表中可以保留 30 天。
  
  Min 还有一个专注模式,可以隐藏其它选项卡并阻止你打开新的选项卡。在专注模式下,如果一个 web 页面中进行工作,需要多点击好几次才能打开一个新页面。
  Min 也有很多快捷键让你快速使用某个功能。你可以在 GitHub 上[8]找到这些这些快捷键的参考文档,也可以在 Min 的偏好设置中进行更改。
  我发现 Min 可以在 YouTube、Vimeo、Dailymotion 等视频网站上播放视频,还可以在音乐网站 7Digital 上播放音乐。但由于我没有账号,所以没法测试是否能在 Spotify 或 Last.fm 等这些网站上播放音乐。
  
  Min 的弱点
  Min 确实也有自己的缺点,例如它无法将网站添加为书签。替代方案要么是查看 Min 的搜索历史来找回你需要的链接,要么是使用一个第三方的书签服务。
  最大的缺点是 Min 不支持插件。这对我来说不是一件坏事,因为浏览器启动速度和运行速度快的主要原因就在于此。当然也有一些人非常喜欢使用浏览器插件,Min 就不是他们的选择。
  总结
  Min 算是一个中规中矩的浏览器,它可以凭借轻量、快速的优点吸引很多极简主义的用户。但是对于追求多功能的用户来说,Min 就显得相当捉襟见肘了。
  所以,如果你想摆脱当今多功能浏览器的束缚,我觉得可以试用一下 Min。
  via:
  作者:Scott Nesbitt[10]选题:lujun9972译者:HankChow校对:wxy
  本文由LCTT原创编译,Linux中国荣誉推出 查看全部

  使用极简浏览器 Min 浏览网页 | Linux 中国
  
  并非所有 web 浏览器都要做到无所不能,Min 就是一个极简主义风格的浏览器。-- Scott Nesbitt
  有用的原文链接请访问文末的“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。致谢编译自|
  作者|Scott Nesbitt
  译者|Hank Chow (HankChow) 共计翻译:23.0篇 贡献时间:341 天
  并非所有 web 浏览器都要做到无所不能,Min 就是一个极简主义风格的浏览器。
  现在还有开发新的 Web 浏览器的需要吗?即使现在浏览器领域已经成为了寡头市场,但仍然不断涌现出各种前所未有的浏览器产品。
  Min[1]就是其中一个。顾名思义,Min 是一个小的浏览器,也是一个极简主义的浏览器。但它麻雀虽小五脏俱全,而且还是一个开源的浏览器,它的 Apache 2.0 许可证引起了我的注意。
  让我们来看看 Min 有什么值得关注的方面。
  开始
  Min 基于Electron[2]框架开发,值得一提的是,Atom 文本编辑器[3]也是基于这个框架开发的。它提供 Linux、MacOS 和 Windows 的安装程序[4],当然也可以从 GitHub 获取它的源代码[5]自行编译安装。
  我使用的 Linux 发行版是 Manjaro,但没有完全匹配这个发行版的安装程序。还好,我通过 Manjaro 的包管理器也能安装 Min。
  安装完成后,在终端就可以直接启动 Min。
  
  Min 号称是更智能、更快速的浏览器。经过尝试以后,我觉得它比我在其它电脑上使用过的 Firefox 和 Chrome 浏览器启动得更快。
  而使用 Min 浏览网页的过程则和 Firefox 或 Chrome 一样,只要再地址栏输入 URL,回车,就好了。
  Min 的功能
  尽管 Min 不可能带有 Firefox 或 Chrome 等浏览器得所有功能,但它也有可取之处。
  Min 和其它浏览器一样,支持页面选项卡。它还有一个称为 Tasks 的功能,可以对打开的选项卡进行分组。
  DuckDuckGo[6]是我最喜欢的搜索引擎,而 Min 的默认搜索引擎恰好就是它,这正合我意。当然,如果你喜欢另一个搜索引擎,也可以在 Min 的偏好设置中配置你喜欢的搜索引擎作为默认搜索引擎。
  Min 没有使用类似 AdBlock 这样的插件来过滤你不想看到的内容,而是使用了一个名为EasyList[7]的内置的广告拦截器,你可以使用它来屏蔽脚本和图片。另外 Min 还带有一个内置的防跟踪软件。
  类似 Firefox,Min 有一个名为叫做 Reading List 的阅读模式。只需点击地址栏中的对应图标,就可以去除页面中的大部分无关内容,让你专注于正在阅读的内容。网页在阅读列表中可以保留 30 天。
  
  Min 还有一个专注模式,可以隐藏其它选项卡并阻止你打开新的选项卡。在专注模式下,如果一个 web 页面中进行工作,需要多点击好几次才能打开一个新页面。
  Min 也有很多快捷键让你快速使用某个功能。你可以在 GitHub 上[8]找到这些这些快捷键的参考文档,也可以在 Min 的偏好设置中进行更改。
  我发现 Min 可以在 YouTube、Vimeo、Dailymotion 等视频网站上播放视频,还可以在音乐网站 7Digital 上播放音乐。但由于我没有账号,所以没法测试是否能在 Spotify 或 Last.fm 等这些网站上播放音乐。
  
  Min 的弱点
  Min 确实也有自己的缺点,例如它无法将网站添加为书签。替代方案要么是查看 Min 的搜索历史来找回你需要的链接,要么是使用一个第三方的书签服务。
  最大的缺点是 Min 不支持插件。这对我来说不是一件坏事,因为浏览器启动速度和运行速度快的主要原因就在于此。当然也有一些人非常喜欢使用浏览器插件,Min 就不是他们的选择。
  总结
  Min 算是一个中规中矩的浏览器,它可以凭借轻量、快速的优点吸引很多极简主义的用户。但是对于追求多功能的用户来说,Min 就显得相当捉襟见肘了。
  所以,如果你想摆脱当今多功能浏览器的束缚,我觉得可以试用一下 Min。
  via:
  作者:Scott Nesbitt[10]选题:lujun9972译者:HankChow校对:wxy
  本文由LCTT原创编译,Linux中国荣誉推出

6张图让你搞懂浏览器渲染网页过程

网站优化优采云 发表了文章 • 0 个评论 • 114 次浏览 • 2022-06-12 16:01 • 来自相关话题

  6张图让你搞懂浏览器渲染网页过程
  我的想法:如果我要构建快速可靠的网站,需要真正了解浏览器渲染网页的每个步骤机制,这样就可以在开发过程中对每个步骤进行优化。这篇文章是我在较高水平上对端到端过程的学习总结。
  好了,废话不多说,我们开始吧。这个过程可以分为以下几个主要阶段:
  开始解析HTML获取外部资源解析 CSS 并构建CSSOM执行 JavaScript合并 DOM 和 CSSOM 以构造渲染树计算布局和绘制1.开始解析HTML
  当浏览器通过网络接收页面的HTML数据时,它会立即设置解析器将HTML转换为文档对象模型(DOM)。
  文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。
  解析过程的第一步是将HTML分解并表示为开始标记、结束标记及其内容标记,然后它可以构造DOM。
  
  2. 获取外部资源
  当解析器遇到外部资源(如CSS或JavaScript文件)时,解析器将提取这些文件。解析器在加载CSS文件时继续运行,此时会阻止页面渲染,直到资源加载解析完(稍后会详细介绍)。
  JavaScript 文件略有不同-默认情况下,解析器会在加载 JS 文件然后进行解析同时会阻止对HTML的解析。可以将两个属性添加到脚本标签中以减轻这种情况:defer 和async。两者都允许解析器在后台加载JavaScript 文件的同时继续运行,但是它们的执行方式不同。
  关于这一点后面还会再讲一点,但总的来说:
  defer表示文件的执行将被延迟,直到文档的解析完成为止。如果多个文件具有defer属性,则将按照页面放置的顺序依次执行。
  <br />
  async 意味着文件将在加载后立即执行,这可能是在解析过程中或在解析过程之后执行的,因此不能保证异步脚本的执行顺序。
  <br />
  预加载资源
  元素的 rel 属性的属性值preload能够让你在你的HTML页面中 元素内部书写一些声明式的资源获取请求,可以指明哪些资源是在页面加载完成后即刻需要的。
  对于这种即刻需要的资源,你可能希望在页面加载的生命周期的早期阶段就开始获取,在浏览器的主渲染机制介入前就进行预加载。
  这一机制使得资源可以更早的得到加载并可用,且更不易阻塞页面的初步渲染,进而提升性能。
  <br />
  
  3.解析CSS并构建CSSOM
  你可能很早就知道DOM,但对**CSSOM(CSS对象模型)**可能听得少,反正我也没听过几次。
  CSS 对象模型 (CSSOM) 是树形形式的所有CSS选择器和每个选择器的相关属性的映射,具有树的根节点,同级,后代,子级和其他关系。CSSOM 与 文档对象模型(DOM) 非常相似。两者都是关键渲染路径的一部分,也是正确渲染一个网站必须采
  取的一系列步骤。
  CSSOM 与 DOM一起构建渲染树,浏览器依次使用渲染树来布局和绘制网页。
  与HTML文件和DOM相似,加载CSS文件时,必须将它们解析并转换为树-这次是CSSOM。它描述了页面上的所有CSS选择器,它们的层次结构和属性。
  CSSOM 与 DOM的不同之处在于它不能以增量方式构建,因为CSS规则由于特定性而可以在各个不同的点相互覆盖。
  这就是CSS 阻塞渲染的原因,因为在解析所有CSS并构建CSSOM之前,浏览器无法知道每个元素在屏幕上的位置。
  
  4.执行JavaScript
  不同的浏览器有不同的 JS 引擎来执行此任务。从计算机资源的角度来看,解析 JS 可能是一个昂贵的过程,比其他类型的资源更昂贵,因此优化它对于获得良好的性能是如此重要。
  载入事件
  加载的JS和DOM被完全解析并准备就绪后就会emitdocument.DOMContentLoaded事件。对于需要访问DOM的任何脚本,例如以某种方式进行操作或侦听用户交互事件,优良作法是在执行脚本之前先等待此事件。
  document.addEventListener('DOMContentLoaded', (event) => {<br />    // 这里面可以安全地访问DOM了<br />});<br />
  在所有其他内容(例如异步JavaScript,图像等)完成加载后,将触发window.load事件。
  window.addEventListener('load', (event) => {<br />    // 页面现已完全加载<br />});<br />
  
  5.合并DOM和CSSOM 构建渲染树
  渲染树是DOM和CSSOM的组合,表示将要渲染到页面上的所有内容。这并不一定意味着渲染树中的所有节点都将在视觉上呈现,例如,将包含opacity: 0或visibility: hidden的样式的节点,并仍然可以被屏幕阅读器等读取,而display: none不包括任何内容。
  此外,诸如之类的不包含任何视觉信息的标签将始终被忽略。
  与 JS 引擎一样,不同的浏览器具有不同的渲染引擎。
  
  6. 计算布局和绘制
  现在我们有了完整的渲染树,浏览器知道了要渲染什么,但是不知道在哪里渲染。因此,必须计算页面的布局(即每个节点的位置和大小)。渲染引擎从顶部开始一直向下遍历渲染树,计算应显示每个节点的坐标。
  完成之后,最后一步是获取布局信息并将像素绘制到屏幕上。
   查看全部

  6张图让你搞懂浏览器渲染网页过程
  我的想法:如果我要构建快速可靠的网站,需要真正了解浏览器渲染网页的每个步骤机制,这样就可以在开发过程中对每个步骤进行优化。这篇文章是我在较高水平上对端到端过程的学习总结。
  好了,废话不多说,我们开始吧。这个过程可以分为以下几个主要阶段:
  开始解析HTML获取外部资源解析 CSS 并构建CSSOM执行 JavaScript合并 DOM 和 CSSOM 以构造渲染树计算布局和绘制1.开始解析HTML
  当浏览器通过网络接收页面的HTML数据时,它会立即设置解析器将HTML转换为文档对象模型(DOM)。
  文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。
  解析过程的第一步是将HTML分解并表示为开始标记、结束标记及其内容标记,然后它可以构造DOM。
  
  2. 获取外部资源
  当解析器遇到外部资源(如CSS或JavaScript文件)时,解析器将提取这些文件。解析器在加载CSS文件时继续运行,此时会阻止页面渲染,直到资源加载解析完(稍后会详细介绍)。
  JavaScript 文件略有不同-默认情况下,解析器会在加载 JS 文件然后进行解析同时会阻止对HTML的解析。可以将两个属性添加到脚本标签中以减轻这种情况:defer 和async。两者都允许解析器在后台加载JavaScript 文件的同时继续运行,但是它们的执行方式不同。
  关于这一点后面还会再讲一点,但总的来说:
  defer表示文件的执行将被延迟,直到文档的解析完成为止。如果多个文件具有defer属性,则将按照页面放置的顺序依次执行。
  <br />
  async 意味着文件将在加载后立即执行,这可能是在解析过程中或在解析过程之后执行的,因此不能保证异步脚本的执行顺序。
  <br />
  预加载资源
  元素的 rel 属性的属性值preload能够让你在你的HTML页面中 元素内部书写一些声明式的资源获取请求,可以指明哪些资源是在页面加载完成后即刻需要的。
  对于这种即刻需要的资源,你可能希望在页面加载的生命周期的早期阶段就开始获取,在浏览器的主渲染机制介入前就进行预加载。
  这一机制使得资源可以更早的得到加载并可用,且更不易阻塞页面的初步渲染,进而提升性能。
  <br />
  
  3.解析CSS并构建CSSOM
  你可能很早就知道DOM,但对**CSSOM(CSS对象模型)**可能听得少,反正我也没听过几次。
  CSS 对象模型 (CSSOM) 是树形形式的所有CSS选择器和每个选择器的相关属性的映射,具有树的根节点,同级,后代,子级和其他关系。CSSOM 与 文档对象模型(DOM) 非常相似。两者都是关键渲染路径的一部分,也是正确渲染一个网站必须采
  取的一系列步骤。
  CSSOM 与 DOM一起构建渲染树,浏览器依次使用渲染树来布局和绘制网页。
  与HTML文件和DOM相似,加载CSS文件时,必须将它们解析并转换为树-这次是CSSOM。它描述了页面上的所有CSS选择器,它们的层次结构和属性。
  CSSOM 与 DOM的不同之处在于它不能以增量方式构建,因为CSS规则由于特定性而可以在各个不同的点相互覆盖。
  这就是CSS 阻塞渲染的原因,因为在解析所有CSS并构建CSSOM之前,浏览器无法知道每个元素在屏幕上的位置。
  
  4.执行JavaScript
  不同的浏览器有不同的 JS 引擎来执行此任务。从计算机资源的角度来看,解析 JS 可能是一个昂贵的过程,比其他类型的资源更昂贵,因此优化它对于获得良好的性能是如此重要。
  载入事件
  加载的JS和DOM被完全解析并准备就绪后就会emitdocument.DOMContentLoaded事件。对于需要访问DOM的任何脚本,例如以某种方式进行操作或侦听用户交互事件,优良作法是在执行脚本之前先等待此事件。
  document.addEventListener('DOMContentLoaded', (event) => {<br />    // 这里面可以安全地访问DOM了<br />});<br />
  在所有其他内容(例如异步JavaScript,图像等)完成加载后,将触发window.load事件。
  window.addEventListener('load', (event) => {<br />    // 页面现已完全加载<br />});<br />
  
  5.合并DOM和CSSOM 构建渲染树
  渲染树是DOM和CSSOM的组合,表示将要渲染到页面上的所有内容。这并不一定意味着渲染树中的所有节点都将在视觉上呈现,例如,将包含opacity: 0或visibility: hidden的样式的节点,并仍然可以被屏幕阅读器等读取,而display: none不包括任何内容。
  此外,诸如之类的不包含任何视觉信息的标签将始终被忽略。
  与 JS 引擎一样,不同的浏览器具有不同的渲染引擎。
  
  6. 计算布局和绘制
  现在我们有了完整的渲染树,浏览器知道了要渲染什么,但是不知道在哪里渲染。因此,必须计算页面的布局(即每个节点的位置和大小)。渲染引擎从顶部开始一直向下遍历渲染树,计算应显示每个节点的坐标。
  完成之后,最后一步是获取布局信息并将像素绘制到屏幕上。
  

官方客服QQ群

微信人工客服

QQ人工客服


线