浏览器抓取网页

浏览器抓取网页

浏览器抓取网页(抓取网页数据的思路有好,抓取抓取数据思路 )

网站优化优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2021-12-29 08:03 • 来自相关话题

  浏览器抓取网页(抓取网页数据的思路有好,抓取抓取数据思路
)
  抓取网页数据的方式很多,一般有:直接代码请求http、模拟浏览器请求数据(一般需要登录验证)、控制浏览器实现数据抓取等,本文不考虑复杂度,放一个小例子读取简单网页数据:
  目标数据
  将所有这些球员的超链接保存在 ittf 网站的此页面上。
  
  数据请求
  我真的很喜欢符合人类思维的库,比如请求。如果想直接取网页文字,一句话就可以做到:
  
doc = requests.get(url).text
  解析html获取数据
  以beautifulsoup为例,它包括获取标签、链接、按照html层次遍历等方法。请参阅此处以供参考。以下代码段从 ittf 网站获取指向指定页面上指定位置的链接。
  
url = 'http://www.ittf.com/ittf_ranking/WR_Table_3_A2.asp?Age_category_1=&Age_category_2=&Age_category_3=&Age_category_4=&Age_category_5=&Category=100W&Cont=&Country=&Gender=W&Month1=4&Year1=2015&s_Player_Name=&Formv_WR_Table_3_Page='+str(page)
doc = requests.get(url).text
soup = BeautifulSoup(doc)
atags = soup.find_all('a')
rank_link_pre = 'http://www.ittf.com/ittf_ranking/'
mlfile = open(linkfile,'a')
for atag in atags:
#print atag
if atag!=None and atag.get('href') != None:
if "WR_Table_3_A2_Details.asp" in atag['href']:
link = rank_link_pre + atag['href']
links.append(link)
mlfile.write(link+'\n')
print 'fetch link: '+link
mlfile.close() 查看全部

  浏览器抓取网页(抓取网页数据的思路有好,抓取抓取数据思路
)
  抓取网页数据的方式很多,一般有:直接代码请求http、模拟浏览器请求数据(一般需要登录验证)、控制浏览器实现数据抓取等,本文不考虑复杂度,放一个小例子读取简单网页数据:
  目标数据
  将所有这些球员的超链接保存在 ittf 网站的此页面上。
  
  数据请求
  我真的很喜欢符合人类思维的库,比如请求。如果想直接取网页文字,一句话就可以做到:
  
doc = requests.get(url).text
  解析html获取数据
  以beautifulsoup为例,它包括获取标签、链接、按照html层次遍历等方法。请参阅此处以供参考。以下代码段从 ittf 网站获取指向指定页面上指定位置的链接。
  
url = 'http://www.ittf.com/ittf_ranking/WR_Table_3_A2.asp?Age_category_1=&Age_category_2=&Age_category_3=&Age_category_4=&Age_category_5=&Category=100W&Cont=&Country=&Gender=W&Month1=4&Year1=2015&s_Player_Name=&Formv_WR_Table_3_Page='+str(page)
doc = requests.get(url).text
soup = BeautifulSoup(doc)
atags = soup.find_all('a')
rank_link_pre = 'http://www.ittf.com/ittf_ranking/'
mlfile = open(linkfile,'a')
for atag in atags:
#print atag
if atag!=None and atag.get('href') != None:
if "WR_Table_3_A2_Details.asp" in atag['href']:
link = rank_link_pre + atag['href']
links.append(link)
mlfile.write(link+'\n')
print 'fetch link: '+link
mlfile.close()

浏览器抓取网页(如何使用java就能对网页数据进行爬取(图) )

网站优化优采云 发表了文章 • 0 个评论 • 345 次浏览 • 2021-12-28 00:17 • 来自相关话题

  浏览器抓取网页(如何使用java就能对网页数据进行爬取(图)
)
  今天,我将介绍如何使用java来抓取网页数据。本文将首先讲解如何分析对应的网页。
  以下是将要使用的技术或需要了解的技术:
  java(用来写爬虫程序)、Jsoup(java中解析html页面的工具)、html(一种识别语言,只要懂就好)、谷歌浏览器(用来浏览网页,也可以用其他浏览器)
  获取需求
  获取百度排名中的排名数据
  打开网页进行分析1.浏览网页
  下面是我们今天需要获取数据的网页,先打开
  
  从上面的截图我们可以看到,左上角是我们需要的数据,但是数据目前是嵌入在网页中的,所以我们需要一步步解析网页,得到一组结构化的数据。
  2.开放开发者工具
  通过使用快捷键 F12 或在页面上右击选择>检查(其他浏览器可能有不同的快捷键或选项)
  
  然后,我们可以看到浏览器中会出现开发者工具面板(根据默认设置,面板可能会出现在右侧或其他地方)
  
  接下来,我们阅读相关代码(什么?阅读代码?可能很多人看完之后会吐槽,这么多代码,眼睛可能要看看了),其实还有一个比较简单的定位热点排名的方法列表的代码。
  3.定位相关代码
  有3种方法可以直接定位到你想看的代码位置:
  在热点列表顶部右击直接选择check,可以看到开发者工具中的代码直接定位到相关代码
  
  我们可以通过将鼠标悬停在相关代码上来直观地看到代码显示的区域
  
  点击开发者工具左上角的按钮,然后点击页面的相关区域(今天我们需要爬取热点排名数据,所以选择了热点排名区域),可以看到里面的代码右边的开发者工具直接选择后定位到指定的代码
   查看全部

  浏览器抓取网页(如何使用java就能对网页数据进行爬取(图)
)
  今天,我将介绍如何使用java来抓取网页数据。本文将首先讲解如何分析对应的网页。
  以下是将要使用的技术或需要了解的技术:
  java(用来写爬虫程序)、Jsoup(java中解析html页面的工具)、html(一种识别语言,只要懂就好)、谷歌浏览器(用来浏览网页,也可以用其他浏览器)
  获取需求
  获取百度排名中的排名数据
  打开网页进行分析1.浏览网页
  下面是我们今天需要获取数据的网页,先打开
  
  从上面的截图我们可以看到,左上角是我们需要的数据,但是数据目前是嵌入在网页中的,所以我们需要一步步解析网页,得到一组结构化的数据。
  2.开放开发者工具
  通过使用快捷键 F12 或在页面上右击选择>检查(其他浏览器可能有不同的快捷键或选项)
  
  然后,我们可以看到浏览器中会出现开发者工具面板(根据默认设置,面板可能会出现在右侧或其他地方)
  
  接下来,我们阅读相关代码(什么?阅读代码?可能很多人看完之后会吐槽,这么多代码,眼睛可能要看看了),其实还有一个比较简单的定位热点排名的方法列表的代码。
  3.定位相关代码
  有3种方法可以直接定位到你想看的代码位置:
  在热点列表顶部右击直接选择check,可以看到开发者工具中的代码直接定位到相关代码
  
  我们可以通过将鼠标悬停在相关代码上来直观地看到代码显示的区域
  
  点击开发者工具左上角的按钮,然后点击页面的相关区域(今天我们需要爬取热点排名数据,所以选择了热点排名区域),可以看到里面的代码右边的开发者工具直接选择后定位到指定的代码
  

浏览器抓取网页(查找引擎页面作业靠蜘蛛(Spider)来核算链接权重)

网站优化优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2021-12-26 17:15 • 来自相关话题

  浏览器抓取网页(查找引擎页面作业靠蜘蛛(Spider)来核算链接权重)
  搜索引擎看似简单的爬取-放养-查询操作,但每个链接所隐含的算法却非常复杂。
  搜索引擎抓取页面是由蜘蛛完成的。爬行动作很简单就可以完成。但是,要爬取哪些页面,先爬取哪些页面,则需要由算法来决定。以下是一些爬行算法:
  1、宽度优先的爬取策略:
  我们都知道大多数网站都是按照树状图来完成页面分布的,那么在树状图链接结构中,哪些页面会先被抓取呢?为什么要先抓取这些页面?广度优先爬取策略是按照树状结构先爬取同级链接,等同级链接爬取完成后再爬取下一级链接。
  我们可以发现,当我陈述时,我使用了链接结构而不是网站结构。此处的链接结构可以收录
指向任何页面的链接,不一定是网站上的内部链接。这是一种理想化的广度优先爬行策略。在实际爬取过程中,不可能想到这么彻底的广度优先,而是有限的广度优先。
  2、 不完整的遍历链接权重计算:
  每个搜索引擎都有一套pagerank(指页面权重,非google PR)计算方法,并且经常更新。互联网几乎是无限的,每天都会出现大量的新链接。搜索引擎对链接权重的计算只能彻底遍历对错。为什么 Google PR 需要每三个月更新一次?为什么百度一个月更新1-2两次?这是因为搜索引擎使用非穷举的遍历链接权重算法来计算链接权重。其实按照现在的技能,完成更快的权重更新并不难。计算速度和存储速度完全可以跟得上,但为什么不这样做呢?既然不是那么必要,现在可能已经结束了,但我不想宣布。然后,
  为什么阻尼系数乘以网站数量?由于并非页面内的所有页面都参与权重转移,因此搜索引擎将再次删除 15% 的已过滤链接。
  但是这种非穷举的遍历权重计算需要积累一定的链接数才能再次开始计算,所以一般更新周期比较慢,不能满足用户对即时信息的需求。因此在此基础上,提出了一种实时权重分布捕获策略。即当蜘蛛爬完页面进入后,立即进行权重分配,将权重重新分配给要爬取的链接库,然后根据权重凹凸进行爬取。
  3、社会工程学抓策略
  社会工程学的策略是参与人工智能,或许是人工智能训练出来的机器智能,在蜘蛛爬行过程中决定爬行的优先级。我现在知道的爬取策略是:
  一个。热门优先策略:优先抓取爆款热门关键词,不需要经过严格的去重和过滤,因为会有新的链接覆盖和用户自动选择。
  湾 威望优先策略:搜索引擎会为每个网站分配一个威望度,通过网站历史、网站更新等来确定该网站的威望度,优先抓取威望高的网站链接。
  C。用户点击策略:当大多数在专业词库中搜索关键词时,频繁点击同一网站的搜索结果,搜索引擎会更频繁地抓取该网站。
  d. 历史参考策略:对于坚持频繁更新的网站,搜索引擎会为该网站建立一个更新历史,并根据更新历史估计未来的更新量并确定抓取频率。
  SEO作业辅导:
  搜索引擎的爬取原理已经讲得很深入了,下面就来解释一下这些原理对SEO作业的辅导效果:
  A. 准时、定量的更新会让蜘蛛按时抓取网站页面;
  B. 公司网站比个人网站有更高的声望;
  C. 建站时间长的网站更容易被爬取;
  D. 链接在页面内要适当传播,过多或过少都不好;
  E. 受用户喜爱的网站也受搜索引擎喜爱;
  F. 重要页面应放在较浅的网站结构中;
  G. 网站中的专业声望信息将提高网站的声望。
  成都网站建设公司_创信互联网,为您提供营销型网站建设、网站改版、网站收录、微信小程序、小程序开发、自适应网站 查看全部

  浏览器抓取网页(查找引擎页面作业靠蜘蛛(Spider)来核算链接权重)
  搜索引擎看似简单的爬取-放养-查询操作,但每个链接所隐含的算法却非常复杂。
  搜索引擎抓取页面是由蜘蛛完成的。爬行动作很简单就可以完成。但是,要爬取哪些页面,先爬取哪些页面,则需要由算法来决定。以下是一些爬行算法:
  1、宽度优先的爬取策略:
  我们都知道大多数网站都是按照树状图来完成页面分布的,那么在树状图链接结构中,哪些页面会先被抓取呢?为什么要先抓取这些页面?广度优先爬取策略是按照树状结构先爬取同级链接,等同级链接爬取完成后再爬取下一级链接。
  我们可以发现,当我陈述时,我使用了链接结构而不是网站结构。此处的链接结构可以收录
指向任何页面的链接,不一定是网站上的内部链接。这是一种理想化的广度优先爬行策略。在实际爬取过程中,不可能想到这么彻底的广度优先,而是有限的广度优先。
  2、 不完整的遍历链接权重计算:
  每个搜索引擎都有一套pagerank(指页面权重,非google PR)计算方法,并且经常更新。互联网几乎是无限的,每天都会出现大量的新链接。搜索引擎对链接权重的计算只能彻底遍历对错。为什么 Google PR 需要每三个月更新一次?为什么百度一个月更新1-2两次?这是因为搜索引擎使用非穷举的遍历链接权重算法来计算链接权重。其实按照现在的技能,完成更快的权重更新并不难。计算速度和存储速度完全可以跟得上,但为什么不这样做呢?既然不是那么必要,现在可能已经结束了,但我不想宣布。然后,
  为什么阻尼系数乘以网站数量?由于并非页面内的所有页面都参与权重转移,因此搜索引擎将再次删除 15% 的已过滤链接。
  但是这种非穷举的遍历权重计算需要积累一定的链接数才能再次开始计算,所以一般更新周期比较慢,不能满足用户对即时信息的需求。因此在此基础上,提出了一种实时权重分布捕获策略。即当蜘蛛爬完页面进入后,立即进行权重分配,将权重重新分配给要爬取的链接库,然后根据权重凹凸进行爬取。
  3、社会工程学抓策略
  社会工程学的策略是参与人工智能,或许是人工智能训练出来的机器智能,在蜘蛛爬行过程中决定爬行的优先级。我现在知道的爬取策略是:
  一个。热门优先策略:优先抓取爆款热门关键词,不需要经过严格的去重和过滤,因为会有新的链接覆盖和用户自动选择。
  湾 威望优先策略:搜索引擎会为每个网站分配一个威望度,通过网站历史、网站更新等来确定该网站的威望度,优先抓取威望高的网站链接。
  C。用户点击策略:当大多数在专业词库中搜索关键词时,频繁点击同一网站的搜索结果,搜索引擎会更频繁地抓取该网站。
  d. 历史参考策略:对于坚持频繁更新的网站,搜索引擎会为该网站建立一个更新历史,并根据更新历史估计未来的更新量并确定抓取频率。
  SEO作业辅导:
  搜索引擎的爬取原理已经讲得很深入了,下面就来解释一下这些原理对SEO作业的辅导效果:
  A. 准时、定量的更新会让蜘蛛按时抓取网站页面;
  B. 公司网站比个人网站有更高的声望;
  C. 建站时间长的网站更容易被爬取;
  D. 链接在页面内要适当传播,过多或过少都不好;
  E. 受用户喜爱的网站也受搜索引擎喜爱;
  F. 重要页面应放在较浅的网站结构中;
  G. 网站中的专业声望信息将提高网站的声望。
  成都网站建设公司_创信互联网,为您提供营销型网站建设、网站改版、网站收录、微信小程序、小程序开发、自适应网站

浏览器抓取网页(如何自己制作一个动态字体,如何让屏幕使用这些字体?)

网站优化优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2021-12-25 15:08 • 来自相关话题

  浏览器抓取网页(如何自己制作一个动态字体,如何让屏幕使用这些字体?)
  浏览器抓取网页,字体变成横向或竖向,通过判断前景色和背景色,根据本身的类型对字体进行选择,处理出想要的效果。js多看看mdn和w3school就好了。
  css有marginflow属性,兼容性不是太好。百度了一下,发现monospace居然是一个算法,来实现字体的纵向居中。css里可以用其它方法实现相同效果,但是效率比较低。思路是:让网页中的文字部分向左浮动,同时让背景层浮动。然后直接用webgl用3d曲面方法合成阴影。本人试过效果不是很好,不是程序猿如果能找到合适的算法,应该能实现很好的效果。用到一点geometrydiff的知识。
  一行代码搞定!还带方向
  完美解决
  osx和mac的safari:[userselections]:webgl->margintext[userselections]:webgl->margin-text[userselections]:webgl->margin-text
  网页中使用webgl和d3库就能完美做到,尤其是用d3.js,还能自动根据当前的网页渲染。但是渲染之后还是png这点糟心。
  css3renderingmonospacepreferences(方向传递)-mdn
  我个人也不知道有什么具体可行的方法,webgl方向传递方法,或许有些不稳定因素。曾经回答过这个问题,现在来完善下。感谢daisy:daisy:如何自己制作一个动态字体,如何让屏幕使用这些字体?的回答,我用到了alfredium,wordcloud,magician.il(这个id也可以是其他任何类似id)。有些是完全可以调试的,也就是说可以编辑看到。 查看全部

  浏览器抓取网页(如何自己制作一个动态字体,如何让屏幕使用这些字体?)
  浏览器抓取网页,字体变成横向或竖向,通过判断前景色和背景色,根据本身的类型对字体进行选择,处理出想要的效果。js多看看mdn和w3school就好了。
  css有marginflow属性,兼容性不是太好。百度了一下,发现monospace居然是一个算法,来实现字体的纵向居中。css里可以用其它方法实现相同效果,但是效率比较低。思路是:让网页中的文字部分向左浮动,同时让背景层浮动。然后直接用webgl用3d曲面方法合成阴影。本人试过效果不是很好,不是程序猿如果能找到合适的算法,应该能实现很好的效果。用到一点geometrydiff的知识。
  一行代码搞定!还带方向
  完美解决
  osx和mac的safari:[userselections]:webgl->margintext[userselections]:webgl->margin-text[userselections]:webgl->margin-text
  网页中使用webgl和d3库就能完美做到,尤其是用d3.js,还能自动根据当前的网页渲染。但是渲染之后还是png这点糟心。
  css3renderingmonospacepreferences(方向传递)-mdn
  我个人也不知道有什么具体可行的方法,webgl方向传递方法,或许有些不稳定因素。曾经回答过这个问题,现在来完善下。感谢daisy:daisy:如何自己制作一个动态字体,如何让屏幕使用这些字体?的回答,我用到了alfredium,wordcloud,magician.il(这个id也可以是其他任何类似id)。有些是完全可以调试的,也就是说可以编辑看到。

浏览器抓取网页(Javascript在网页定位方面的相关知识在定位中的应用)

网站优化优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2021-12-21 19:18 • 来自相关话题

  浏览器抓取网页(Javascript在网页定位方面的相关知识在定位中的应用)
  下面的教程总结了网页定位中Javascript的相关知识。
  一、网页的绝对和相对大小
  首先,我们必须澄清两个基本概念。
  一个网页的总面积就是它的绝对大小。通常,网页的绝对大小由内容和 CSS 样式表决定。
  网页的相对大小是指在浏览器窗口中看到的网页部分,即浏览器窗口的大小,也称为视口。
  下图中央的方框代表浏览器窗口,一次只能显示网页的一部分。
  (图1网页的绝对和相对大小)
  显然,如果网页的内容可以在浏览器窗口中显示出来(即不出现滚动条),那么网页的绝对大小和相对大小是相等的。
  二、获取网页的相对大小
  网页上的每个元素都有 clientHeight 和 clientWidth 属性,您可以使用它们来获取网页的相对大小。这两个属性所代表的大小是指元素的内容部分加上padding的大小,但不包括边框和滚动条所占用的空间。
  (图 2 clientHeight 和 clientWidth 属性)
  因此,文档元素的 clientHeight 和 clientWidth 属性表示网页的相对大小。
  函数 getViewport(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.clientWidth,
  高度:document.body.clientHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.clientWidth,
  高度:document.documentElement.clientHeight
  }
  }
  }
  上面的getViewport函数可以返回浏览器窗口的高度和宽度。使用时,有三个地方需要注意:
  1)这个函数必须在页面加载完成后运行,否则文档对象还没有生成,浏览器会报错。
  2) 在大多数情况下,document.documentElement.clientWidth 返回正确的值。但是在IE6的quirks模式下,document.body.clientWidth返回的是正确的值,所以在函数中加入了文档模式的判断。
  3)clientWidth 和 clientHeight 都是只读属性,不能赋值。
  三、获取网页的绝对大小
  document对象的scrollHeight和scrollWidth属性是网页的绝对大小,即滚动条的所有长度和宽度。
  以 getViewport() 函数为模型,您可以编写 getPagearea() 函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.scrollWidth,
  高度:document.body.scrollHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.scrollWidth,
  高度:document.documentElement.scrollHeight
  }
  }
  }
  但是,这个功能有问题。前面说过,如果网页的内容可以在没有滚动条的浏览器窗口中显示,那么网页的绝对大小和相对大小应该相等,即clientWidth和scrollWidth应该相等。但实际上,不同浏览器的处理方式不同,这两个值可能并不相等。因此,我们需要取其中较大的值,因此需要重写getPagearea()函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:Math.max(document.body.scrollWidth,
  document.body.clientWidth),
  高度:Math.max(document.body.scrollHeight,
  文档.body.clientHeight)
  }
  } 别的 {
  返回 {
  宽度:Math.max(document.documentElement.scrollWidth,
  document.documentElement.clientWidth),
  高度:Math.max(document.documentElement.scrollHeight,
  document.documentElement.clientHeight)
  }
  }
  }
  四、获取网页元素的绝对位置
  由于网页的大小可以分为绝对和相对,因此网页元素的位置也可以分为绝对和相对。网页元素左上角相对于整个网页左上角的坐标为绝对位置;相对于浏览器窗口左上角的坐标是相对位置。
  在Javascript中,网页元素的绝对坐标只能通过计算来获得。每个元素都有 offsetTop 和 offsetLeft 属性,表示元素左上角到父容器(offsetParent 对象)左上角的距离。因此,只需要将这两个值累加就可以得到元素的绝对坐标。
  (图3 offsetTop和offsetLeft属性)
  可以使用以下两个函数来获取绝对位置的横坐标和纵坐标。
  函数getElementLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  返回实际左;
  }
  函数 getElementTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  返回实际顶部;
  }
  由于在tables和iframes中,offsetParent对象可能不等于父容器,所以上述函数不适用于tables和iframes中的元素。
  五、获取网页元素的相对位置
  一旦有了元素的绝对位置,就很容易得到相对位置,只需从绝对坐标中减去滚动条的距离即可。滚动条的垂直距离是文档对象的scrollTop属性;滚动条的水平距离是文档对象的 scrollLeft 属性。
  (图4 scrollTop和scrollLeft属性)
  相应地重写上一节中的两个函数:
  函数 getElementViewLeft(element){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollLeft=document.body.scrollLeft;
  } 别的 {
  var elementScrollLeft=document.documentElement.scrollLeft;
  }
  返回actualLeft-elementScrollLeft;
  }
  函数 getElementViewTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  实际顶部 += 当前。偏移顶部;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollTop=document.body.scrollTop;
  } 别的 {
  var elementScrollTop=document.documentElement.scrollTop;
  }
  返回actualTop-elementScrollTop;
  }
  scrollTop 和 scrollLeft 属性可以赋值,它们会立即自动将网页滚动到相应的位置,因此您可以使用它们来改变网页元素的相对位置。另外 element.scrollIntoView() 方法也有类似的效果,可以让网页元素出现在浏览器窗口的左上角。
  六、快速获取元素位置的方法
  除了上述功能外,还有一种快速获取网页元素位置的方法。
  即使用 getBoundingClientRect() 方法。它返回一个收录四个属性的对象:left、right、top和bottom,分别对应元素左上角和右下角相对于浏览器窗口(视口)左上角的距离。
  所以,网页元素的相对位置是
  var X = this.getBoundingClientRect().left;
  var Y =this.getBoundingClientRect().top;
  加上滚动距离,可以得到绝对位置
  var X = this.getBoundingClientRect().left+document.documentElement.scrollLeft;
  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
  目前IE、Firefox 3.0+、Opera 9.5+都支持这种方式,但Firefox 2.x、Safari、Chrome、Konqueror不支持。
  (结束) 查看全部

  浏览器抓取网页(Javascript在网页定位方面的相关知识在定位中的应用)
  下面的教程总结了网页定位中Javascript的相关知识。
  一、网页的绝对和相对大小
  首先,我们必须澄清两个基本概念。
  一个网页的总面积就是它的绝对大小。通常,网页的绝对大小由内容和 CSS 样式表决定。
  网页的相对大小是指在浏览器窗口中看到的网页部分,即浏览器窗口的大小,也称为视口。
  下图中央的方框代表浏览器窗口,一次只能显示网页的一部分。
  (图1网页的绝对和相对大小)
  显然,如果网页的内容可以在浏览器窗口中显示出来(即不出现滚动条),那么网页的绝对大小和相对大小是相等的。
  二、获取网页的相对大小
  网页上的每个元素都有 clientHeight 和 clientWidth 属性,您可以使用它们来获取网页的相对大小。这两个属性所代表的大小是指元素的内容部分加上padding的大小,但不包括边框和滚动条所占用的空间。
  (图 2 clientHeight 和 clientWidth 属性)
  因此,文档元素的 clientHeight 和 clientWidth 属性表示网页的相对大小。
  函数 getViewport(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.clientWidth,
  高度:document.body.clientHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.clientWidth,
  高度:document.documentElement.clientHeight
  }
  }
  }
  上面的getViewport函数可以返回浏览器窗口的高度和宽度。使用时,有三个地方需要注意:
  1)这个函数必须在页面加载完成后运行,否则文档对象还没有生成,浏览器会报错。
  2) 在大多数情况下,document.documentElement.clientWidth 返回正确的值。但是在IE6的quirks模式下,document.body.clientWidth返回的是正确的值,所以在函数中加入了文档模式的判断。
  3)clientWidth 和 clientHeight 都是只读属性,不能赋值。
  三、获取网页的绝对大小
  document对象的scrollHeight和scrollWidth属性是网页的绝对大小,即滚动条的所有长度和宽度。
  以 getViewport() 函数为模型,您可以编写 getPagearea() 函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.scrollWidth,
  高度:document.body.scrollHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.scrollWidth,
  高度:document.documentElement.scrollHeight
  }
  }
  }
  但是,这个功能有问题。前面说过,如果网页的内容可以在没有滚动条的浏览器窗口中显示,那么网页的绝对大小和相对大小应该相等,即clientWidth和scrollWidth应该相等。但实际上,不同浏览器的处理方式不同,这两个值可能并不相等。因此,我们需要取其中较大的值,因此需要重写getPagearea()函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:Math.max(document.body.scrollWidth,
  document.body.clientWidth),
  高度:Math.max(document.body.scrollHeight,
  文档.body.clientHeight)
  }
  } 别的 {
  返回 {
  宽度:Math.max(document.documentElement.scrollWidth,
  document.documentElement.clientWidth),
  高度:Math.max(document.documentElement.scrollHeight,
  document.documentElement.clientHeight)
  }
  }
  }
  四、获取网页元素的绝对位置
  由于网页的大小可以分为绝对和相对,因此网页元素的位置也可以分为绝对和相对。网页元素左上角相对于整个网页左上角的坐标为绝对位置;相对于浏览器窗口左上角的坐标是相对位置。
  在Javascript中,网页元素的绝对坐标只能通过计算来获得。每个元素都有 offsetTop 和 offsetLeft 属性,表示元素左上角到父容器(offsetParent 对象)左上角的距离。因此,只需要将这两个值累加就可以得到元素的绝对坐标。
  (图3 offsetTop和offsetLeft属性)
  可以使用以下两个函数来获取绝对位置的横坐标和纵坐标。
  函数getElementLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  返回实际左;
  }
  函数 getElementTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  返回实际顶部;
  }
  由于在tables和iframes中,offsetParent对象可能不等于父容器,所以上述函数不适用于tables和iframes中的元素。
  五、获取网页元素的相对位置
  一旦有了元素的绝对位置,就很容易得到相对位置,只需从绝对坐标中减去滚动条的距离即可。滚动条的垂直距离是文档对象的scrollTop属性;滚动条的水平距离是文档对象的 scrollLeft 属性。
  (图4 scrollTop和scrollLeft属性)
  相应地重写上一节中的两个函数:
  函数 getElementViewLeft(element){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollLeft=document.body.scrollLeft;
  } 别的 {
  var elementScrollLeft=document.documentElement.scrollLeft;
  }
  返回actualLeft-elementScrollLeft;
  }
  函数 getElementViewTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  实际顶部 += 当前。偏移顶部;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollTop=document.body.scrollTop;
  } 别的 {
  var elementScrollTop=document.documentElement.scrollTop;
  }
  返回actualTop-elementScrollTop;
  }
  scrollTop 和 scrollLeft 属性可以赋值,它们会立即自动将网页滚动到相应的位置,因此您可以使用它们来改变网页元素的相对位置。另外 element.scrollIntoView() 方法也有类似的效果,可以让网页元素出现在浏览器窗口的左上角。
  六、快速获取元素位置的方法
  除了上述功能外,还有一种快速获取网页元素位置的方法。
  即使用 getBoundingClientRect() 方法。它返回一个收录四个属性的对象:left、right、top和bottom,分别对应元素左上角和右下角相对于浏览器窗口(视口)左上角的距离。
  所以,网页元素的相对位置是
  var X = this.getBoundingClientRect().left;
  var Y =this.getBoundingClientRect().top;
  加上滚动距离,可以得到绝对位置
  var X = this.getBoundingClientRect().left+document.documentElement.scrollLeft;
  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
  目前IE、Firefox 3.0+、Opera 9.5+都支持这种方式,但Firefox 2.x、Safari、Chrome、Konqueror不支持。
  (结束)

浏览器抓取网页(Fatkun批量图片下载工具(、edge浏览器扩展插件)图片批量下载)

网站优化优采云 发表了文章 • 0 个评论 • 288 次浏览 • 2021-12-21 19:18 • 来自相关话题

  浏览器抓取网页(Fatkun批量图片下载工具(、edge浏览器扩展插件)图片批量下载)
  Fatkun 批量图片下载工具(Chrome、边缘浏览器扩展)
  Fatkun 图片批量下载是适用于 Google Chrome 的免费且易于使用的 Chrome 扩展程序。它可以帮助您查找当前页面上的所有图片,您可以根据图片分辨率、链接等过滤图片,或自由点击。选择,最后一个键保存所有图片。
  安装Fatkun图片批量下载插件后,点击任意网页工具栏中的图标,会询问是下载所有标签页图片还是只下载当前标签页图片(如下图) ),也可以使用Alt+Z快捷键快速抓取当前标签的图片。
  
  在你要批量下载图片的网页上点击Fatkun插件后,它会帮你抓取页面上的所有图片,如下图所示,点击“保存图片”按钮进行下载和批量保存所有图片。
  
  可以看出,Fatkun图片批量下载插件还为我们提供了按图片分辨率大小过滤的功能(设置最小宽度和最小高度)和根据图片链接地址过滤的功能。合理的设置可以有效避免批量下载时在网站上下载一些无关图片如表情、缩略图、小装饰图标的尴尬。
  另外,点击“选项”后,Fatkun图片批量下载插件还可以设置按网页顺序重命名文件,或者将所有图片的链接导出到一个列表中以供其他方式使用,比如使用迅雷进行批量下载下载等等,还是很方便的。
  PS:最好等到页面完全加载完毕,再点击按钮批量下载图片,否则可能会出现抓取不完整或顺序不正确的问题。另外需要注意的是,在使用插件之前,请在浏览器设置中取消勾选“下载前询问每个文件的保存位置”,否则批量下载时会弹出大量保存框。
  img2tab-在新标签页中列出当前页面中的所有图片(支持Chrome和Firefox)
  严格来说,img2tab 并不是专门用于批量下载图片的扩展。顾名思义,它的功能就是抓取网页上的所有图片,然后按照新标签页上图片的顺序一一展示。
  但它的应用场景也很多。例如,一些网站 排版不佳,许多广告文字杂乱。这时候我们就可以用img2tab把所有的图片都提取出来放到一个新的页面上慢慢看。或者,在图片目录/相册列表等一些网页上,您也可以使用它来将所有图片提取到一个地方,而无需一一点击。
  
  当然,抓取图片后,我们也可以利用浏览器的“页面另存为...”功能,接受所有图片,实现“曲线”批量下载。
  img2tab 支持 Chrome 和 Firefox 浏览器。安装后会出现在网页的右键菜单中。有两种显示图像的方式,即“实际图像”和“链接图像”。前者是提取页面实际显示的图片,后者是提取链接所指向的图片(比如一个缩略图实际上显示在很多页面上,但是缩略图会有原创图片的链接,此功能将提取原创图片)。另外,单标签是指在一个标签页中显示所有图片,而没有单标签的选项是为每张图片创建一个新的标签页。 查看全部

  浏览器抓取网页(Fatkun批量图片下载工具(、edge浏览器扩展插件)图片批量下载)
  Fatkun 批量图片下载工具(Chrome、边缘浏览器扩展)
  Fatkun 图片批量下载是适用于 Google Chrome 的免费且易于使用的 Chrome 扩展程序。它可以帮助您查找当前页面上的所有图片,您可以根据图片分辨率、链接等过滤图片,或自由点击。选择,最后一个键保存所有图片。
  安装Fatkun图片批量下载插件后,点击任意网页工具栏中的图标,会询问是下载所有标签页图片还是只下载当前标签页图片(如下图) ),也可以使用Alt+Z快捷键快速抓取当前标签的图片。
  https://img.iplaysoft.com/wp-c ... .webp 2x" />
  在你要批量下载图片的网页上点击Fatkun插件后,它会帮你抓取页面上的所有图片,如下图所示,点击“保存图片”按钮进行下载和批量保存所有图片。
  https://img.iplaysoft.com/wp-c ... .webp 2x" />
  可以看出,Fatkun图片批量下载插件还为我们提供了按图片分辨率大小过滤的功能(设置最小宽度和最小高度)和根据图片链接地址过滤的功能。合理的设置可以有效避免批量下载时在网站上下载一些无关图片如表情、缩略图、小装饰图标的尴尬。
  另外,点击“选项”后,Fatkun图片批量下载插件还可以设置按网页顺序重命名文件,或者将所有图片的链接导出到一个列表中以供其他方式使用,比如使用迅雷进行批量下载下载等等,还是很方便的。
  PS:最好等到页面完全加载完毕,再点击按钮批量下载图片,否则可能会出现抓取不完整或顺序不正确的问题。另外需要注意的是,在使用插件之前,请在浏览器设置中取消勾选“下载前询问每个文件的保存位置”,否则批量下载时会弹出大量保存框。
  img2tab-在新标签页中列出当前页面中的所有图片(支持Chrome和Firefox)
  严格来说,img2tab 并不是专门用于批量下载图片的扩展。顾名思义,它的功能就是抓取网页上的所有图片,然后按照新标签页上图片的顺序一一展示。
  但它的应用场景也很多。例如,一些网站 排版不佳,许多广告文字杂乱。这时候我们就可以用img2tab把所有的图片都提取出来放到一个新的页面上慢慢看。或者,在图片目录/相册列表等一些网页上,您也可以使用它来将所有图片提取到一个地方,而无需一一点击。
  https://img.iplaysoft.com/wp-c ... .webp 2x" />
  当然,抓取图片后,我们也可以利用浏览器的“页面另存为...”功能,接受所有图片,实现“曲线”批量下载。
  img2tab 支持 Chrome 和 Firefox 浏览器。安装后会出现在网页的右键菜单中。有两种显示图像的方式,即“实际图像”和“链接图像”。前者是提取页面实际显示的图片,后者是提取链接所指向的图片(比如一个缩略图实际上显示在很多页面上,但是缩略图会有原创图片的链接,此功能将提取原创图片)。另外,单标签是指在一个标签页中显示所有图片,而没有单标签的选项是为每张图片创建一个新的标签页。

浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)

网站优化优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2021-12-17 21:18 • 来自相关话题

  浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
  urllib.error.HTTPError:HTTP 错误 403:禁止
  从403 Forbidden我们可以发现,此时网站是禁止程序访问的。这是因为csdn网站 设置了反爬虫机制。当网站检测到爬虫时,访问会被拒绝,所以我们会得到上面的结果。
  这时候就需要模拟浏览器访问,以避免网站的反爬虫机制,然后顺利抓取到我们想要的内容。
  接下来,我们将使用魔法库 urllib.request.Request 进行我们的模拟工作。这次我们也会先上传代码,然后再解释,不过这次要提醒大家的是,下面的代码不能直接使用。my_headers 中的 User-Agent 替换为我自己的。因为为了保密我加了省略号,不能直接使用。更换方法如下图所示。这次为了使用方便,我们引入一个函数:
  #coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/")
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  使用上面的代码,我们就可以正常的抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
  由于我们要模拟一个浏览器进行网页访问,这些参数自然需要我们在浏览器中搜索。
  首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下图框,然后我们点击Network,然后我们会发现没有我们页面的信息都打开了,没关系,这时候我们刷新页面的时候,就会出现下图所示的信息。
  
  这时候我们会在第一行看到51251757,就是我们网页网址后面的标签。这时候我们点击这个标签,就会出现下图所示的内容:
  
  下面是我直接访问这个网址时得到的截图:
  
  前两张图,之前写过版本2的访问,现在直接用了。当时我在csdn主页上点了这个博客,所以在代码中的header里填了referer和前两张图。是的
  ,而且这张图是我直接通过URL链接进入浏览器访问的,所以从图中可以看出referer是,这是我们的网站,贴在这里是为了让大家更好的了解这个referer。不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候一定不要用我给的User-Agent,因为我用省略号代替了一些。每个人都需要用自己的方式来弥补。
  这时候我们就会发现Headers,是不是有一种豁然开朗的感觉?是的,你的直觉是对的,我们需要的信息在这个标题中。
  然后,根据代码中需要的参数,把信息复制回来就可以使用了,因为这里显示的信息正好对应了key值,所以我们复制使用起来非常方便。
  下面介绍一下这个urllib.request.Request的用法(从官方文档翻译过来的):
  类 urllib.request。request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) 参数: url:不用说,这是我们即将访问的URL,是一个字符串。data:数据必须是一个字节对象,它指定要发送到服务器的附加数据,如果不需要,则为 None。目前,只有 HTTP 请求使用数据;当提供数据参数时,http 请求应该是 post 而不是 get。数据应以标准 application/x-www-form-urlencoded 格式进行缓冲。urllib.parse.urlencode() 函数的参数是一个映射或二进制序列,并以这种格式返回一个 ASCII 字符串。当它用作数据参数时,它应该被编码为字节。(我们暂时不需要这个,不用管它) headers: headers 是字典数据。当使用键和值参数调用 add_header() 时,此标头将作为请求进行处理。此标头通常用于防止爬虫访问服务器。头部是浏览器用来标识自己的,因为有些HTTP服务器只允许来自普通浏览器的请求而不是脚本(可以理解为爬虫)。
  这必然会增加网站服务器的处理负担,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以爬虫检测机制不是越严格越好,必须考虑服务器的负担。origin_req_host: origin_req_host 应该是发出原创事务请求的主机,RFC 2965 定义了它。它默认为 http.cookiejar.request_host(self)。
  这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是对收录图像的页面的请求的主机。(我们一般不使用这个,这里就知道了) unverifiable: unverifiable 应该表示请求是否是不可验证的,由RFC 2965定义,默认值为false。无法验证的请求意味着无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器上取回图片时,此时unverifiable值应该为true。method:method 应该是一个字符串,指示将使用 HTTP 请求方法(例如,“header”)。如果提供,它的值存储在方法属性中并由方法 get_method() 调用。子类可以通过在类中设置方法属性来指示默认方法。(这个我基本不会用。)说了这么多无聊的定义,我自己也受不了翻译了。让我们继续回到我们的程序:对于我们的程序,只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。
  req.add_header("User-Agent", random_header) 告诉网络服务器我是通过浏览器访问它,我不是爬虫。req.add_header("GET",url) 告诉浏览器我们正在访问的URL,req.add_header("Host","") 这是网站的信息,我们取自网站@ > 填写即可。这句话req.add_header("Referer","") 很重要。它告诉 网站 服务器我们在哪里找到了我们想要访问的网页。比如你点击了百度,如果一个链接跳转到当前访问的页面,那么referer就是百度中的链接,这是一个判断机制。对于 header 构造方法也可以这样做:
  #coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/")
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  从上面的程序中可以看出,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent是硬编码的。其实我们可以发现,对于不同的主机访问同一个网页时,我们的另外三个信息:GET、Host、Referer可能都是一样的,而此时仅以User-Agent作为判断标准用户的异同,那么问题来了,如果我们向同学“借”一些User-Agents来使用,是不是模拟多个用户访问?是不是更酷。其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agents,然后通过random函数随机选择一个组合起来创建一个用户。多人访问的错觉其实很有用。要知道,对于网站来说,访问过多会阻塞用户的ip。这不好玩,所以想要永久访问一个网站而不被屏蔽,还是需要很多技巧的。
  当我们要爬取一个网站的多个网页时,很容易被网站检测到,由于主机频繁访问,进而被拦截。而如果我们在列表中放更多不同的主机号并随机使用它们,是不是很容易被发现?当然,当我们防止这种情况时,更好的方法是使用IP代理,因为我们不容易获得很多主机信息,而IP代理很容易从互联网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。 查看全部

  浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
  urllib.error.HTTPError:HTTP 错误 403:禁止
  从403 Forbidden我们可以发现,此时网站是禁止程序访问的。这是因为csdn网站 设置了反爬虫机制。当网站检测到爬虫时,访问会被拒绝,所以我们会得到上面的结果。
  这时候就需要模拟浏览器访问,以避免网站的反爬虫机制,然后顺利抓取到我们想要的内容。
  接下来,我们将使用魔法库 urllib.request.Request 进行我们的模拟工作。这次我们也会先上传代码,然后再解释,不过这次要提醒大家的是,下面的代码不能直接使用。my_headers 中的 User-Agent 替换为我自己的。因为为了保密我加了省略号,不能直接使用。更换方法如下图所示。这次为了使用方便,我们引入一个函数:
  #coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/";)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  使用上面的代码,我们就可以正常的抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
  由于我们要模拟一个浏览器进行网页访问,这些参数自然需要我们在浏览器中搜索。
  首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下图框,然后我们点击Network,然后我们会发现没有我们页面的信息都打开了,没关系,这时候我们刷新页面的时候,就会出现下图所示的信息。
  
  这时候我们会在第一行看到51251757,就是我们网页网址后面的标签。这时候我们点击这个标签,就会出现下图所示的内容:
  
  下面是我直接访问这个网址时得到的截图:
  
  前两张图,之前写过版本2的访问,现在直接用了。当时我在csdn主页上点了这个博客,所以在代码中的header里填了referer和前两张图。是的
  ,而且这张图是我直接通过URL链接进入浏览器访问的,所以从图中可以看出referer是,这是我们的网站,贴在这里是为了让大家更好的了解这个referer。不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候一定不要用我给的User-Agent,因为我用省略号代替了一些。每个人都需要用自己的方式来弥补。
  这时候我们就会发现Headers,是不是有一种豁然开朗的感觉?是的,你的直觉是对的,我们需要的信息在这个标题中。
  然后,根据代码中需要的参数,把信息复制回来就可以使用了,因为这里显示的信息正好对应了key值,所以我们复制使用起来非常方便。
  下面介绍一下这个urllib.request.Request的用法(从官方文档翻译过来的):
  类 urllib.request。request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) 参数: url:不用说,这是我们即将访问的URL,是一个字符串。data:数据必须是一个字节对象,它指定要发送到服务器的附加数据,如果不需要,则为 None。目前,只有 HTTP 请求使用数据;当提供数据参数时,http 请求应该是 post 而不是 get。数据应以标准 application/x-www-form-urlencoded 格式进行缓冲。urllib.parse.urlencode() 函数的参数是一个映射或二进制序列,并以这种格式返回一个 ASCII 字符串。当它用作数据参数时,它应该被编码为字节。(我们暂时不需要这个,不用管它) headers: headers 是字典数据。当使用键和值参数调用 add_header() 时,此标头将作为请求进行处理。此标头通常用于防止爬虫访问服务器。头部是浏览器用来标识自己的,因为有些HTTP服务器只允许来自普通浏览器的请求而不是脚本(可以理解为爬虫)。
  这必然会增加网站服务器的处理负担,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以爬虫检测机制不是越严格越好,必须考虑服务器的负担。origin_req_host: origin_req_host 应该是发出原创事务请求的主机,RFC 2965 定义了它。它默认为 http.cookiejar.request_host(self)。
  这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是对收录图像的页面的请求的主机。(我们一般不使用这个,这里就知道了) unverifiable: unverifiable 应该表示请求是否是不可验证的,由RFC 2965定义,默认值为false。无法验证的请求意味着无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器上取回图片时,此时unverifiable值应该为true。method:method 应该是一个字符串,指示将使用 HTTP 请求方法(例如,“header”)。如果提供,它的值存储在方法属性中并由方法 get_method() 调用。子类可以通过在类中设置方法属性来指示默认方法。(这个我基本不会用。)说了这么多无聊的定义,我自己也受不了翻译了。让我们继续回到我们的程序:对于我们的程序,只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。
  req.add_header("User-Agent", random_header) 告诉网络服务器我是通过浏览器访问它,我不是爬虫。req.add_header("GET",url) 告诉浏览器我们正在访问的URL,req.add_header("Host","") 这是网站的信息,我们取自网站@ > 填写即可。这句话req.add_header("Referer","") 很重要。它告诉 网站 服务器我们在哪里找到了我们想要访问的网页。比如你点击了百度,如果一个链接跳转到当前访问的页面,那么referer就是百度中的链接,这是一个判断机制。对于 header 构造方法也可以这样做:
  #coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/";)
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  从上面的程序中可以看出,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent是硬编码的。其实我们可以发现,对于不同的主机访问同一个网页时,我们的另外三个信息:GET、Host、Referer可能都是一样的,而此时仅以User-Agent作为判断标准用户的异同,那么问题来了,如果我们向同学“借”一些User-Agents来使用,是不是模拟多个用户访问?是不是更酷。其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agents,然后通过random函数随机选择一个组合起来创建一个用户。多人访问的错觉其实很有用。要知道,对于网站来说,访问过多会阻塞用户的ip。这不好玩,所以想要永久访问一个网站而不被屏蔽,还是需要很多技巧的。
  当我们要爬取一个网站的多个网页时,很容易被网站检测到,由于主机频繁访问,进而被拦截。而如果我们在列表中放更多不同的主机号并随机使用它们,是不是很容易被发现?当然,当我们防止这种情况时,更好的方法是使用IP代理,因为我们不容易获得很多主机信息,而IP代理很容易从互联网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。

浏览器抓取网页(网页开发时需要操作相同类名的元素,不足之处的方法)

网站优化优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-12-15 20:03 • 来自相关话题

  浏览器抓取网页(网页开发时需要操作相同类名的元素,不足之处的方法)
  在网页开发中,我们经常需要对具有相同类名的元素进行操作,即具有相同类名的元素。在昨天的笔试中,我没有回答一个相关的问题:
  JavaScript获取页面中带有类test的节点
  因此,本文采集了一些相关资料,列举了两种较好的方法和不足之处。我希望你能批评和纠正他们。如果你有更好的方法,我希望你能分享
  解决方案1 Jeremy keuth解决方案
  Jeremy keuth叔叔在《JavaScript DOM编程艺术》(第二版)(英文:使用JavaScript和文档对象模型编写DOM脚本的web设计)第3章第4节中谈到了getelementsbyclass方法,以及如何在不支持此属性的浏览器(IE6、IE7和IE8,让我们瞧不起它们)中使用此方法,此处摘录并在某些地方进行了修改
  HTML5DOM中的一个新方法允许我们通过class属性中的类名访问元素,即getelementsbyclassname。由于该方法相对较新,因此在某些DOM实现中不可用,因此在使用它时应小心。让我们看看这个方法能为我们做什么,然后讨论如何可靠地使用这个方法
  与getElementsByTagName方法类似,getelementsbyclassname只接受一个参数,即类名:
  副本代码如下:
  getElementsByClassName(类)
  此方法的返回值类似于getElementsByTagName。它是具有相同类名的元素数组。以下代码行返回一个数组,其中收录类名为“sale”的所有元素:
  副本代码如下:
  文件。getElementsByClassName(“销售”)
  使用此方法,还可以查找具有多个类名的元素。要指定多个类名,只需在字符串参数中用空格分隔类名。例如,在
  您将在警告框中看到1,表示只有一个元素匹配,因为只有一个元素同时具有“重要”和“销售”类名。请注意,即使元素的class属性中类名的顺序是“sale-important”,而不是参数中指定的“重要sale”,元素仍将匹配。不仅类名的实际顺序无关紧要,元素是否有更多的类名也无关紧要。与getElementsByTagName一样,getelementsbyclassname和getelementbyid可以组合使用。如果您想知道ID为purchase的元素中有多少类名收录test的列表项,可以先找到特定的对象,然后调用getelementsbyclassname:
  副本代码如下:
  var购物=文档。getElementById(“购买”)
  var销售=购物。getElementsByClassName(“出售”)
  这样,sales数组只收录“purchase”列表中具有“sales”类的元素。运行以下代码行以查看sales数组收录两项:
  副本代码如下:
  警报(sales.length)
  这个getElementsByCassName方法非常有用,但它只受较新浏览器(Safari3.1、chorme、Firefox 3和opera9.5及更高版本)的支持。为了弥补这一不足,DOM脚本程序员需要使用现有的DOM方法来实现他们自己的GetElementsByCassName,这有点像成年礼。在大多数情况下,它们的实现过程大致类似于下面的getelementsbyclassname。此功能可应用于新浏览器和旧浏览器
  副本代码如下:
  函数getElementsByClassName(节点,类名){
  if(node.getElementsByClassName){
  返回节点。getElementsByClassName(类名称)
  }否则{
  var结果=[]
  var elems=节点。getElementsByTagName(“*”)
  for(var i=0;i if(elems[i].className.indexOf(className)!=-1){
  结果[结果.长度]=元素[i]
  }
  }
  返回结果
  }
  }
  getelementsbyclassname函数接受两个参数。第一个节点表示DOM树中的搜索起点,第二个类名是要搜索的类名。如果传入节点上已经存在相应的getelementsbyclassname函数,则新函数将直接返回相应的节点列表。如果getElementsByCassName函数不存在,新函数将遍历所有标记以查找具有相应类名的元素
  此方法的缺点是它不适用于多个类名
  如果您使用此函数模拟之前获取购物清单的操作,则可以编写如下:
  副本代码如下:
  var购物=文档。getElementById(“购买”)
  var销售=购物。getElementsByClassName(购物,“测试”)
  控制台。日志(销售)
  因此,要解决文章开头的问题,代码如下:
  副本代码如下:
  买什么
  别忘了买这东西
  解决方案2罗伯特·尼曼解决方案
  有许多方法可以搜索匹配的DOM元素,但很少有真正有效的方法。Jeremy keuth叔叔的方法有一个缺点,即它不能用于多个类名。2008年,Robert Nyman在文章最终的getelements byclassname中提供了自己的解决方案,anno 2008。2005年,罗伯特叔叔给出了他自己的getelementsbyclassname函数。2008年,他修改了一些代码并添加了许多新功能:
  1.如果当前浏览器支持GetElementsByCassName函数,请调用本机函数
  2.如果当前浏览器支持XPath,请使用它//Little flying fish:查找浏览器中内置的XML文档的强大方法,但浏览器支持并不统一
  3.支持搜索多个类名,而不考虑顺序
  4.返回一个真实的节点数组,而不是本机节点列表//Little flying fish:本机getElementsByCassName方法返回一个类似于数组的节点列表对象。它具有长度和数字索引属性,但不是数组。无法使用特定于数组的方法,如pop和push。在Robert提供的代码中,NodeList对象被转换为数组。将节点列表对象转换为数组的方法:
  副本代码如下:
  myList=数组。原型片呼叫(myNodeList)
  这是罗伯特叔叔的方法。有些地方我不太懂。我会在研究之后更新它
  副本代码如下:
  /*
  由Robert Nyman开发
  代码/许可证:
  */
  var getElementsByClassName=函数(类名、标记、elm){
  if(document.getElementsByClassName){
  getElementsByCassName=函数(类名、标记、elm){
  elm=elm | |文件
  var元素=elm。getElementsByClassName(类名称)
  节点名=(标记)?新的RegExp(“\\b”+标记+”\\b,“i”):null
  returnElements=[]
  电流
  对于(var i=0,il=elements.length;icurrent=elements[i]
  如果(!nodeName | | nodeName.test(current.nodeName)){
  返回元素。推动(电流)
  }
  }
  返回元素
  })
  }
  else if(文档评估){
  getElementsByCassName=函数(类名、标记、elm){
  标记=标记| |“*”
  elm=elm | |文件
  var classes=className。拆分(“”)
  classesToCheck=“”
  xhtmlNamespace=“”
  namespaceResolver=(document.documentElement.namespaceURI==xhtmlNamespace)?xhtmlNamespace:null
  returnElements=[]
  元素
  节点
  对于(var j=0,jl=classes.length;jclassesToCheck+=”[收录(concat(“”,@class'),“+classes[j]+”)]”
  }
  试一试{
  元素=文档。求值(“./”+标记+classesToCheck,elm,namespacesolver,0,null)
  }
  捕获(e){
  元素=文档。求值(“./”+标记+classesToCheck,elm,null,0,null)
  }
  while((node=elements.iterateNext()){
  返回元素。推送(节点)
  }
  返回元素
  })
  }
  否则{
  getElementsByCassName=函数(类名、标记、elm){
  标记=标记| |“*”
  elm=elm | |文件
  var classes=className。拆分(“”)
  classesToCheck=[]
  元素=(标记==“*”&&elm.all)?榆树所有人:埃尔姆。getElementsByTagName(标记)
  现在,
  returnElements=[]
  匹配
  对于(var k=0,kl=classes.length;kclassesToCheck.push(新的RegExp(“(^ |\\s)”+classes[k]+”(\\s |$)))
  }
  对于(var l=0,ll=elements.length;LCCurrent=elements[l]
  匹配=假
  for(var m=0,ml=classesToCheck.length;mmatch=classesToCheck[m].test(current.className)
  如果(!匹配){
  中断
  }
  }
  如果(匹配){
  返回元素。推动(电流)
  }
  }
  返回元素
  })
  }
  返回getElementsByClassName(className,tag,elm)
  }) 查看全部

  浏览器抓取网页(网页开发时需要操作相同类名的元素,不足之处的方法)
  在网页开发中,我们经常需要对具有相同类名的元素进行操作,即具有相同类名的元素。在昨天的笔试中,我没有回答一个相关的问题:
  JavaScript获取页面中带有类test的节点
  因此,本文采集了一些相关资料,列举了两种较好的方法和不足之处。我希望你能批评和纠正他们。如果你有更好的方法,我希望你能分享
  解决方案1 Jeremy keuth解决方案
  Jeremy keuth叔叔在《JavaScript DOM编程艺术》(第二版)(英文:使用JavaScript和文档对象模型编写DOM脚本的web设计)第3章第4节中谈到了getelementsbyclass方法,以及如何在不支持此属性的浏览器(IE6、IE7和IE8,让我们瞧不起它们)中使用此方法,此处摘录并在某些地方进行了修改
  HTML5DOM中的一个新方法允许我们通过class属性中的类名访问元素,即getelementsbyclassname。由于该方法相对较新,因此在某些DOM实现中不可用,因此在使用它时应小心。让我们看看这个方法能为我们做什么,然后讨论如何可靠地使用这个方法
  与getElementsByTagName方法类似,getelementsbyclassname只接受一个参数,即类名:
  副本代码如下:
  getElementsByClassName(类)
  此方法的返回值类似于getElementsByTagName。它是具有相同类名的元素数组。以下代码行返回一个数组,其中收录类名为“sale”的所有元素:
  副本代码如下:
  文件。getElementsByClassName(“销售”)
  使用此方法,还可以查找具有多个类名的元素。要指定多个类名,只需在字符串参数中用空格分隔类名。例如,在
  您将在警告框中看到1,表示只有一个元素匹配,因为只有一个元素同时具有“重要”和“销售”类名。请注意,即使元素的class属性中类名的顺序是“sale-important”,而不是参数中指定的“重要sale”,元素仍将匹配。不仅类名的实际顺序无关紧要,元素是否有更多的类名也无关紧要。与getElementsByTagName一样,getelementsbyclassname和getelementbyid可以组合使用。如果您想知道ID为purchase的元素中有多少类名收录test的列表项,可以先找到特定的对象,然后调用getelementsbyclassname:
  副本代码如下:
  var购物=文档。getElementById(“购买”)
  var销售=购物。getElementsByClassName(“出售”)
  这样,sales数组只收录“purchase”列表中具有“sales”类的元素。运行以下代码行以查看sales数组收录两项:
  副本代码如下:
  警报(sales.length)
  这个getElementsByCassName方法非常有用,但它只受较新浏览器(Safari3.1、chorme、Firefox 3和opera9.5及更高版本)的支持。为了弥补这一不足,DOM脚本程序员需要使用现有的DOM方法来实现他们自己的GetElementsByCassName,这有点像成年礼。在大多数情况下,它们的实现过程大致类似于下面的getelementsbyclassname。此功能可应用于新浏览器和旧浏览器
  副本代码如下:
  函数getElementsByClassName(节点,类名){
  if(node.getElementsByClassName){
  返回节点。getElementsByClassName(类名称)
  }否则{
  var结果=[]
  var elems=节点。getElementsByTagName(“*”)
  for(var i=0;i if(elems[i].className.indexOf(className)!=-1){
  结果[结果.长度]=元素[i]
  }
  }
  返回结果
  }
  }
  getelementsbyclassname函数接受两个参数。第一个节点表示DOM树中的搜索起点,第二个类名是要搜索的类名。如果传入节点上已经存在相应的getelementsbyclassname函数,则新函数将直接返回相应的节点列表。如果getElementsByCassName函数不存在,新函数将遍历所有标记以查找具有相应类名的元素
  此方法的缺点是它不适用于多个类名
  如果您使用此函数模拟之前获取购物清单的操作,则可以编写如下:
  副本代码如下:
  var购物=文档。getElementById(“购买”)
  var销售=购物。getElementsByClassName(购物,“测试”)
  控制台。日志(销售)
  因此,要解决文章开头的问题,代码如下:
  副本代码如下:
  买什么
  别忘了买这东西
  解决方案2罗伯特·尼曼解决方案
  有许多方法可以搜索匹配的DOM元素,但很少有真正有效的方法。Jeremy keuth叔叔的方法有一个缺点,即它不能用于多个类名。2008年,Robert Nyman在文章最终的getelements byclassname中提供了自己的解决方案,anno 2008。2005年,罗伯特叔叔给出了他自己的getelementsbyclassname函数。2008年,他修改了一些代码并添加了许多新功能:
  1.如果当前浏览器支持GetElementsByCassName函数,请调用本机函数
  2.如果当前浏览器支持XPath,请使用它//Little flying fish:查找浏览器中内置的XML文档的强大方法,但浏览器支持并不统一
  3.支持搜索多个类名,而不考虑顺序
  4.返回一个真实的节点数组,而不是本机节点列表//Little flying fish:本机getElementsByCassName方法返回一个类似于数组的节点列表对象。它具有长度和数字索引属性,但不是数组。无法使用特定于数组的方法,如pop和push。在Robert提供的代码中,NodeList对象被转换为数组。将节点列表对象转换为数组的方法:
  副本代码如下:
  myList=数组。原型片呼叫(myNodeList)
  这是罗伯特叔叔的方法。有些地方我不太懂。我会在研究之后更新它
  副本代码如下:
  /*
  由Robert Nyman开发
  代码/许可证:
  */
  var getElementsByClassName=函数(类名、标记、elm){
  if(document.getElementsByClassName){
  getElementsByCassName=函数(类名、标记、elm){
  elm=elm | |文件
  var元素=elm。getElementsByClassName(类名称)
  节点名=(标记)?新的RegExp(“\\b”+标记+”\\b,“i”):null
  returnElements=[]
  电流
  对于(var i=0,il=elements.length;icurrent=elements[i]
  如果(!nodeName | | nodeName.test(current.nodeName)){
  返回元素。推动(电流)
  }
  }
  返回元素
  })
  }
  else if(文档评估){
  getElementsByCassName=函数(类名、标记、elm){
  标记=标记| |“*”
  elm=elm | |文件
  var classes=className。拆分(“”)
  classesToCheck=“”
  xhtmlNamespace=“”
  namespaceResolver=(document.documentElement.namespaceURI==xhtmlNamespace)?xhtmlNamespace:null
  returnElements=[]
  元素
  节点
  对于(var j=0,jl=classes.length;jclassesToCheck+=”[收录(concat(“”,@class'),“+classes[j]+”)]”
  }
  试一试{
  元素=文档。求值(“./”+标记+classesToCheck,elm,namespacesolver,0,null)
  }
  捕获(e){
  元素=文档。求值(“./”+标记+classesToCheck,elm,null,0,null)
  }
  while((node=elements.iterateNext()){
  返回元素。推送(节点)
  }
  返回元素
  })
  }
  否则{
  getElementsByCassName=函数(类名、标记、elm){
  标记=标记| |“*”
  elm=elm | |文件
  var classes=className。拆分(“”)
  classesToCheck=[]
  元素=(标记==“*”&&elm.all)?榆树所有人:埃尔姆。getElementsByTagName(标记)
  现在,
  returnElements=[]
  匹配
  对于(var k=0,kl=classes.length;kclassesToCheck.push(新的RegExp(“(^ |\\s)”+classes[k]+”(\\s |$)))
  }
  对于(var l=0,ll=elements.length;LCCurrent=elements[l]
  匹配=假
  for(var m=0,ml=classesToCheck.length;mmatch=classesToCheck[m].test(current.className)
  如果(!匹配){
  中断
  }
  }
  如果(匹配){
  返回元素。推动(电流)
  }
  }
  返回元素
  })
  }
  返回getElementsByClassName(className,tag,elm)
  })

浏览器抓取网页(如何在Linux上的顶级网页浏览器,你有哪些最佳选择)

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-12-15 13:14 • 来自相关话题

  浏览器抓取网页(如何在Linux上的顶级网页浏览器,你有哪些最佳选择)
  译者:王星宇
  没有完美的网络浏览器这样的东西。这一切都取决于你喜欢什么以及你用它做什么。
  但是对于 Linux 上的 Web 浏览器,您的最佳选择是什么?
  在这个 文章 中,我试图为您提供在 Ubuntu 和其他 Linux 系统上使用的最佳 Web 浏览器。
  注意:我们已经在 Ubuntu 上尝试并测试了这些浏览器。但是,您应该能够将它安装在您选择的任何 Linux 发行版上。
  Linux 上的顶级 Web 浏览器
  每个浏览器都有自己的独特性。此外,Linux 平台还有一些有趣且独特的选项。
  在您看到此列表之前,请注意这不是排名列表。排名第 1 的浏览器不应被认为比排名第 2、3 或 10 的浏览器更好。
  非自由和开源软件警告!
  这里提到的一些应用程序不是开源的。之所以在此列出它们,是因为它们可在 Linux 上使用,并且 文章 的重点是 Linux。我们还有一个单独的开源 Web 浏览器专用列表。
  1、维瓦尔第
  
  优势
  快速访问 Web 应用程序的侧边栏
  集成日历和电子邮件
  独特的标签管理
  番茄钟功能(时钟定时器)
  有一个移动应用程序
  缺点
  使用各种功能时,资源消耗大
  不是 100% 开源
  它是一款令人印象深刻的浏览器,越来越受到 Linux 用户的关注。
  虽然它不是 100% 开源,但您可以在网上找到它的大部分源代码(除了它的用户界面)。
  即使它是一个快速的网络浏览器,我也不认为它是“最快的”或最轻量的。您在工作时需要大量内存来执行其所有功能。
  简而言之,它是一个功能丰富的网络浏览器。因此,如果您需要尽可能多的功能来完成多项任务,Vivaldi 可以是您的选择。
  如何在 Linux 上安装 Vivaldi?
  Vivaldi 提供了 .deb 和 .rpm 两个软件包,因此您可以直接在 Linux 系统上安装它。
  如果您是 Linux 新手,您可以参考我们的资源来安装 Deb 文件和安装 RPM 文件。
  2、Mozilla Firefox
  
  优势
  隐私保护
  不基于 Chrome 引擎
  开源
  火狐账号服务
  缺点
  用户体验将随着重大更新而改变
  除了开源之外,它还提供了一些最好的隐私保护功能。此外,通过正确的设置,您可以将其变成类似于 Tor 浏览器(也基于 Firefox)的最安全的浏览器之一。
  不仅安全,当您使用 Firefox 帐户登录时,它还集成了一些有用的功能,例如 Pocket(保存网页并稍后阅读)、VPN、电子邮件别名、漏洞监控等。
  如何在 Linux 上安装 Firefox?
  它应该预先安装在您的 Linux 发行版中。但是,如果不存在,可以在软件中心搜索,或者在终端中使用以下命令进行安装:
  3、铬
  
  优势
  Chrome 浏览器的开源替代品
  类似于Chrome浏览器的功能
  缺点
  缺少 Chrome 浏览器提供的某些功能
  如果您不想使用 Chrome 浏览器,Chromium 是您在 Linux 上获得相同体验的最佳选择。
  如何在 Linux 上安装 Chromium?
  您应该能够在软件中心轻松找到它。但是,如果您需要帮助,可以参考我们的 Chromium 安装指南。
  4、谷歌浏览器
  
  优势
  与 Google 服务无缝集成
  缺点
  不开源
  您可以获得所有基本功能并能够集成所有谷歌服务。如果你喜欢在 Android 上使用 Chrome 浏览器,并希望在多个平台上同步,那么它是桌面 Linux 的不二之选。
  如果您在使用 Google 服务时正在寻找一个简单而强大的网络浏览器,那么 Chrome 浏览器可能是一个不错的选择。
  如何在 Linux 上安装 Chrome 浏览器?
  Chrome 浏览器提供了 Deb 和 RPM 包,允许您安装在任何 Ubuntu 或 Fedora/openSUSE 发行版上。
  如果您在安装方面需要帮助,我应该向您指出我们在 Linux 上安装 Chrome 浏览器的指南。
  5、勇敢
  
  优势
  隐私保护功能
  表现
  缺点
  没有基于帐户的同步
  该浏览器是最流行的 Linux 浏览器之一。
  它是一个基于 Chromium 的开源项目。它提供了几个有用的隐私保护功能,并以其极快的性能而闻名。
  与其他浏览器不同的是,即使在网站上屏蔽广告,仍然可以获得奖励。您采集的奖励只能用于回馈您喜欢的网站。通过这种方式,您还可以在屏蔽广告的同时获得对 网站 的支持。
  您可以期望以最少的资源使用获得更快的用户体验。
  如果你需要在两者之间做出选择,我们还有Brave和Firefox文章的详细对比。
  如何在 Linux 上安装 Brave?
  与其他一些网络浏览器不同,您无法直接在软件中心找到软件包。您需要在终端中输入一些命令来安装浏览器。
  别担心,您可以按照我们的说明安装 Brave 浏览器。
  6、歌剧
  
  优势
  内置免费 VPN
  额外功能
  缺点
  不开源
  它有一个内置的 VPN 和广告拦截器。因此,在Opera浏览器的帮助下,您应该得到基本的隐私保护。
  您可以直接从侧边栏快速访问流行的聊天信使,而无需启动单独的应用程序或窗口。这个侧边栏聊天信使网络应用程序与 Vivaldi 类似,但用户体验明显不同。
  一般来说,如果你想要一个免费的 VPN 作为其他基本浏览功能的额外奖励,它是一个不错的选择。
  如何安装 Opera?
  Opera 为 Linux 提供了 Deb 包。你只需要去它的官方网站下载安装即可。
  7、Microsoft Edge
  
  优势
  它为也使用 Linux 的 Windows 用户提供了一个方便的选择。
  缺点
  不开源
  Microsoft Edge 的受欢迎程度已经超过了 Mozilla Firefox。不仅因为它是默认的 Windows 浏览器,而且因为它是基于 Chrome 浏览器的,所以它也提供了很有前途的网络体验。
  Microsoft Edge 已发布适用于 Linux 的稳定版本。它目前运行良好,但缺少一些通常可用于 Windows 的功能。
  一般来说,您应该会发现大部分基本功能都可用。
  如果您使用 Windows 和 Linux 作为桌面平台,Microsoft Edge 可被视为您首选的 Web 浏览器。
  如何在 Linux 上安装 Microsoft Edge?
  现在,您可以通过 Microsoft Edge 的官方网页获取 Deb/RPM 文件并进行安装。
  您还可以查看我们在 Linux 上安装 Microsoft 的方法。
  Linux 独特的网络浏览器
  考虑到安全更新和未来升级,大多数用户喜欢坚持主流选项,但也有一些不同的选项。此外,有些是 Linux 用户独有的。
  8、GNOME Web(顿悟)
  
  优势
  精简
  开源
  缺点
  许多功能缺失
  没有跨平台支持
  Epiphany 浏览器是 GNOME 的默认浏览器。elementary OS 也将其用作默认的 Web 浏览器。
  它是一个流线型的浏览器,可提供干净优雅的用户体验。您无法同步您的书签或历史记录,因此如果您要备份或传输到其他浏览器,则需要手动导出它们。
  如何安装 GNOME Web?
  您可能会发现它已预安装在某些 Linux 发行版中。如果没有,您可以使用它的 Flatpak 包在任何 Linux 发行版上安装最新版本。
  9、法尔肯
  
  优势
  基于 Firefox 的替代方案
  缺点
  无法取代火狐
  没有跨平台支持 查看全部

  浏览器抓取网页(如何在Linux上的顶级网页浏览器,你有哪些最佳选择)
  译者:王星宇
  没有完美的网络浏览器这样的东西。这一切都取决于你喜欢什么以及你用它做什么。
  但是对于 Linux 上的 Web 浏览器,您的最佳选择是什么?
  在这个 文章 中,我试图为您提供在 Ubuntu 和其他 Linux 系统上使用的最佳 Web 浏览器。
  注意:我们已经在 Ubuntu 上尝试并测试了这些浏览器。但是,您应该能够将它安装在您选择的任何 Linux 发行版上。
  Linux 上的顶级 Web 浏览器
  每个浏览器都有自己的独特性。此外,Linux 平台还有一些有趣且独特的选项。
  在您看到此列表之前,请注意这不是排名列表。排名第 1 的浏览器不应被认为比排名第 2、3 或 10 的浏览器更好。
  非自由和开源软件警告!
  这里提到的一些应用程序不是开源的。之所以在此列出它们,是因为它们可在 Linux 上使用,并且 文章 的重点是 Linux。我们还有一个单独的开源 Web 浏览器专用列表。
  1、维瓦尔第
  
  优势
  快速访问 Web 应用程序的侧边栏
  集成日历和电子邮件
  独特的标签管理
  番茄钟功能(时钟定时器)
  有一个移动应用程序
  缺点
  使用各种功能时,资源消耗大
  不是 100% 开源
  它是一款令人印象深刻的浏览器,越来越受到 Linux 用户的关注。
  虽然它不是 100% 开源,但您可以在网上找到它的大部分源代码(除了它的用户界面)。
  即使它是一个快速的网络浏览器,我也不认为它是“最快的”或最轻量的。您在工作时需要大量内存来执行其所有功能。
  简而言之,它是一个功能丰富的网络浏览器。因此,如果您需要尽可能多的功能来完成多项任务,Vivaldi 可以是您的选择。
  如何在 Linux 上安装 Vivaldi?
  Vivaldi 提供了 .deb 和 .rpm 两个软件包,因此您可以直接在 Linux 系统上安装它。
  如果您是 Linux 新手,您可以参考我们的资源来安装 Deb 文件和安装 RPM 文件。
  2、Mozilla Firefox
  
  优势
  隐私保护
  不基于 Chrome 引擎
  开源
  火狐账号服务
  缺点
  用户体验将随着重大更新而改变
  除了开源之外,它还提供了一些最好的隐私保护功能。此外,通过正确的设置,您可以将其变成类似于 Tor 浏览器(也基于 Firefox)的最安全的浏览器之一。
  不仅安全,当您使用 Firefox 帐户登录时,它还集成了一些有用的功能,例如 Pocket(保存网页并稍后阅读)、VPN、电子邮件别名、漏洞监控等。
  如何在 Linux 上安装 Firefox?
  它应该预先安装在您的 Linux 发行版中。但是,如果不存在,可以在软件中心搜索,或者在终端中使用以下命令进行安装:
  3、铬
  
  优势
  Chrome 浏览器的开源替代品
  类似于Chrome浏览器的功能
  缺点
  缺少 Chrome 浏览器提供的某些功能
  如果您不想使用 Chrome 浏览器,Chromium 是您在 Linux 上获得相同体验的最佳选择。
  如何在 Linux 上安装 Chromium?
  您应该能够在软件中心轻松找到它。但是,如果您需要帮助,可以参考我们的 Chromium 安装指南。
  4、谷歌浏览器
  
  优势
  与 Google 服务无缝集成
  缺点
  不开源
  您可以获得所有基本功能并能够集成所有谷歌服务。如果你喜欢在 Android 上使用 Chrome 浏览器,并希望在多个平台上同步,那么它是桌面 Linux 的不二之选。
  如果您在使用 Google 服务时正在寻找一个简单而强大的网络浏览器,那么 Chrome 浏览器可能是一个不错的选择。
  如何在 Linux 上安装 Chrome 浏览器?
  Chrome 浏览器提供了 Deb 和 RPM 包,允许您安装在任何 Ubuntu 或 Fedora/openSUSE 发行版上。
  如果您在安装方面需要帮助,我应该向您指出我们在 Linux 上安装 Chrome 浏览器的指南。
  5、勇敢
  
  优势
  隐私保护功能
  表现
  缺点
  没有基于帐户的同步
  该浏览器是最流行的 Linux 浏览器之一。
  它是一个基于 Chromium 的开源项目。它提供了几个有用的隐私保护功能,并以其极快的性能而闻名。
  与其他浏览器不同的是,即使在网站上屏蔽广告,仍然可以获得奖励。您采集的奖励只能用于回馈您喜欢的网站。通过这种方式,您还可以在屏蔽广告的同时获得对 网站 的支持。
  您可以期望以最少的资源使用获得更快的用户体验。
  如果你需要在两者之间做出选择,我们还有Brave和Firefox文章的详细对比。
  如何在 Linux 上安装 Brave?
  与其他一些网络浏览器不同,您无法直接在软件中心找到软件包。您需要在终端中输入一些命令来安装浏览器。
  别担心,您可以按照我们的说明安装 Brave 浏览器。
  6、歌剧
  
  优势
  内置免费 VPN
  额外功能
  缺点
  不开源
  它有一个内置的 VPN 和广告拦截器。因此,在Opera浏览器的帮助下,您应该得到基本的隐私保护。
  您可以直接从侧边栏快速访问流行的聊天信使,而无需启动单独的应用程序或窗口。这个侧边栏聊天信使网络应用程序与 Vivaldi 类似,但用户体验明显不同。
  一般来说,如果你想要一个免费的 VPN 作为其他基本浏览功能的额外奖励,它是一个不错的选择。
  如何安装 Opera?
  Opera 为 Linux 提供了 Deb 包。你只需要去它的官方网站下载安装即可。
  7、Microsoft Edge
  
  优势
  它为也使用 Linux 的 Windows 用户提供了一个方便的选择。
  缺点
  不开源
  Microsoft Edge 的受欢迎程度已经超过了 Mozilla Firefox。不仅因为它是默认的 Windows 浏览器,而且因为它是基于 Chrome 浏览器的,所以它也提供了很有前途的网络体验。
  Microsoft Edge 已发布适用于 Linux 的稳定版本。它目前运行良好,但缺少一些通常可用于 Windows 的功能。
  一般来说,您应该会发现大部分基本功能都可用。
  如果您使用 Windows 和 Linux 作为桌面平台,Microsoft Edge 可被视为您首选的 Web 浏览器。
  如何在 Linux 上安装 Microsoft Edge?
  现在,您可以通过 Microsoft Edge 的官方网页获取 Deb/RPM 文件并进行安装。
  您还可以查看我们在 Linux 上安装 Microsoft 的方法。
  Linux 独特的网络浏览器
  考虑到安全更新和未来升级,大多数用户喜欢坚持主流选项,但也有一些不同的选项。此外,有些是 Linux 用户独有的。
  8、GNOME Web(顿悟)
  
  优势
  精简
  开源
  缺点
  许多功能缺失
  没有跨平台支持
  Epiphany 浏览器是 GNOME 的默认浏览器。elementary OS 也将其用作默认的 Web 浏览器。
  它是一个流线型的浏览器,可提供干净优雅的用户体验。您无法同步您的书签或历史记录,因此如果您要备份或传输到其他浏览器,则需要手动导出它们。
  如何安装 GNOME Web?
  您可能会发现它已预安装在某些 Linux 发行版中。如果没有,您可以使用它的 Flatpak 包在任何 Linux 发行版上安装最新版本。
  9、法尔肯
  
  优势
  基于 Firefox 的替代方案
  缺点
  无法取代火狐
  没有跨平台支持

浏览器抓取网页(获取Chrome浏览器分享时的页面的截屏,运行结果)

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-12-13 12:19 • 来自相关话题

  浏览器抓取网页(获取Chrome浏览器分享时的页面的截屏,运行结果)
  今天在项目中遇到这样一个需求:在Chrome浏览器分享时获取页面截图。坐下想一想,既然是共享,就必须通过Intent来传递数据。如果真的能拿到Chrome分享页面的截图,那么Intent的数据中肯定有.jpg或.png结尾的数据。直接做,写Demo。
  首先,创建一个新的 BrowserScreenShotActivity.java 并在 AndroidManifest.xml 中注册它。
  接下来,在浏览器中打开一个页面并将其共享给 Demo。这里有问题。我们不知道Intent中截图数据对应的key,怎么办?停下来!
  
  通过断点查看Intent的数据结构,发现Intent中的mMap成员变量收录一个Uri,格式如下:content://com.android.chrome.FileProvider/BlockedFile_332。乍一看,我猜这个Uri是Chrome通过ContentProvider为其他程序提供的虽然和.jpg和.png末尾的数据不一致,但和一开始调用的数据不一致,但不知怎么的发现。
  那么现在还有一个问题,就是mMap.value[3]对应的key值是什么?在上面的断点界面,你根本看不到,但是Android Studio很强大,你却没有发现。由于mMap是一个Map,所以可以长时间通过keySet()方法获取到Map的key。接下来是 Android Studio 大展拳脚的时候了。
  
  如上图,在Debug界面,点击最后一个图标:Evaluate Expression(快捷键:option + f8)。在弹出的对话框中输入如下,回车,你会发现Map的key全部out了:
  
  通过和第一张图对比,发现下标3(share_screenshot_as_stream)的值就是我们需要的key。
  布局比较简单,这里就不贴了,简单截取BrowserSrceenShotActivity.java中的代码:
  
@Override
protected void onResume() {
super.onResume();
if (getIntent() == null) {
return;
}

Uri screenShot = getIntent().getExtras().getParcelable("screen_shot_as_stream");
if (screenShot == null) {
ToastUtil.showDefaultToast("获取浏览器截屏失败~");
return;
}
try {
//授权Uri的读取权限
//若不授权,在 Android 6.0 以上测试崩溃
//https://thinkandroid.wordpress ... ions/
//第一个参数为需要授权的apk包名
grantUriPermission("com.littlejie.demo", screenShot, Intent.FLAG_GRANT_READ_URI_PERMISSION);
//通过 Uri 获取截屏图片的输入流
InputStream is = getContentResolver().openInputStream(screenShot);
mIvScreenShot.setImageBitmap(BitmapFactory.decodeStream(is));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
  运行结果如下:
  
  Chrome浏览器分享页面截图到此结束。闲来无事,测试了几个浏览器,包括内置浏览器,QQ浏览器,UC浏览器,百度浏览器,火狐浏览器。浏览器差别很大。
  嗯,仅此而已。主要是浏览器支持获取浏览器分享页面截图。适配市面上那么多浏览器,真的很麻烦。这次主要是学习了Android Studio强大的Debug功能。PS:Android Studio 真的是一个非常强大的工具。用好它,事半功倍。唯一的缺点是它消耗了太多的性能。
  演示代码入口:DemoApplication_jb51.rar
  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持面圈教程。 查看全部

  浏览器抓取网页(获取Chrome浏览器分享时的页面的截屏,运行结果)
  今天在项目中遇到这样一个需求:在Chrome浏览器分享时获取页面截图。坐下想一想,既然是共享,就必须通过Intent来传递数据。如果真的能拿到Chrome分享页面的截图,那么Intent的数据中肯定有.jpg或.png结尾的数据。直接做,写Demo。
  首先,创建一个新的 BrowserScreenShotActivity.java 并在 AndroidManifest.xml 中注册它。
  接下来,在浏览器中打开一个页面并将其共享给 Demo。这里有问题。我们不知道Intent中截图数据对应的key,怎么办?停下来!
  
  通过断点查看Intent的数据结构,发现Intent中的mMap成员变量收录一个Uri,格式如下:content://com.android.chrome.FileProvider/BlockedFile_332。乍一看,我猜这个Uri是Chrome通过ContentProvider为其他程序提供的虽然和.jpg和.png末尾的数据不一致,但和一开始调用的数据不一致,但不知怎么的发现。
  那么现在还有一个问题,就是mMap.value[3]对应的key值是什么?在上面的断点界面,你根本看不到,但是Android Studio很强大,你却没有发现。由于mMap是一个Map,所以可以长时间通过keySet()方法获取到Map的key。接下来是 Android Studio 大展拳脚的时候了。
  
  如上图,在Debug界面,点击最后一个图标:Evaluate Expression(快捷键:option + f8)。在弹出的对话框中输入如下,回车,你会发现Map的key全部out了:
  
  通过和第一张图对比,发现下标3(share_screenshot_as_stream)的值就是我们需要的key。
  布局比较简单,这里就不贴了,简单截取BrowserSrceenShotActivity.java中的代码:
  
@Override
protected void onResume() {
super.onResume();
if (getIntent() == null) {
return;
}

Uri screenShot = getIntent().getExtras().getParcelable("screen_shot_as_stream");
if (screenShot == null) {
ToastUtil.showDefaultToast("获取浏览器截屏失败~");
return;
}
try {
//授权Uri的读取权限
//若不授权,在 Android 6.0 以上测试崩溃
//https://thinkandroid.wordpress ... ions/
//第一个参数为需要授权的apk包名
grantUriPermission("com.littlejie.demo", screenShot, Intent.FLAG_GRANT_READ_URI_PERMISSION);
//通过 Uri 获取截屏图片的输入流
InputStream is = getContentResolver().openInputStream(screenShot);
mIvScreenShot.setImageBitmap(BitmapFactory.decodeStream(is));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
  运行结果如下:
  
  Chrome浏览器分享页面截图到此结束。闲来无事,测试了几个浏览器,包括内置浏览器,QQ浏览器,UC浏览器,百度浏览器,火狐浏览器。浏览器差别很大。
  嗯,仅此而已。主要是浏览器支持获取浏览器分享页面截图。适配市面上那么多浏览器,真的很麻烦。这次主要是学习了Android Studio强大的Debug功能。PS:Android Studio 真的是一个非常强大的工具。用好它,事半功倍。唯一的缺点是它消耗了太多的性能。
  演示代码入口:DemoApplication_jb51.rar
  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持面圈教程。

浏览器抓取网页(获取高度和宽度都各有3种,如何解决各种计算定位问题 )

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

  浏览器抓取网页(获取高度和宽度都各有3种,如何解决各种计算定位问题
)
  目的
  在浏览器中,JS获取的高度和宽度有3种,分别是屏幕、浏览器和网页。用于解决各种计算定位问题!以至于各种事情都记不起来了,所以我可以写一篇文章,方便查询。
  屏幕宽度
  注:顾名思义,屏幕宽度和高度是指显示器的分辨率。系统分辨率可以更改此宽度和高度。
  获取方法:
  console.log(\'宽度:\', window.screen.width)
console.log(\'高度:\', window.screen.height)
  浏览器可用工作区的宽度和高度
  注意:浏览器的宽度和高度是指浏览器窗口最大化时的宽度和高度。正常最大化后,一般去掉系统任务栏的高度,宽度和屏幕宽度一致。当任务栏占用的空间发生变化时,宽度和高度也会发生变化。
  获取方法:
  console.log(\'宽度:\', window.screen.availWidth)
console.log(\'高度:\', window.screen.availHeight)
  页面宽度和高度
  注意:网页的宽度和高度是指页面所占的宽度和高度。页面内容以外的浏览器部分不计算在内。标签栏、地址栏、书签栏、控制台等不计入宽高范围,只计入网页内容区域。
  获取方法:
  console.log(\'宽度:\', window.innerWidth)
console.log(\'高度:\', window.innerHeight)
  其他(获取浏览器和屏幕的各种高度和宽度)
  js原生方法:
  document.body.clientWidth; //网页可见区域宽(body)
document.body.clientHeight; //网页可见区域高(body)
document.body.offsetWidth; //网页可见区域宽(body),包括border、margin等
document.body.offsetHeight; //网页可见区域宽(body),包括border、margin等
document.body.scrollWidth; //网页正文全文宽,包括有滚动条时的未见区域
document.body.scrollHeight; //网页正文全文高,包括有滚动条时的未见区域
document.body.scrollTop; //网页被卷去的Top(滚动条)
document.body.scrollLeft; //网页被卷去的Left(滚动条)
window.screenTop; //浏览器距离Top
window.screenLeft; //浏览器距离Left
  jQuery方法:
  $(window).height(); //浏览器当前窗口可视区域高度
$(document).height(); //浏览器当前窗口文档的高度
$(document.body).height(); //浏览器当前窗口文档body的高度
$(document.body).outerHeight(true); //浏览器当前窗口文档body的总高度 包括border padding margin
$(window).width(); //浏览器当前窗口可视区域宽度
$(document).width(); //浏览器当前窗口文档对象宽度
$(document.body).width(); //浏览器当前窗口文档body的宽度
$(document.body).outerWidth(true); //浏览器当前窗口文档body的总宽度 包括border padding margin 查看全部

  浏览器抓取网页(获取高度和宽度都各有3种,如何解决各种计算定位问题
)
  目的
  在浏览器中,JS获取的高度和宽度有3种,分别是屏幕、浏览器和网页。用于解决各种计算定位问题!以至于各种事情都记不起来了,所以我可以写一篇文章,方便查询。
  屏幕宽度
  注:顾名思义,屏幕宽度和高度是指显示器的分辨率。系统分辨率可以更改此宽度和高度。
  获取方法:
  console.log(\'宽度:\', window.screen.width)
console.log(\'高度:\', window.screen.height)
  浏览器可用工作区的宽度和高度
  注意:浏览器的宽度和高度是指浏览器窗口最大化时的宽度和高度。正常最大化后,一般去掉系统任务栏的高度,宽度和屏幕宽度一致。当任务栏占用的空间发生变化时,宽度和高度也会发生变化。
  获取方法:
  console.log(\'宽度:\', window.screen.availWidth)
console.log(\'高度:\', window.screen.availHeight)
  页面宽度和高度
  注意:网页的宽度和高度是指页面所占的宽度和高度。页面内容以外的浏览器部分不计算在内。标签栏、地址栏、书签栏、控制台等不计入宽高范围,只计入网页内容区域。
  获取方法:
  console.log(\'宽度:\', window.innerWidth)
console.log(\'高度:\', window.innerHeight)
  其他(获取浏览器和屏幕的各种高度和宽度)
  js原生方法:
  document.body.clientWidth; //网页可见区域宽(body)
document.body.clientHeight; //网页可见区域高(body)
document.body.offsetWidth; //网页可见区域宽(body),包括border、margin等
document.body.offsetHeight; //网页可见区域宽(body),包括border、margin等
document.body.scrollWidth; //网页正文全文宽,包括有滚动条时的未见区域
document.body.scrollHeight; //网页正文全文高,包括有滚动条时的未见区域
document.body.scrollTop; //网页被卷去的Top(滚动条)
document.body.scrollLeft; //网页被卷去的Left(滚动条)
window.screenTop; //浏览器距离Top
window.screenLeft; //浏览器距离Left
  jQuery方法:
  $(window).height(); //浏览器当前窗口可视区域高度
$(document).height(); //浏览器当前窗口文档的高度
$(document.body).height(); //浏览器当前窗口文档body的高度
$(document.body).outerHeight(true); //浏览器当前窗口文档body的总高度 包括border padding margin
$(window).width(); //浏览器当前窗口可视区域宽度
$(document).width(); //浏览器当前窗口文档对象宽度
$(document.body).width(); //浏览器当前窗口文档body的宽度
$(document.body).outerWidth(true); //浏览器当前窗口文档body的总宽度 包括border padding margin

浏览器抓取网页(两个对象的scrollHeight和scrollWidth属性就是网页的另一种方法)

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-12-09 18:00 • 来自相关话题

  浏览器抓取网页(两个对象的scrollHeight和scrollWidth属性就是网页的另一种方法)
  来自阮一峰的网络日志""
  一、两个概念
  网页大小:网页的整个区域就是它的大小。通常,网页的大小由内容和 CSS 样式表决定。
  浏览器窗口大小:浏览器窗口的大小是指在浏览器窗口中看到的网页的面积,也称为视口。
  显然,如果网页的内容可以在浏览器窗口中显示出来(即不出现滚动条),那么网页的大小和浏览器窗口的大小是相等的。
  如果无法全部显示,请滚动浏览器窗口以显示网页的所有部分。
  二、获取页面大小
  网页上的每个元素都有 clientHeight 和 clientWidth 属性。这两个属性是指元素的内容部分加上padding所占用的可视区域,不包括边框和滚动条所占用的空间。
  函数 getViewport(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.clientWidth,
  高度:document.body.clientHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.clientWidth,
  高度:document.documentElement.clientHeight
  }
  }
  }
  上面的getViewport函数可以返回浏览器窗口的高度和宽度。使用时,有三个地方需要注意:
  1)这个函数必须在页面加载完成后运行,否则文档对象还没有生成,浏览器会报错。
  2) 在大多数情况下,document.documentElement.clientWidth 返回正确的值。但是在IE6的quirks模式下,document.body.clientWidth返回的是正确的值,
  因此,功能中增加了文档模式的判断。
  3)clientWidth 和 clientHeight 都是只读属性,不能赋值。
  三、另一种获取页面大小的方法
  网页上的每个元素也有scrollHeight和scrollWidth属性,指的是包括滚动条在内的元素的可视区域。
  那么,文档对象的scrollHeight和scrollWidth属性就是网页的大小,即滚动条的所有长度和宽度。
  以 getViewport() 函数为模型,您可以编写 getPagearea() 函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.scrollWidth,
  高度:document.body.scrollHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.scrollWidth,
  高度:document.documentElement.scrollHeight
  }
  }
  }
  但是,这个功能有问题。如果网页的内容可以在没有滚动条的浏览器窗口中显示,那么网页的clientWidth和scrollWidth应该是相等的。
  但实际上,不同浏览器的处理方式不同,这两个值可能并不相等。因此,我们需要取其中较大的值,因此需要重写getPagearea()函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:Math.max(document.body.scrollWidth,
  document.body.clientWidth),
  高度:Math.max(document.body.scrollHeight,
  文档.body.clientHeight)
  }
  } 别的 {
  返回 {
  宽度:Math.max(document.documentElement.scrollWidth,
  document.documentElement.clientWidth),
  高度:Math.max(document.documentElement.scrollHeight,
  document.documentElement.clientHeight)
  }
  }
  }
  四、获取网页元素的绝对位置
  网页元素的绝对位置是指元素左上角相对于整个网页左上角的坐标。这个绝对位置只能通过计算得到。
  首先,每个元素都有offsetTop和offsetLeft属性,表示元素左上角到父容器(offsetParent对象)左上角的距离。
  因此,只需要将这两个值累加就可以得到元素的绝对坐标。
  可以使用以下两个函数来获取绝对位置的横坐标和纵坐标。
  函数getElementLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  返回实际左;
  }
  函数 getElementTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  返回实际顶部;
  }
  由于在tables和iframes中,offsetParent对象可能不等于父容器,所以上述函数不适用于tables和iframes中的元素。
  五、获取网页元素的相对位置
  网页元素的相对位置是指元素左上角相对于浏览器窗口左上角的坐标。
  有了绝对位置,就很容易得到相对位置,只需用页面滚动条的滚动距离减去绝对坐标即可。
  滚动条的垂直距离是文档对象的scrollTop属性;滚动条的水平距离是文档对象的 scrollLeft 属性。
  相应地重写上一节中的两个函数:
  函数 getElementViewLeft(element){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollLeft=document.body.scrollLeft;
  } 别的 {
  var elementScrollLeft=document.documentElement.scrollLeft;
  }
  返回actualLeft-elementScrollLeft;
  }
  函数 getElementViewTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  实际顶部 += 当前。偏移顶部;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollTop=document.body.scrollTop;
  } 别的 {
  var elementScrollTop=document.documentElement.scrollTop;
  }
  返回actualTop-elementScrollTop;
  }
  scrollTop 和 scrollLeft 属性可以赋值,它们会立即自动将网页滚动到相应的位置,因此您可以使用它们来改变网页元素的相对位置。
  另外 element.scrollIntoView() 方法也有类似的效果,可以让网页元素出现在浏览器窗口的左上角。
  六、快速获取元素位置的方法
  除了上述功能外,还有一种快速获取网页元素位置的方法。
  即使用 getBoundingClientRect() 方法。它返回一个收录四个属性的对象:left、right、top和bottom,分别对应元素左上角和右下角相对于浏览器窗口(视口)左上角的距离。
  所以,网页元素的相对位置是
  var X = this.getBoundingClientRect().left;
  var Y =this.getBoundingClientRect().top;
  加上滚动距离,可以得到绝对位置
  var X = this.getBoundingClientRect().left+document.documentElement.scrollLeft;
  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
  目前IE、Firefox 3.0+、Opera 9.5+都支持这种方式,但Firefox 2.x、Safari、Chrome、Konqueror不支持。 查看全部

  浏览器抓取网页(两个对象的scrollHeight和scrollWidth属性就是网页的另一种方法)
  来自阮一峰的网络日志""
  一、两个概念
  网页大小:网页的整个区域就是它的大小。通常,网页的大小由内容和 CSS 样式表决定。
  浏览器窗口大小:浏览器窗口的大小是指在浏览器窗口中看到的网页的面积,也称为视口。
  显然,如果网页的内容可以在浏览器窗口中显示出来(即不出现滚动条),那么网页的大小和浏览器窗口的大小是相等的。
  如果无法全部显示,请滚动浏览器窗口以显示网页的所有部分。
  二、获取页面大小
  网页上的每个元素都有 clientHeight 和 clientWidth 属性。这两个属性是指元素的内容部分加上padding所占用的可视区域,不包括边框和滚动条所占用的空间。
  函数 getViewport(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.clientWidth,
  高度:document.body.clientHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.clientWidth,
  高度:document.documentElement.clientHeight
  }
  }
  }
  上面的getViewport函数可以返回浏览器窗口的高度和宽度。使用时,有三个地方需要注意:
  1)这个函数必须在页面加载完成后运行,否则文档对象还没有生成,浏览器会报错。
  2) 在大多数情况下,document.documentElement.clientWidth 返回正确的值。但是在IE6的quirks模式下,document.body.clientWidth返回的是正确的值,
  因此,功能中增加了文档模式的判断。
  3)clientWidth 和 clientHeight 都是只读属性,不能赋值。
  三、另一种获取页面大小的方法
  网页上的每个元素也有scrollHeight和scrollWidth属性,指的是包括滚动条在内的元素的可视区域。
  那么,文档对象的scrollHeight和scrollWidth属性就是网页的大小,即滚动条的所有长度和宽度。
  以 getViewport() 函数为模型,您可以编写 getPagearea() 函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.scrollWidth,
  高度:document.body.scrollHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.scrollWidth,
  高度:document.documentElement.scrollHeight
  }
  }
  }
  但是,这个功能有问题。如果网页的内容可以在没有滚动条的浏览器窗口中显示,那么网页的clientWidth和scrollWidth应该是相等的。
  但实际上,不同浏览器的处理方式不同,这两个值可能并不相等。因此,我们需要取其中较大的值,因此需要重写getPagearea()函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:Math.max(document.body.scrollWidth,
  document.body.clientWidth),
  高度:Math.max(document.body.scrollHeight,
  文档.body.clientHeight)
  }
  } 别的 {
  返回 {
  宽度:Math.max(document.documentElement.scrollWidth,
  document.documentElement.clientWidth),
  高度:Math.max(document.documentElement.scrollHeight,
  document.documentElement.clientHeight)
  }
  }
  }
  四、获取网页元素的绝对位置
  网页元素的绝对位置是指元素左上角相对于整个网页左上角的坐标。这个绝对位置只能通过计算得到。
  首先,每个元素都有offsetTop和offsetLeft属性,表示元素左上角到父容器(offsetParent对象)左上角的距离。
  因此,只需要将这两个值累加就可以得到元素的绝对坐标。
  可以使用以下两个函数来获取绝对位置的横坐标和纵坐标。
  函数getElementLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  返回实际左;
  }
  函数 getElementTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  返回实际顶部;
  }
  由于在tables和iframes中,offsetParent对象可能不等于父容器,所以上述函数不适用于tables和iframes中的元素。
  五、获取网页元素的相对位置
  网页元素的相对位置是指元素左上角相对于浏览器窗口左上角的坐标。
  有了绝对位置,就很容易得到相对位置,只需用页面滚动条的滚动距离减去绝对坐标即可。
  滚动条的垂直距离是文档对象的scrollTop属性;滚动条的水平距离是文档对象的 scrollLeft 属性。
  相应地重写上一节中的两个函数:
  函数 getElementViewLeft(element){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollLeft=document.body.scrollLeft;
  } 别的 {
  var elementScrollLeft=document.documentElement.scrollLeft;
  }
  返回actualLeft-elementScrollLeft;
  }
  函数 getElementViewTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  实际顶部 += 当前。偏移顶部;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollTop=document.body.scrollTop;
  } 别的 {
  var elementScrollTop=document.documentElement.scrollTop;
  }
  返回actualTop-elementScrollTop;
  }
  scrollTop 和 scrollLeft 属性可以赋值,它们会立即自动将网页滚动到相应的位置,因此您可以使用它们来改变网页元素的相对位置。
  另外 element.scrollIntoView() 方法也有类似的效果,可以让网页元素出现在浏览器窗口的左上角。
  六、快速获取元素位置的方法
  除了上述功能外,还有一种快速获取网页元素位置的方法。
  即使用 getBoundingClientRect() 方法。它返回一个收录四个属性的对象:left、right、top和bottom,分别对应元素左上角和右下角相对于浏览器窗口(视口)左上角的距离。
  所以,网页元素的相对位置是
  var X = this.getBoundingClientRect().left;
  var Y =this.getBoundingClientRect().top;
  加上滚动距离,可以得到绝对位置
  var X = this.getBoundingClientRect().left+document.documentElement.scrollLeft;
  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
  目前IE、Firefox 3.0+、Opera 9.5+都支持这种方式,但Firefox 2.x、Safari、Chrome、Konqueror不支持。

浏览器抓取网页(titleprint(2)#获取当前页面的title属性值错误)

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-12-07 05:41 • 来自相关话题

  浏览器抓取网页(titleprint(2)#获取当前页面的title属性值错误)
  本博客中学习的API如下:
  当前URL获取当前页面的URL
  page_uuSource获取当前页面的源代码
  标题获取当前页面的标题
  按顺序练习上述方法。效果如GIF所示:
  从selenium导入webdriver
  从时间上导入睡眠
  睡眠(2)
  driver=webdriver.Chrome()
  驱动程序。获取(“”)
  #移动浏览器查看显示
  驱动程序。设置窗口大小(宽度=500,高度=500,windowHandle=“当前”)
  驱动程序。设置窗口位置(x=1000,y=100,windowHandle='current')
  睡眠(2)
  #获取当前页面的标题并断言
  title=driver.title
  打印(“当前页面的标题为:”,标题“\n”)
  断言title==u“百度,你会知道”,“页面标题属性值错误!”
  睡眠(2)
  #获取当前页面的源代码并断言
  pageSource=driver.page\u源
  尝试:
  在pagesource中断言U“百度一次,你不知道”,在页面源代码中找不到“百度一次,你知道”关键字
  除:
  打印(“此处的源代码故意声明错误”,“\n”)
  睡眠(2)
  #获取当前页面的URL并断言
  currentPageUrl=驱动程序。当前\u url
  打印(“当前页面的URL为:”,currentpageurl)
  断言currentpageurl==“”,当前网址是意外的
  睡眠(2)
  driver.quit()
  以上是本文的全部内容,希望对您的学习有所帮助,也希望您能予以支持 查看全部

  浏览器抓取网页(titleprint(2)#获取当前页面的title属性值错误)
  本博客中学习的API如下:
  当前URL获取当前页面的URL
  page_uuSource获取当前页面的源代码
  标题获取当前页面的标题
  按顺序练习上述方法。效果如GIF所示:
  从selenium导入webdriver
  从时间上导入睡眠
  睡眠(2)
  driver=webdriver.Chrome()
  驱动程序。获取(“”)
  #移动浏览器查看显示
  驱动程序。设置窗口大小(宽度=500,高度=500,windowHandle=“当前”)
  驱动程序。设置窗口位置(x=1000,y=100,windowHandle='current')
  睡眠(2)
  #获取当前页面的标题并断言
  title=driver.title
  打印(“当前页面的标题为:”,标题“\n”)
  断言title==u“百度,你会知道”,“页面标题属性值错误!”
  睡眠(2)
  #获取当前页面的源代码并断言
  pageSource=driver.page\u源
  尝试:
  在pagesource中断言U“百度一次,你不知道”,在页面源代码中找不到“百度一次,你知道”关键字
  除:
  打印(“此处的源代码故意声明错误”,“\n”)
  睡眠(2)
  #获取当前页面的URL并断言
  currentPageUrl=驱动程序。当前\u url
  打印(“当前页面的URL为:”,currentpageurl)
  断言currentpageurl==“”,当前网址是意外的
  睡眠(2)
  driver.quit()
  以上是本文的全部内容,希望对您的学习有所帮助,也希望您能予以支持

浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)

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

  浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
  urllib.error.HTTPError:HTTP 错误 403:禁止
  从403 Forbidden我们可以发现,此时网站是禁止程序访问的。这是因为csdn网站 设置了反爬虫机制。当网站检测到爬虫时,访问会被拒绝,所以我们会得到上面的结果。
  这时候就需要模拟浏览器访问,以避免网站的反爬虫机制,然后顺利抓取到我们想要的内容。
  接下来,我们将使用魔法库 urllib.request.Request 进行我们的模拟工作。这次我们也会先上传代码,然后再解释,不过这次要提醒大家的是,下面的代码不能直接使用。my_headers 中的 User-Agent 替换为我自己的。因为为了保密我加了省略号,不能直接使用。更换方法如下图所示。这次为了使用方便,我们引入一个函数:
  #coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/")
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  使用上面的代码,我们就可以正常的抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
  由于我们要模拟一个浏览器进行网页访问,这些参数自然需要我们在浏览器中搜索。
  首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下图框,然后我们点击Network,然后我们会发现没有我们页面的信息都打开了,没关系,这时候我们刷新页面的时候,就会出现下图所示的信息。
  
  这时候我们会在第一行看到51251757,就是我们网页网址后面的标签。这时候我们点击这个标签,就会出现下图所示的内容:
  
  下面是我直接访问这个网址时得到的截图:
  
  前两张图,之前写过版本2的访问,现在直接用了。当时我在csdn主页上点了这个博客,所以在代码中的header里填了referer和前两张图。是的
  ,而且这张图是我直接通过URL链接进入浏览器访问的,所以从图中可以看出referer是,这是我们的网站,贴在这里是为了让大家更好的了解这个referer。不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候一定不要用我给的User-Agent,因为我用省略号代替了一些。每个人都需要用自己的方式来弥补。
  这时候我们就会发现Headers,是不是有一种豁然开朗的感觉?是的,你的直觉是对的,我们需要的信息在这个标题中。
  然后,根据代码中需要的参数,把信息复制回来就可以使用了,因为这里显示的信息正好对应了key值,所以我们复制使用起来非常方便。
  下面介绍一下这个urllib.request.Request的用法(从官方文档翻译过来的):
  classurllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
  范围:
  url:不用说,这是我们即将访问的URL。它是一个字符串。
  data:数据必须是一个字节对象,它指定要发送到服务器的附加数据,如果不需要,则为 None。目前,只有 HTTP 请求使用数据;当提供数据参数时,http 请求应该是 post 而不是 get。数据应以标准 application/x-www-form-urlencoded 格式进行缓冲。urllib.parse.urlencode() 函数的参数是一个映射或二进制序列,并以这种格式返回一个 ASCII 字符串。当它用作数据参数时,它应该被编码为字节。(我们暂时不需要这个,就别管了)
  标题:标题是字典数据。当使用键和值参数调用 add_header() 时,此标头将作为请求进行处理。此标头通常用于防止爬虫访问服务器。头部是浏览器用来标识自己的,因为有些HTTP服务器只允许来自普通浏览器的请求而不是脚本(可以理解为爬虫)。例如,Mozilla Firefox 浏览器可以将自身识别为“Mozilla / 5 (X11; U; Linux i686)Gecko/2008070208火狐20071127 / 2.0.0.11”,模块默认的用户代理字符串为“python urllib / 2.6”(Python 2.6),即访问网页时,用于反爬虫机制网站 可以通过用户代理字符串“查看我们是爬虫” 在此,必须综合考虑网站的反爬虫机制有多严格,因为你对爬虫的监控越严格,你需要检查的东西就越多,这必然会增加处理负担网站服务器,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。在此,必须综合考虑网站的反爬虫机制有多严格,因为你对爬虫的监控越严格,你需要检查的东西就越多,这必然会增加处理负担网站服务器,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。必须在爬虫检测和 网站 服务器的计算负担之间做出权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。必须在爬虫检测和 网站 服务器的计算负担之间做出权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。
  origin_req_host: origin_req_host 应该是发起原创事务请求的主机,RFC 2965 定义了它。它默认为 http.cookiejar.request_host(self)。这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是对收录图像的页面的请求的主机。(我们一般不使用这个,知道这里就知道了)
  unverifiable:unverifiable 表示请求是否不可验证,由 RFC 2965 定义,默认值为 false。无法验证的请求意味着无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器上取回图片时,此时unverifiable值应该为true。
  method:method 应该是一个字符串,指示将使用 HTTP 请求方法(例如,“header”)。如果提供,则其值存储在方法属性中并由方法 get_method() 调用。子类可以通过在类中设置方法属性来指示默认方法。(这个基本不用)
  说了这么多无聊的定义,我自己也受不了翻译了。
  让我们继续回到我们的程序:
  对于我们的程序,我们只需要掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。req.add_header("User-Agent", random_header) 告诉网络服务器我是通过浏览器访问它,我不是爬虫。req.add_header("GET",url) 告诉浏览器我们正在访问的URL,req.add_header("Host","") 这是网站的信息,我们取自网站@ > 填写即可。这句话req.add_header("Referer","") 很重要。它告诉 网站 服务器我们在哪里找到了我们想要访问的网页。比如你点击了百度 如果一个链接跳转到了当前访问的页面,
  对于 header 构造方法也可以这样做:
  #coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/")
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  从上面的程序中可以看出,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent是硬编码的。其实我们可以发现,对于不同的主机访问同一个网页时,我们的另外三个信息:GET、Host、Referer可能都是一样的,而此时仅以User-Agent作为判断标准用户的异同,那么问题来了,如果我们向同学“借”一些User-Agents来使用,是不是模拟多个用户访问?是不是更酷。其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agents,然后通过random函数随机选择一个组合起来创建一个用户。多人访问的错觉其实很有用。要知道,对于网站来说,访问过多会阻塞用户的ip。这不好玩,所以想要永久访问一个网站而不被屏蔽,还是需要很多技巧的。
  当我们要爬取一个网站的多个网页时,很容易被网站检测到,由于主机频繁访问,进而被拦截。而如果我们在列表中放更多不同的主机号并随机使用它们,是不是很容易被发现?当然,当我们防止这种情况时,更好的方法是使用IP代理,因为我们不容易获得很多主机信息,而IP代理很容易从互联网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。 查看全部

  浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
  urllib.error.HTTPError:HTTP 错误 403:禁止
  从403 Forbidden我们可以发现,此时网站是禁止程序访问的。这是因为csdn网站 设置了反爬虫机制。当网站检测到爬虫时,访问会被拒绝,所以我们会得到上面的结果。
  这时候就需要模拟浏览器访问,以避免网站的反爬虫机制,然后顺利抓取到我们想要的内容。
  接下来,我们将使用魔法库 urllib.request.Request 进行我们的模拟工作。这次我们也会先上传代码,然后再解释,不过这次要提醒大家的是,下面的代码不能直接使用。my_headers 中的 User-Agent 替换为我自己的。因为为了保密我加了省略号,不能直接使用。更换方法如下图所示。这次为了使用方便,我们引入一个函数:
  #coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/";)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  使用上面的代码,我们就可以正常的抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
  由于我们要模拟一个浏览器进行网页访问,这些参数自然需要我们在浏览器中搜索。
  首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下图框,然后我们点击Network,然后我们会发现没有我们页面的信息都打开了,没关系,这时候我们刷新页面的时候,就会出现下图所示的信息。
  
  这时候我们会在第一行看到51251757,就是我们网页网址后面的标签。这时候我们点击这个标签,就会出现下图所示的内容:
  
  下面是我直接访问这个网址时得到的截图:
  
  前两张图,之前写过版本2的访问,现在直接用了。当时我在csdn主页上点了这个博客,所以在代码中的header里填了referer和前两张图。是的
  ,而且这张图是我直接通过URL链接进入浏览器访问的,所以从图中可以看出referer是,这是我们的网站,贴在这里是为了让大家更好的了解这个referer。不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候一定不要用我给的User-Agent,因为我用省略号代替了一些。每个人都需要用自己的方式来弥补。
  这时候我们就会发现Headers,是不是有一种豁然开朗的感觉?是的,你的直觉是对的,我们需要的信息在这个标题中。
  然后,根据代码中需要的参数,把信息复制回来就可以使用了,因为这里显示的信息正好对应了key值,所以我们复制使用起来非常方便。
  下面介绍一下这个urllib.request.Request的用法(从官方文档翻译过来的):
  classurllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
  范围:
  url:不用说,这是我们即将访问的URL。它是一个字符串。
  data:数据必须是一个字节对象,它指定要发送到服务器的附加数据,如果不需要,则为 None。目前,只有 HTTP 请求使用数据;当提供数据参数时,http 请求应该是 post 而不是 get。数据应以标准 application/x-www-form-urlencoded 格式进行缓冲。urllib.parse.urlencode() 函数的参数是一个映射或二进制序列,并以这种格式返回一个 ASCII 字符串。当它用作数据参数时,它应该被编码为字节。(我们暂时不需要这个,就别管了)
  标题:标题是字典数据。当使用键和值参数调用 add_header() 时,此标头将作为请求进行处理。此标头通常用于防止爬虫访问服务器。头部是浏览器用来标识自己的,因为有些HTTP服务器只允许来自普通浏览器的请求而不是脚本(可以理解为爬虫)。例如,Mozilla Firefox 浏览器可以将自身识别为“Mozilla / 5 (X11; U; Linux i686)Gecko/2008070208火狐20071127 / 2.0.0.11”,模块默认的用户代理字符串为“python urllib / 2.6”(Python 2.6),即访问网页时,用于反爬虫机制网站 可以通过用户代理字符串“查看我们是爬虫” 在此,必须综合考虑网站的反爬虫机制有多严格,因为你对爬虫的监控越严格,你需要检查的东西就越多,这必然会增加处理负担网站服务器,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。在此,必须综合考虑网站的反爬虫机制有多严格,因为你对爬虫的监控越严格,你需要检查的东西就越多,这必然会增加处理负担网站服务器,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。必须在爬虫检测和 网站 服务器的计算负担之间做出权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。必须在爬虫检测和 网站 服务器的计算负担之间做出权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。
  origin_req_host: origin_req_host 应该是发起原创事务请求的主机,RFC 2965 定义了它。它默认为 http.cookiejar.request_host(self)。这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是对收录图像的页面的请求的主机。(我们一般不使用这个,知道这里就知道了)
  unverifiable:unverifiable 表示请求是否不可验证,由 RFC 2965 定义,默认值为 false。无法验证的请求意味着无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器上取回图片时,此时unverifiable值应该为true。
  method:method 应该是一个字符串,指示将使用 HTTP 请求方法(例如,“header”)。如果提供,则其值存储在方法属性中并由方法 get_method() 调用。子类可以通过在类中设置方法属性来指示默认方法。(这个基本不用)
  说了这么多无聊的定义,我自己也受不了翻译了。
  让我们继续回到我们的程序:
  对于我们的程序,我们只需要掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。req.add_header("User-Agent", random_header) 告诉网络服务器我是通过浏览器访问它,我不是爬虫。req.add_header("GET",url) 告诉浏览器我们正在访问的URL,req.add_header("Host","") 这是网站的信息,我们取自网站@ > 填写即可。这句话req.add_header("Referer","") 很重要。它告诉 网站 服务器我们在哪里找到了我们想要访问的网页。比如你点击了百度 如果一个链接跳转到了当前访问的页面,
  对于 header 构造方法也可以这样做:
  #coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/";)
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  从上面的程序中可以看出,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent是硬编码的。其实我们可以发现,对于不同的主机访问同一个网页时,我们的另外三个信息:GET、Host、Referer可能都是一样的,而此时仅以User-Agent作为判断标准用户的异同,那么问题来了,如果我们向同学“借”一些User-Agents来使用,是不是模拟多个用户访问?是不是更酷。其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agents,然后通过random函数随机选择一个组合起来创建一个用户。多人访问的错觉其实很有用。要知道,对于网站来说,访问过多会阻塞用户的ip。这不好玩,所以想要永久访问一个网站而不被屏蔽,还是需要很多技巧的。
  当我们要爬取一个网站的多个网页时,很容易被网站检测到,由于主机频繁访问,进而被拦截。而如果我们在列表中放更多不同的主机号并随机使用它们,是不是很容易被发现?当然,当我们防止这种情况时,更好的方法是使用IP代理,因为我们不容易获得很多主机信息,而IP代理很容易从互联网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。

浏览器抓取网页(优采云云采集服务平台如何高效的抓取网页数据(组图))

网站优化优采云 发表了文章 • 0 个评论 • 94 次浏览 • 2021-12-04 05:00 • 来自相关话题

  浏览器抓取网页(优采云云采集服务平台如何高效的抓取网页数据(组图))
  优采云Cloud采集如何在服务平台上使用网络爬虫工具作为一个不会编码的技术新手,如何高效的爬取网络数据?有没有好用的数据抓取工具,可以帮助小白实现需要的数据采集功能?答案是肯定的。使用一个好的数据抓取工具,可以让我们使用优采云浏览器,通过模仿人们浏览网页的操作来完成数据的抓取。整个过程完全可视化,上手相对容易。它可以抓取 99% 的网页。还具有自动登录、验证码识别、IP代理、云端采集等功能应对网站采集的防范措施。下面是一个完整的使用优采云获取网页数据的例子。以京东为例。以 com 为例。采集网站:,3258,3304&page=1&sort=sort_totalsales15_desc&trans=1&JL=4_2_0#J_main 第一步:创建采集任务1)进入主界面选择,选择自定义模式优采云云采集 服务平台如何高效抓取网页数据,以京东商品信息采集为例 图1 2)复制粘贴网址以上 URL 到 网站输入框并点击“保存 URL”。优采云Cloud采集 服务平台如何高效抓取网页数据?以京东产品信息采集为例。图2 3) 保存URL后,页面会在优采云采集器中打开。红框内的书籍数据为本次演示的信息。采集例如图3 第二步:创建翻页循环,找到翻页按钮,设置翻页循环1)
  2) 移动鼠标选中红框中任意一个文本框后,列表中所有适配的内容都会变成绿色。在右侧的操作提示框中勾选提取的字段,可以删除不需要的字段。然后点击“全选”优采云云采集服务平台如何高效抓取网页数据,以京东产品信息采集为例。图6 注意:将鼠标放在该字段上,会出现一个删除标志,点击删除该字段。如何高效抓取网页数据,以京东产品信息采集为例 图7 优采云云采集服务平台3)点击“采集以下数据”如何高效抓取网页数据,获取京东商品信息采集 以图8 4)修改采集字段名优采云cloud采集如何高效抓取服务平台获取网页数据,以京东商品信息采集为一个例子。图9 5)点击下方红框中的“保存启动采集” 如何高效抓取网页数据并使用京东产品信息采集为例 图10 优采云云采集服务平台6)根据采集的情况选择合适的采集方式,这里选择“Start” Local 采集" 如何高效抓取网页数据,以京东产品信息采集为例 图11 说明:本地采集为采集占用当前计算机资源,如果存在<
  第四步:数据采集并导出1)采集完成后会弹出提示,选择导出数据优采云云采集服务平台如何有效地抓取网页?数据,以京东商品信息采集为例 图12 2)选择合适的导出方式,导出采集好的数据优采云cloud采集怎么样服务平台 高效抓取网页数据,以京东商品信息采集为例。图13 通过以上操作,我们采集得到了京东-图书分类-文学综合图书馆-悬疑类下的图书商品信息。打开采集的URL后,我们并没有点击产品链接进入产品详情页面,而是直接用产品块建立了列表循环,采集各个产品信息。采集的具体字段为:价格、书名、评论数、附属店铺。其他网站采集的基本步骤同上,具体步骤需要观察网页的特点,做一些具体的设置。此处不再赘述优采云云采集服务平台优采云爬虫软件入门优采云数据爬虫入门基本操作优采云网站入门从爬虫功能介绍开始优采云爬虫软件功能使用教程优采云分页列表详解采集方法(7.0版本)优采云7. 0版网页简单 模式介绍及使用方法优采云云采集服务平台优采云——70万用户精选的网页数据采集器。1、操作简单,任何人都可以使用:无需技术背景,即可上网采集。过程完全可视化,点击鼠标即可完成操作,2分钟即可快速上手。
  2、功能强大,任何网站都可以使用:点击、登录、翻页、识别验证码、瀑布流、Ajax脚本异步加载数据网页,都可以通过简单的设置来设置< @采集。3、云采集,可以关掉。配置完采集任务后,可以关闭,任务可以在云端执行。庞达云采集集群24*7不间断运行,不用担心IP被封,网络中断。4、特色免费+增值服务,可根据需要选择。免费版功能齐全,可以满足用户基本的采集需求。同时, 查看全部

  浏览器抓取网页(优采云云采集服务平台如何高效的抓取网页数据(组图))
  优采云Cloud采集如何在服务平台上使用网络爬虫工具作为一个不会编码的技术新手,如何高效的爬取网络数据?有没有好用的数据抓取工具,可以帮助小白实现需要的数据采集功能?答案是肯定的。使用一个好的数据抓取工具,可以让我们使用优采云浏览器,通过模仿人们浏览网页的操作来完成数据的抓取。整个过程完全可视化,上手相对容易。它可以抓取 99% 的网页。还具有自动登录、验证码识别、IP代理、云端采集等功能应对网站采集的防范措施。下面是一个完整的使用优采云获取网页数据的例子。以京东为例。以 com 为例。采集网站:,3258,3304&page=1&sort=sort_totalsales15_desc&trans=1&JL=4_2_0#J_main 第一步:创建采集任务1)进入主界面选择,选择自定义模式优采云云采集 服务平台如何高效抓取网页数据,以京东商品信息采集为例 图1 2)复制粘贴网址以上 URL 到 网站输入框并点击“保存 URL”。优采云Cloud采集 服务平台如何高效抓取网页数据?以京东产品信息采集为例。图2 3) 保存URL后,页面会在优采云采集器中打开。红框内的书籍数据为本次演示的信息。采集例如图3 第二步:创建翻页循环,找到翻页按钮,设置翻页循环1)
  2) 移动鼠标选中红框中任意一个文本框后,列表中所有适配的内容都会变成绿色。在右侧的操作提示框中勾选提取的字段,可以删除不需要的字段。然后点击“全选”优采云云采集服务平台如何高效抓取网页数据,以京东产品信息采集为例。图6 注意:将鼠标放在该字段上,会出现一个删除标志,点击删除该字段。如何高效抓取网页数据,以京东产品信息采集为例 图7 优采云云采集服务平台3)点击“采集以下数据”如何高效抓取网页数据,获取京东商品信息采集 以图8 4)修改采集字段名优采云cloud采集如何高效抓取服务平台获取网页数据,以京东商品信息采集为一个例子。图9 5)点击下方红框中的“保存启动采集” 如何高效抓取网页数据并使用京东产品信息采集为例 图10 优采云云采集服务平台6)根据采集的情况选择合适的采集方式,这里选择“Start” Local 采集" 如何高效抓取网页数据,以京东产品信息采集为例 图11 说明:本地采集为采集占用当前计算机资源,如果存在<
  第四步:数据采集并导出1)采集完成后会弹出提示,选择导出数据优采云云采集服务平台如何有效地抓取网页?数据,以京东商品信息采集为例 图12 2)选择合适的导出方式,导出采集好的数据优采云cloud采集怎么样服务平台 高效抓取网页数据,以京东商品信息采集为例。图13 通过以上操作,我们采集得到了京东-图书分类-文学综合图书馆-悬疑类下的图书商品信息。打开采集的URL后,我们并没有点击产品链接进入产品详情页面,而是直接用产品块建立了列表循环,采集各个产品信息。采集的具体字段为:价格、书名、评论数、附属店铺。其他网站采集的基本步骤同上,具体步骤需要观察网页的特点,做一些具体的设置。此处不再赘述优采云云采集服务平台优采云爬虫软件入门优采云数据爬虫入门基本操作优采云网站入门从爬虫功能介绍开始优采云爬虫软件功能使用教程优采云分页列表详解采集方法(7.0版本)优采云7. 0版网页简单 模式介绍及使用方法优采云云采集服务平台优采云——70万用户精选的网页数据采集器。1、操作简单,任何人都可以使用:无需技术背景,即可上网采集。过程完全可视化,点击鼠标即可完成操作,2分钟即可快速上手。
  2、功能强大,任何网站都可以使用:点击、登录、翻页、识别验证码、瀑布流、Ajax脚本异步加载数据网页,都可以通过简单的设置来设置< @采集。3、云采集,可以关掉。配置完采集任务后,可以关闭,任务可以在云端执行。庞达云采集集群24*7不间断运行,不用担心IP被封,网络中断。4、特色免费+增值服务,可根据需要选择。免费版功能齐全,可以满足用户基本的采集需求。同时,

浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)

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

  浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
  urllib.error.HTTPError:HTTP 错误 403:禁止
  从403 Forbidden我们可以发现,此时网站是禁止程序访问的。这是因为csdn网站 设置了反爬虫机制。当网站检测到爬虫时,访问会被拒绝,所以我们会得到上面的结果。
  这时候就需要模拟浏览器访问,以避免网站的反爬虫机制,然后顺利抓取到我们想要的内容。
  接下来,我们将使用魔法库 urllib.request.Request 进行我们的模拟工作。这次我们也会先上传代码,然后再解释,不过这次要提醒大家的是,下面的代码不能直接使用。my_headers 中的 User-Agent 替换为我自己的。因为为了保密我加了省略号,不能直接使用。更换方法如下图所示。这次为了使用方便,我们引入一个函数:
  #coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/")
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  使用上面的代码,我们就可以正常的抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
  由于我们要模拟一个浏览器进行网页访问,这些参数自然需要我们在浏览器中搜索。
  首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下图框,然后我们点击Network,然后我们会发现没有我们页面的信息都打开了,没关系,这时候我们刷新页面的时候,就会出现下图所示的信息。
  
  这时候我们会在第一行看到51251757,就是我们网页网址后面的标签。这时候我们点击这个标签,就会出现下图所示的内容:
  
  下面是我直接访问这个网址时得到的截图:
  
  前两张图,之前写过版本2的访问,现在直接用了。当时我在csdn主页上点了这个博客,所以在代码中的header里填了referer和前两张图。是的
  ,而且这张图是我直接通过URL链接进入浏览器访问的,所以从图中可以看出referer是,这是我们的网站,贴在这里是为了让大家更好的了解这个referer。不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候一定不要用我给的User-Agent,因为我用省略号代替了一些。每个人都需要用自己的方式来弥补。
  这时候我们就会发现Headers,是不是有一种豁然开朗的感觉?是的,你的直觉是对的,我们需要的信息在这个标题中。
  然后,根据代码中需要的参数,把信息复制回来就可以使用了,因为这里显示的信息正好对应了key值,所以我们复制使用起来非常方便。
  下面介绍一下这个urllib.request.Request的用法(从官方文档翻译过来的):
  类 urllib.request。request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) 参数: url:不用说,这是我们即将访问的URL,是一个字符串。data:数据必须是一个字节对象,它指定要发送到服务器的附加数据,如果不需要,则为 None。目前,只有 HTTP 请求使用数据;当提供数据参数时,http 请求应该是 post 而不是 get。数据应以标准 application/x-www-form-urlencoded 格式进行缓冲。urllib.parse.urlencode() 函数的参数是一个映射或二进制序列,并以这种格式返回一个 ASCII 字符串。当它用作数据参数时,它应该被编码为字节。(我们暂时不需要这个,不用管它) headers: headers 是字典数据。当使用键和值参数调用 add_header() 时,此标头将作为请求进行处理。此标头通常用于防止爬虫访问服务器。头部是浏览器用来标识自己的,因为有些HTTP服务器只允许来自普通浏览器的请求而不是脚本(可以理解为爬虫)。
  这必然会增加网站服务器的处理负担,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以爬虫检测机制不是越严格越好,必须考虑服务器的负担。origin_req_host: origin_req_host 应该是发出原创事务请求的主机,RFC 2965 定义了它。它默认为 http.cookiejar.request_host(self)。
  这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是对收录图像的页面的请求的主机。(我们一般不使用这个,这里就知道了) unverifiable: unverifiable 应该表示请求是否是不可验证的,由RFC 2965定义,默认值为false。无法验证的请求意味着无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器上取回图片时,此时unverifiable值应该为true。method:method 应该是一个字符串,指示将使用 HTTP 请求方法(例如,“header”)。如果提供,它的值存储在方法属性中并由方法 get_method() 调用。子类可以通过在类中设置方法属性来指示默认方法。(这个我基本不会用。)说了这么多无聊的定义,我自己也受不了翻译了。让我们继续回到我们的程序:对于我们的程序,只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。
  req.add_header("User-Agent", random_header) 告诉网络服务器我是通过浏览器访问它,我不是爬虫。req.add_header("GET",url) 告诉浏览器我们正在访问的URL,req.add_header("Host","") 这是网站的信息,我们取自网站@ > 填写即可。这句话req.add_header("Referer","") 很重要。它告诉 网站 服务器我们在哪里找到了我们想要访问的网页。比如你点击了百度,如果一个链接跳转到当前访问的页面,那么referer就是百度中的链接,这是一个判断机制。对于 header 构造方法也可以这样做:
  #coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/")
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  从上面的程序中可以看出,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent是硬编码的。其实我们可以发现,对于不同的主机访问同一个网页时,我们的另外三个信息:GET、Host、Referer可能都是一样的,而此时仅以User-Agent作为判断标准用户的异同,那么问题来了,如果我们向同学“借”一些User-Agents来使用,是不是模拟多个用户访问?是不是更酷。其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agents,然后通过random函数随机选择一个组合起来创建一个用户。多人访问的错觉其实很有用。要知道,对于网站来说,访问过多会阻塞用户的ip。这不好玩,所以想要永久访问一个网站而不被屏蔽,还是需要很多技巧的。
  当我们要爬取一个网站的多个网页时,很容易被网站检测到,由于主机频繁访问,进而被拦截。而如果我们在列表中放更多不同的主机号并随机使用它们,是不是很容易被发现?当然,当我们防止这种情况时,更好的方法是使用IP代理,因为我们不容易获得很多主机信息,而IP代理很容易从互联网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。 查看全部

  浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
  urllib.error.HTTPError:HTTP 错误 403:禁止
  从403 Forbidden我们可以发现,此时网站是禁止程序访问的。这是因为csdn网站 设置了反爬虫机制。当网站检测到爬虫时,访问会被拒绝,所以我们会得到上面的结果。
  这时候就需要模拟浏览器访问,以避免网站的反爬虫机制,然后顺利抓取到我们想要的内容。
  接下来,我们将使用魔法库 urllib.request.Request 进行我们的模拟工作。这次我们也会先上传代码,然后再解释,不过这次要提醒大家的是,下面的代码不能直接使用。my_headers 中的 User-Agent 替换为我自己的。因为为了保密我加了省略号,不能直接使用。更换方法如下图所示。这次为了使用方便,我们引入一个函数:
  #coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/";)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  使用上面的代码,我们就可以正常的抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
  由于我们要模拟一个浏览器进行网页访问,这些参数自然需要我们在浏览器中搜索。
  首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下图框,然后我们点击Network,然后我们会发现没有我们页面的信息都打开了,没关系,这时候我们刷新页面的时候,就会出现下图所示的信息。
  
  这时候我们会在第一行看到51251757,就是我们网页网址后面的标签。这时候我们点击这个标签,就会出现下图所示的内容:
  
  下面是我直接访问这个网址时得到的截图:
  
  前两张图,之前写过版本2的访问,现在直接用了。当时我在csdn主页上点了这个博客,所以在代码中的header里填了referer和前两张图。是的
  ,而且这张图是我直接通过URL链接进入浏览器访问的,所以从图中可以看出referer是,这是我们的网站,贴在这里是为了让大家更好的了解这个referer。不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候一定不要用我给的User-Agent,因为我用省略号代替了一些。每个人都需要用自己的方式来弥补。
  这时候我们就会发现Headers,是不是有一种豁然开朗的感觉?是的,你的直觉是对的,我们需要的信息在这个标题中。
  然后,根据代码中需要的参数,把信息复制回来就可以使用了,因为这里显示的信息正好对应了key值,所以我们复制使用起来非常方便。
  下面介绍一下这个urllib.request.Request的用法(从官方文档翻译过来的):
  类 urllib.request。request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) 参数: url:不用说,这是我们即将访问的URL,是一个字符串。data:数据必须是一个字节对象,它指定要发送到服务器的附加数据,如果不需要,则为 None。目前,只有 HTTP 请求使用数据;当提供数据参数时,http 请求应该是 post 而不是 get。数据应以标准 application/x-www-form-urlencoded 格式进行缓冲。urllib.parse.urlencode() 函数的参数是一个映射或二进制序列,并以这种格式返回一个 ASCII 字符串。当它用作数据参数时,它应该被编码为字节。(我们暂时不需要这个,不用管它) headers: headers 是字典数据。当使用键和值参数调用 add_header() 时,此标头将作为请求进行处理。此标头通常用于防止爬虫访问服务器。头部是浏览器用来标识自己的,因为有些HTTP服务器只允许来自普通浏览器的请求而不是脚本(可以理解为爬虫)。
  这必然会增加网站服务器的处理负担,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以爬虫检测机制不是越严格越好,必须考虑服务器的负担。origin_req_host: origin_req_host 应该是发出原创事务请求的主机,RFC 2965 定义了它。它默认为 http.cookiejar.request_host(self)。
  这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是对收录图像的页面的请求的主机。(我们一般不使用这个,这里就知道了) unverifiable: unverifiable 应该表示请求是否是不可验证的,由RFC 2965定义,默认值为false。无法验证的请求意味着无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器上取回图片时,此时unverifiable值应该为true。method:method 应该是一个字符串,指示将使用 HTTP 请求方法(例如,“header”)。如果提供,它的值存储在方法属性中并由方法 get_method() 调用。子类可以通过在类中设置方法属性来指示默认方法。(这个我基本不会用。)说了这么多无聊的定义,我自己也受不了翻译了。让我们继续回到我们的程序:对于我们的程序,只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。
  req.add_header("User-Agent", random_header) 告诉网络服务器我是通过浏览器访问它,我不是爬虫。req.add_header("GET",url) 告诉浏览器我们正在访问的URL,req.add_header("Host","") 这是网站的信息,我们取自网站@ > 填写即可。这句话req.add_header("Referer","") 很重要。它告诉 网站 服务器我们在哪里找到了我们想要访问的网页。比如你点击了百度,如果一个链接跳转到当前访问的页面,那么referer就是百度中的链接,这是一个判断机制。对于 header 构造方法也可以这样做:
  #coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/";)
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  从上面的程序中可以看出,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent是硬编码的。其实我们可以发现,对于不同的主机访问同一个网页时,我们的另外三个信息:GET、Host、Referer可能都是一样的,而此时仅以User-Agent作为判断标准用户的异同,那么问题来了,如果我们向同学“借”一些User-Agents来使用,是不是模拟多个用户访问?是不是更酷。其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agents,然后通过random函数随机选择一个组合起来创建一个用户。多人访问的错觉其实很有用。要知道,对于网站来说,访问过多会阻塞用户的ip。这不好玩,所以想要永久访问一个网站而不被屏蔽,还是需要很多技巧的。
  当我们要爬取一个网站的多个网页时,很容易被网站检测到,由于主机频繁访问,进而被拦截。而如果我们在列表中放更多不同的主机号并随机使用它们,是不是很容易被发现?当然,当我们防止这种情况时,更好的方法是使用IP代理,因为我们不容易获得很多主机信息,而IP代理很容易从互联网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。

浏览器抓取网页(【】自动爬起来算法(一):继续循环)

网站优化优采云 发表了文章 • 0 个评论 • 68 次浏览 • 2021-11-27 05:06 • 来自相关话题

  浏览器抓取网页(【】自动爬起来算法(一):继续循环)
  前言:在写这篇文章之前,主要看了几个类似的爬虫写法,有的写成队列,感觉不是很直观,有的只有一个请求然后解析页面,但是没有自动爬上去。这也叫爬虫?所以我根据自己的想法写了一个简单的爬虫。
  算法介绍
  程序在思想上采用了广度优先算法。它对没有被遍历过的链接一一发起GET请求,然后用正则表达式解析返回的页面,取出没有找到的新链接,加入集合中,等待下一次遍历的同时循环.
  具体实现中使用的是map,key-value对就是链接和是否遍历。程序中用到了两个Map集合,分别是:oldMap和newMap。初始链接在oldMap中,然后请求oldMap中flag为false的链接,解析页面,使用常规规则检索标签下的链接。如果这个链接不在oldMap和newMap中,就说明这是一个新的链接,如果这个链接是我们需要获取的目标网站的链接,我们会把这个链接放到newMap中,继续解析。, 页面解析完成后,将oldMap中当前页面上的链接值设置为true,表示已经被遍历。
  最后,当整个oldMap没有遍历过的链接遍历完成后,如果发现newMap不为空,说明在这个循环中产生了新的链接。因此,将这些新链接加入到oldMap中,继续递归遍历,反之亦然。此循环中不会生成新链接。如果循环继续,则无法生成新链接。因为任务结束,返回链接集合oldMap
  二 方案实施
  上面的相关思路已经解释的很清楚了,代码中关键地方都有注释,这里就不多说了,代码如下:
  
package action;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WebCrawlerDemo {
public static void main(String[] args) {
WebCrawlerDemo webCrawlerDemo = new WebCrawlerDemo();
webCrawlerDemo.myPrint("http://www.zifangsky.cn");
}

public void myPrint(String baseUrl) {
Map oldMap = new LinkedHashMap(); // 存储链接-是否被遍历
// 键值对
String oldLinkHost = ""; //host

Pattern p = Pattern.compile("(https?://)?[^/\\s]*"); //比如:http://www.zifangsky.cn
Matcher m = p.matcher(baseUrl);
if (m.find()) {
oldLinkHost = m.group();
}

oldMap.put(baseUrl, false);
oldMap = crawlLinks(oldLinkHost, oldMap);
for (Map.Entry mapping : oldMap.entrySet()) {
System.out.println("链接:" + mapping.getKey());

}

}

/**
* 抓取一个网站所有可以抓取的网页链接,在思路上使用了广度优先算法
* 对未遍历过的新链接不断发起GET请求,一直到遍历完整个集合都没能发现新的链接
* 则表示不能发现新的链接了,任务结束
*
* @param oldLinkHost 域名,如:http://www.zifangsky.cn
* @param oldMap 待遍历的链接集合
*
* @return 返回所有抓取到的链接集合
* */
private Map crawlLinks(String oldLinkHost,
Map oldMap) {
Map newMap = new LinkedHashMap();
String oldLink = "";

for (Map.Entry mapping : oldMap.entrySet()) {
System.out.println("link:" + mapping.getKey() + "--------check:"
+ mapping.getValue());
// 如果没有被遍历过
if (!mapping.getValue()) {
oldLink = mapping.getKey();
// 发起GET请求
try {
URL url = new URL(oldLink);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(2000);
connection.setReadTimeout(2000);

if (connection.getResponseCode() == 200) {
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(inputStream, "UTF-8"));
String line = "";
Pattern pattern = Pattern
.compile("(.+)</a>");
Matcher matcher = null;
while ((line = reader.readLine()) != null) {
matcher = pattern.matcher(line);
if (matcher.find()) {
String newLink = matcher.group(1).trim(); // 链接
// String title = matcher.group(3).trim(); //标题
// 判断获取到的链接是否以http开头
if (!newLink.startsWith("http")) {
if (newLink.startsWith("/"))
newLink = oldLinkHost + newLink;
else
newLink = oldLinkHost + "/" + newLink;
}
//去除链接末尾的 /
if(newLink.endsWith("/"))
newLink = newLink.substring(0, newLink.length() - 1);
//去重,并且丢弃其他网站的链接
if (!oldMap.containsKey(newLink)
&& !newMap.containsKey(newLink)
&& newLink.startsWith(oldLinkHost)) {
// System.out.println("temp2: " + newLink);
newMap.put(newLink, false);
}
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
oldMap.replace(oldLink, false, true);
}
}
//有新链接,继续遍历
if (!newMap.isEmpty()) {
oldMap.putAll(newMap);
oldMap.putAll(crawlLinks(oldLinkHost, oldMap)); //由于Map的特性,不会导致出现重复的键值对
}
return oldMap;
}
}
  三项最终测试结果
  
  PS:它的实际递归性不是很好,因为如果网站页多的话,程序运行时间长的话内存消耗会很大。
  感谢您的阅读,希望对您有所帮助,感谢您对本站的支持! 查看全部

  浏览器抓取网页(【】自动爬起来算法(一):继续循环)
  前言:在写这篇文章之前,主要看了几个类似的爬虫写法,有的写成队列,感觉不是很直观,有的只有一个请求然后解析页面,但是没有自动爬上去。这也叫爬虫?所以我根据自己的想法写了一个简单的爬虫。
  算法介绍
  程序在思想上采用了广度优先算法。它对没有被遍历过的链接一一发起GET请求,然后用正则表达式解析返回的页面,取出没有找到的新链接,加入集合中,等待下一次遍历的同时循环.
  具体实现中使用的是map,key-value对就是链接和是否遍历。程序中用到了两个Map集合,分别是:oldMap和newMap。初始链接在oldMap中,然后请求oldMap中flag为false的链接,解析页面,使用常规规则检索标签下的链接。如果这个链接不在oldMap和newMap中,就说明这是一个新的链接,如果这个链接是我们需要获取的目标网站的链接,我们会把这个链接放到newMap中,继续解析。, 页面解析完成后,将oldMap中当前页面上的链接值设置为true,表示已经被遍历。
  最后,当整个oldMap没有遍历过的链接遍历完成后,如果发现newMap不为空,说明在这个循环中产生了新的链接。因此,将这些新链接加入到oldMap中,继续递归遍历,反之亦然。此循环中不会生成新链接。如果循环继续,则无法生成新链接。因为任务结束,返回链接集合oldMap
  二 方案实施
  上面的相关思路已经解释的很清楚了,代码中关键地方都有注释,这里就不多说了,代码如下:
  
package action;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WebCrawlerDemo {
public static void main(String[] args) {
WebCrawlerDemo webCrawlerDemo = new WebCrawlerDemo();
webCrawlerDemo.myPrint("http://www.zifangsky.cn";);
}

public void myPrint(String baseUrl) {
Map oldMap = new LinkedHashMap(); // 存储链接-是否被遍历
// 键值对
String oldLinkHost = ""; //host

Pattern p = Pattern.compile("(https?://)?[^/\\s]*"); //比如:http://www.zifangsky.cn
Matcher m = p.matcher(baseUrl);
if (m.find()) {
oldLinkHost = m.group();
}

oldMap.put(baseUrl, false);
oldMap = crawlLinks(oldLinkHost, oldMap);
for (Map.Entry mapping : oldMap.entrySet()) {
System.out.println("链接:" + mapping.getKey());

}

}

/**
* 抓取一个网站所有可以抓取的网页链接,在思路上使用了广度优先算法
* 对未遍历过的新链接不断发起GET请求,一直到遍历完整个集合都没能发现新的链接
* 则表示不能发现新的链接了,任务结束
*
* @param oldLinkHost 域名,如:http://www.zifangsky.cn
* @param oldMap 待遍历的链接集合
*
* @return 返回所有抓取到的链接集合
* */
private Map crawlLinks(String oldLinkHost,
Map oldMap) {
Map newMap = new LinkedHashMap();
String oldLink = "";

for (Map.Entry mapping : oldMap.entrySet()) {
System.out.println("link:" + mapping.getKey() + "--------check:"
+ mapping.getValue());
// 如果没有被遍历过
if (!mapping.getValue()) {
oldLink = mapping.getKey();
// 发起GET请求
try {
URL url = new URL(oldLink);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(2000);
connection.setReadTimeout(2000);

if (connection.getResponseCode() == 200) {
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(inputStream, "UTF-8"));
String line = "";
Pattern pattern = Pattern
.compile("(.+)</a>");
Matcher matcher = null;
while ((line = reader.readLine()) != null) {
matcher = pattern.matcher(line);
if (matcher.find()) {
String newLink = matcher.group(1).trim(); // 链接
// String title = matcher.group(3).trim(); //标题
// 判断获取到的链接是否以http开头
if (!newLink.startsWith("http")) {
if (newLink.startsWith("/"))
newLink = oldLinkHost + newLink;
else
newLink = oldLinkHost + "/" + newLink;
}
//去除链接末尾的 /
if(newLink.endsWith("/"))
newLink = newLink.substring(0, newLink.length() - 1);
//去重,并且丢弃其他网站的链接
if (!oldMap.containsKey(newLink)
&& !newMap.containsKey(newLink)
&& newLink.startsWith(oldLinkHost)) {
// System.out.println("temp2: " + newLink);
newMap.put(newLink, false);
}
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
oldMap.replace(oldLink, false, true);
}
}
//有新链接,继续遍历
if (!newMap.isEmpty()) {
oldMap.putAll(newMap);
oldMap.putAll(crawlLinks(oldLinkHost, oldMap)); //由于Map的特性,不会导致出现重复的键值对
}
return oldMap;
}
}
  三项最终测试结果
  
  PS:它的实际递归性不是很好,因为如果网站页多的话,程序运行时间长的话内存消耗会很大。
  感谢您的阅读,希望对您有所帮助,感谢您对本站的支持!

浏览器抓取网页(小编来一起获取浏览器信息的方法(1)_java代码参考文章)

网站优化优采云 发表了文章 • 0 个评论 • 88 次浏览 • 2021-11-23 07:09 • 来自相关话题

  浏览器抓取网页(小编来一起获取浏览器信息的方法(1)_java代码参考文章)
  java request.getHeader("user-agent") 获取浏览器信息的方法
  更新时间:2019-03-29 14:53:22 作者:小天才
  本文文章主要介绍java request.getHeader("user-agent")获取浏览器信息的方法。本文介绍的示例代码非常详细,对你的学习或工作有一定的参考价值。有需要的朋友,和小编一起学习吧。
  一、用户代理的含义
  User Agent的中文名称是User Agent,简称UA。它是一个特殊的字符串头,使服务器能够识别操作系统和版本、CPU 类型、客户端使用的浏览器和版本、浏览器渲染引擎、浏览器语言和浏览器插件等。
  一些网站经常判断UA将不同的页面发送到不同的操作系统和不同的浏览器,这可能会导致某些页面在某个浏览器中无法正常显示,但是可以通过伪装UA来绕过检测。
  浏览器的UA字符串
  标准格式为:浏览器标识(操作系统标识;加密级别标识;浏览器语言)渲染引擎标识版本信息
  浏览器 ID
  由于很多网站在进行UA检测时忽略了两位版本号,可能会导致浏览器及以后的版本收到不良页面。因此,浏览器10以后版本中的浏览器标识项固定为Browser,在UA字符串末尾添加真实版本信息。
  注:来自百度百科
  当浏览器发起请求时,我们可以查看请求信息。
  
  请求头:请求头将收录请求信息。
  2:在浏览器请求头中获取User-Agent
  (1) 请求
  
String userAgent = request.getHeader("user-agent");
  (2)获取
  
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
  三、UserAgentUtils.jar
  UserAgentUtils.jar 是 UserAgent 的工具类。
  (1)maven
  
eu.bitwalker
UserAgentUtils
1.20
  (2)java 代码
  
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
Browser browser = userAgent.getBrowser();
OperatingSystem os = userAgent.getOperatingSystem();
  参考文章: 查看全部

  浏览器抓取网页(小编来一起获取浏览器信息的方法(1)_java代码参考文章)
  java request.getHeader("user-agent") 获取浏览器信息的方法
  更新时间:2019-03-29 14:53:22 作者:小天才
  本文文章主要介绍java request.getHeader("user-agent")获取浏览器信息的方法。本文介绍的示例代码非常详细,对你的学习或工作有一定的参考价值。有需要的朋友,和小编一起学习吧。
  一、用户代理的含义
  User Agent的中文名称是User Agent,简称UA。它是一个特殊的字符串头,使服务器能够识别操作系统和版本、CPU 类型、客户端使用的浏览器和版本、浏览器渲染引擎、浏览器语言和浏览器插件等。
  一些网站经常判断UA将不同的页面发送到不同的操作系统和不同的浏览器,这可能会导致某些页面在某个浏览器中无法正常显示,但是可以通过伪装UA来绕过检测。
  浏览器的UA字符串
  标准格式为:浏览器标识(操作系统标识;加密级别标识;浏览器语言)渲染引擎标识版本信息
  浏览器 ID
  由于很多网站在进行UA检测时忽略了两位版本号,可能会导致浏览器及以后的版本收到不良页面。因此,浏览器10以后版本中的浏览器标识项固定为Browser,在UA字符串末尾添加真实版本信息。
  注:来自百度百科
  当浏览器发起请求时,我们可以查看请求信息。
  
  请求头:请求头将收录请求信息。
  2:在浏览器请求头中获取User-Agent
  (1) 请求
  
String userAgent = request.getHeader("user-agent");
  (2)获取
  
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
  三、UserAgentUtils.jar
  UserAgentUtils.jar 是 UserAgent 的工具类。
  (1)maven
  
eu.bitwalker
UserAgentUtils
1.20
  (2)java 代码
  
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
Browser browser = userAgent.getBrowser();
OperatingSystem os = userAgent.getOperatingSystem();
  参考文章:

浏览器抓取网页(我们浏览器提供宝藏网站/常用网站的新导航(组图))

网站优化优采云 发表了文章 • 0 个评论 • 81 次浏览 • 2021-11-22 17:12 • 来自相关话题

  浏览器抓取网页(我们浏览器提供宝藏网站/常用网站的新导航(组图))
  GM浏览器旨在为您提供更实用的网站和更愉快的浏览体验。
  【新导航】我们的浏览器为宝藏网站/常用网站提供了新的导航,区别于传统的网站导航。我们的网站导航收录很多宝物网站常用网站等你发现。上百条新闻网站,想看就看。近百首音乐网站,随时听。有很多新奇奇特的网站等你去发现,比如在线图片制作网络、文章自动生成器网络、千亿大像素网络等有趣的网站等你来发现你的赞赏。
  【音频和视频的获取】我们的浏览器提供了获取和保存网页音乐和视频的功能。它可以在网页上下载许多音乐视频并将它们保存在本地,以便在没有互联网的情况下轻松观看。我们已经支持对m3u8视频ts流视频的简单分析。我们的浏览器集成了下载功能,可以下载zip/pdf/word等,当然也可以下载mp4/mp3/aac等音乐视频。
  【边看新闻边听dj】可以下载自己喜欢的dj,只要在“已下载”中点击下载的音乐,正在播放,然后点击返回按钮,就可以暂停成循环音乐该播放器允许您在看新闻的同时听 dj。您可以在看新闻的同时通过向下滑动锁屏来控制音乐的“上一首”、“下一首”和播放进度。
  【图片获取】我们的浏览器优化了原图的长按获取,现在可以获取更多图片,包括各种动画图片和各种网上制作的表情。
  [广告过滤] 我们的浏览器现在可以屏蔽一些一般的广告网络广告。我们也非常关注广告拦截的功能。我们将在未来继续优化广告拦截。
  【新工具】手机鼠标:我们发现一些优秀的网站网页在电脑版上很难点击,一些小广告的关闭按钮很小,很难点击。所以我们开发了一个手机鼠标来辅助点击网页,它只是一个辅助工具哦!指针:我们想减少手指滑动点击的频率和压力,所以我们开发了一个网页链接器,可以辅助自动执行记录的点击路径并辅助点击。它也只是一个辅助点击工具!它可能无法用于日常浏览。我们已经向未来的自动浏览和解放双手迈出了第一步。
  【小工具】右侧边栏集成了自动纠错计算器、函数绘图仪、分贝计、二维码扫描仪、二维码生成器等小工具。
  [隐私]您的浏览记录和采集记录不会上传到我们的服务器,请随时浏览和采集。除了你自己和你浏览的对方网站和网络运营商,估计没有人知道你浏览访问的内容。请放心使用本浏览器。我们将尽最大努力确保用户无需登录的隐私。 查看全部

  浏览器抓取网页(我们浏览器提供宝藏网站/常用网站的新导航(组图))
  GM浏览器旨在为您提供更实用的网站和更愉快的浏览体验。
  【新导航】我们的浏览器为宝藏网站/常用网站提供了新的导航,区别于传统的网站导航。我们的网站导航收录很多宝物网站常用网站等你发现。上百条新闻网站,想看就看。近百首音乐网站,随时听。有很多新奇奇特的网站等你去发现,比如在线图片制作网络、文章自动生成器网络、千亿大像素网络等有趣的网站等你来发现你的赞赏。
  【音频和视频的获取】我们的浏览器提供了获取和保存网页音乐和视频的功能。它可以在网页上下载许多音乐视频并将它们保存在本地,以便在没有互联网的情况下轻松观看。我们已经支持对m3u8视频ts流视频的简单分析。我们的浏览器集成了下载功能,可以下载zip/pdf/word等,当然也可以下载mp4/mp3/aac等音乐视频。
  【边看新闻边听dj】可以下载自己喜欢的dj,只要在“已下载”中点击下载的音乐,正在播放,然后点击返回按钮,就可以暂停成循环音乐该播放器允许您在看新闻的同时听 dj。您可以在看新闻的同时通过向下滑动锁屏来控制音乐的“上一首”、“下一首”和播放进度。
  【图片获取】我们的浏览器优化了原图的长按获取,现在可以获取更多图片,包括各种动画图片和各种网上制作的表情。
  [广告过滤] 我们的浏览器现在可以屏蔽一些一般的广告网络广告。我们也非常关注广告拦截的功能。我们将在未来继续优化广告拦截。
  【新工具】手机鼠标:我们发现一些优秀的网站网页在电脑版上很难点击,一些小广告的关闭按钮很小,很难点击。所以我们开发了一个手机鼠标来辅助点击网页,它只是一个辅助工具哦!指针:我们想减少手指滑动点击的频率和压力,所以我们开发了一个网页链接器,可以辅助自动执行记录的点击路径并辅助点击。它也只是一个辅助点击工具!它可能无法用于日常浏览。我们已经向未来的自动浏览和解放双手迈出了第一步。
  【小工具】右侧边栏集成了自动纠错计算器、函数绘图仪、分贝计、二维码扫描仪、二维码生成器等小工具。
  [隐私]您的浏览记录和采集记录不会上传到我们的服务器,请随时浏览和采集。除了你自己和你浏览的对方网站和网络运营商,估计没有人知道你浏览访问的内容。请放心使用本浏览器。我们将尽最大努力确保用户无需登录的隐私。

浏览器抓取网页(Google搜索蜘蛛就要开始对部分网站开始用HTTP/2方式抓取网站内容)

网站优化优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2021-11-22 06:19 • 来自相关话题

  浏览器抓取网页(Google搜索蜘蛛就要开始对部分网站开始用HTTP/2方式抓取网站内容)
  国外谷歌站长透露,从今年11月开始,谷歌搜索将很快启用HTTP/2小范围抓取内容。抓取网页时效率会更高,不会影响网站搜索排名。 .
  
  我了解到HTTP/基于SPDY,一种注重性能的网络传输协议。与 HTTP/1 相比,它具有新的特性,如二进制成帧、多路复用等特性。正式使用HTTP/2抓包后,最大的特点就是支持一个目标用户和网站之间只有一个连接,相比HTTP/1谷歌蜘蛛抓取网站,谷歌可以用更少的资源更快地抓取内容@网站 更高的效率。
  Google 表示,目前主要的网站 和主流浏览器已经支持 HTTP/2 很长时间了。大多数CDN服务商也支持HTTP/2,使用HTTP/2的条件也基本成熟。从2020年11月开始,谷歌搜索蜘蛛将开始使用HTTP/2抓取一些网站 网站内容,然后慢慢增加对越来越多的网站的支持。
  当然,如果网站不支持HTTP/2或者网站不希望谷歌使用HTTP/2进行爬取,站长也可以,使用HTTP/1和HTTP/ 2.协议可以正常支持谷歌蜘蛛爬取网站的内容,不影响网站的搜索排名,谷歌蜘蛛爬取网站的质量和数量将保持不变。 查看全部

  浏览器抓取网页(Google搜索蜘蛛就要开始对部分网站开始用HTTP/2方式抓取网站内容)
  国外谷歌站长透露,从今年11月开始,谷歌搜索将很快启用HTTP/2小范围抓取内容。抓取网页时效率会更高,不会影响网站搜索排名。 .
  
  我了解到HTTP/基于SPDY,一种注重性能的网络传输协议。与 HTTP/1 相比,它具有新的特性,如二进制成帧、多路复用等特性。正式使用HTTP/2抓包后,最大的特点就是支持一个目标用户和网站之间只有一个连接,相比HTTP/1谷歌蜘蛛抓取网站,谷歌可以用更少的资源更快地抓取内容@网站 更高的效率。
  Google 表示,目前主要的网站 和主流浏览器已经支持 HTTP/2 很长时间了。大多数CDN服务商也支持HTTP/2,使用HTTP/2的条件也基本成熟。从2020年11月开始,谷歌搜索蜘蛛将开始使用HTTP/2抓取一些网站 网站内容,然后慢慢增加对越来越多的网站的支持。
  当然,如果网站不支持HTTP/2或者网站不希望谷歌使用HTTP/2进行爬取,站长也可以,使用HTTP/1和HTTP/ 2.协议可以正常支持谷歌蜘蛛爬取网站的内容,不影响网站的搜索排名,谷歌蜘蛛爬取网站的质量和数量将保持不变。

浏览器抓取网页(抓取网页数据的思路有好,抓取抓取数据思路 )

网站优化优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2021-12-29 08:03 • 来自相关话题

  浏览器抓取网页(抓取网页数据的思路有好,抓取抓取数据思路
)
  抓取网页数据的方式很多,一般有:直接代码请求http、模拟浏览器请求数据(一般需要登录验证)、控制浏览器实现数据抓取等,本文不考虑复杂度,放一个小例子读取简单网页数据:
  目标数据
  将所有这些球员的超链接保存在 ittf 网站的此页面上。
  
  数据请求
  我真的很喜欢符合人类思维的库,比如请求。如果想直接取网页文字,一句话就可以做到:
  
doc = requests.get(url).text
  解析html获取数据
  以beautifulsoup为例,它包括获取标签、链接、按照html层次遍历等方法。请参阅此处以供参考。以下代码段从 ittf 网站获取指向指定页面上指定位置的链接。
  
url = 'http://www.ittf.com/ittf_ranking/WR_Table_3_A2.asp?Age_category_1=&Age_category_2=&Age_category_3=&Age_category_4=&Age_category_5=&Category=100W&Cont=&Country=&Gender=W&Month1=4&Year1=2015&s_Player_Name=&Formv_WR_Table_3_Page='+str(page)
doc = requests.get(url).text
soup = BeautifulSoup(doc)
atags = soup.find_all('a')
rank_link_pre = 'http://www.ittf.com/ittf_ranking/'
mlfile = open(linkfile,'a')
for atag in atags:
#print atag
if atag!=None and atag.get('href') != None:
if "WR_Table_3_A2_Details.asp" in atag['href']:
link = rank_link_pre + atag['href']
links.append(link)
mlfile.write(link+'\n')
print 'fetch link: '+link
mlfile.close() 查看全部

  浏览器抓取网页(抓取网页数据的思路有好,抓取抓取数据思路
)
  抓取网页数据的方式很多,一般有:直接代码请求http、模拟浏览器请求数据(一般需要登录验证)、控制浏览器实现数据抓取等,本文不考虑复杂度,放一个小例子读取简单网页数据:
  目标数据
  将所有这些球员的超链接保存在 ittf 网站的此页面上。
  
  数据请求
  我真的很喜欢符合人类思维的库,比如请求。如果想直接取网页文字,一句话就可以做到:
  
doc = requests.get(url).text
  解析html获取数据
  以beautifulsoup为例,它包括获取标签、链接、按照html层次遍历等方法。请参阅此处以供参考。以下代码段从 ittf 网站获取指向指定页面上指定位置的链接。
  
url = 'http://www.ittf.com/ittf_ranking/WR_Table_3_A2.asp?Age_category_1=&Age_category_2=&Age_category_3=&Age_category_4=&Age_category_5=&Category=100W&Cont=&Country=&Gender=W&Month1=4&Year1=2015&s_Player_Name=&Formv_WR_Table_3_Page='+str(page)
doc = requests.get(url).text
soup = BeautifulSoup(doc)
atags = soup.find_all('a')
rank_link_pre = 'http://www.ittf.com/ittf_ranking/'
mlfile = open(linkfile,'a')
for atag in atags:
#print atag
if atag!=None and atag.get('href') != None:
if "WR_Table_3_A2_Details.asp" in atag['href']:
link = rank_link_pre + atag['href']
links.append(link)
mlfile.write(link+'\n')
print 'fetch link: '+link
mlfile.close()

浏览器抓取网页(如何使用java就能对网页数据进行爬取(图) )

网站优化优采云 发表了文章 • 0 个评论 • 345 次浏览 • 2021-12-28 00:17 • 来自相关话题

  浏览器抓取网页(如何使用java就能对网页数据进行爬取(图)
)
  今天,我将介绍如何使用java来抓取网页数据。本文将首先讲解如何分析对应的网页。
  以下是将要使用的技术或需要了解的技术:
  java(用来写爬虫程序)、Jsoup(java中解析html页面的工具)、html(一种识别语言,只要懂就好)、谷歌浏览器(用来浏览网页,也可以用其他浏览器)
  获取需求
  获取百度排名中的排名数据
  打开网页进行分析1.浏览网页
  下面是我们今天需要获取数据的网页,先打开
  
  从上面的截图我们可以看到,左上角是我们需要的数据,但是数据目前是嵌入在网页中的,所以我们需要一步步解析网页,得到一组结构化的数据。
  2.开放开发者工具
  通过使用快捷键 F12 或在页面上右击选择&gt;检查(其他浏览器可能有不同的快捷键或选项)
  
  然后,我们可以看到浏览器中会出现开发者工具面板(根据默认设置,面板可能会出现在右侧或其他地方)
  
  接下来,我们阅读相关代码(什么?阅读代码?可能很多人看完之后会吐槽,这么多代码,眼睛可能要看看了),其实还有一个比较简单的定位热点排名的方法列表的代码。
  3.定位相关代码
  有3种方法可以直接定位到你想看的代码位置:
  在热点列表顶部右击直接选择check,可以看到开发者工具中的代码直接定位到相关代码
  
  我们可以通过将鼠标悬停在相关代码上来直观地看到代码显示的区域
  
  点击开发者工具左上角的按钮,然后点击页面的相关区域(今天我们需要爬取热点排名数据,所以选择了热点排名区域),可以看到里面的代码右边的开发者工具直接选择后定位到指定的代码
   查看全部

  浏览器抓取网页(如何使用java就能对网页数据进行爬取(图)
)
  今天,我将介绍如何使用java来抓取网页数据。本文将首先讲解如何分析对应的网页。
  以下是将要使用的技术或需要了解的技术:
  java(用来写爬虫程序)、Jsoup(java中解析html页面的工具)、html(一种识别语言,只要懂就好)、谷歌浏览器(用来浏览网页,也可以用其他浏览器)
  获取需求
  获取百度排名中的排名数据
  打开网页进行分析1.浏览网页
  下面是我们今天需要获取数据的网页,先打开
  
  从上面的截图我们可以看到,左上角是我们需要的数据,但是数据目前是嵌入在网页中的,所以我们需要一步步解析网页,得到一组结构化的数据。
  2.开放开发者工具
  通过使用快捷键 F12 或在页面上右击选择&gt;检查(其他浏览器可能有不同的快捷键或选项)
  
  然后,我们可以看到浏览器中会出现开发者工具面板(根据默认设置,面板可能会出现在右侧或其他地方)
  
  接下来,我们阅读相关代码(什么?阅读代码?可能很多人看完之后会吐槽,这么多代码,眼睛可能要看看了),其实还有一个比较简单的定位热点排名的方法列表的代码。
  3.定位相关代码
  有3种方法可以直接定位到你想看的代码位置:
  在热点列表顶部右击直接选择check,可以看到开发者工具中的代码直接定位到相关代码
  
  我们可以通过将鼠标悬停在相关代码上来直观地看到代码显示的区域
  
  点击开发者工具左上角的按钮,然后点击页面的相关区域(今天我们需要爬取热点排名数据,所以选择了热点排名区域),可以看到里面的代码右边的开发者工具直接选择后定位到指定的代码
  

浏览器抓取网页(查找引擎页面作业靠蜘蛛(Spider)来核算链接权重)

网站优化优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2021-12-26 17:15 • 来自相关话题

  浏览器抓取网页(查找引擎页面作业靠蜘蛛(Spider)来核算链接权重)
  搜索引擎看似简单的爬取-放养-查询操作,但每个链接所隐含的算法却非常复杂。
  搜索引擎抓取页面是由蜘蛛完成的。爬行动作很简单就可以完成。但是,要爬取哪些页面,先爬取哪些页面,则需要由算法来决定。以下是一些爬行算法:
  1、宽度优先的爬取策略:
  我们都知道大多数网站都是按照树状图来完成页面分布的,那么在树状图链接结构中,哪些页面会先被抓取呢?为什么要先抓取这些页面?广度优先爬取策略是按照树状结构先爬取同级链接,等同级链接爬取完成后再爬取下一级链接。
  我们可以发现,当我陈述时,我使用了链接结构而不是网站结构。此处的链接结构可以收录
指向任何页面的链接,不一定是网站上的内部链接。这是一种理想化的广度优先爬行策略。在实际爬取过程中,不可能想到这么彻底的广度优先,而是有限的广度优先。
  2、 不完整的遍历链接权重计算:
  每个搜索引擎都有一套pagerank(指页面权重,非google PR)计算方法,并且经常更新。互联网几乎是无限的,每天都会出现大量的新链接。搜索引擎对链接权重的计算只能彻底遍历对错。为什么 Google PR 需要每三个月更新一次?为什么百度一个月更新1-2两次?这是因为搜索引擎使用非穷举的遍历链接权重算法来计算链接权重。其实按照现在的技能,完成更快的权重更新并不难。计算速度和存储速度完全可以跟得上,但为什么不这样做呢?既然不是那么必要,现在可能已经结束了,但我不想宣布。然后,
  为什么阻尼系数乘以网站数量?由于并非页面内的所有页面都参与权重转移,因此搜索引擎将再次删除 15% 的已过滤链接。
  但是这种非穷举的遍历权重计算需要积累一定的链接数才能再次开始计算,所以一般更新周期比较慢,不能满足用户对即时信息的需求。因此在此基础上,提出了一种实时权重分布捕获策略。即当蜘蛛爬完页面进入后,立即进行权重分配,将权重重新分配给要爬取的链接库,然后根据权重凹凸进行爬取。
  3、社会工程学抓策略
  社会工程学的策略是参与人工智能,或许是人工智能训练出来的机器智能,在蜘蛛爬行过程中决定爬行的优先级。我现在知道的爬取策略是:
  一个。热门优先策略:优先抓取爆款热门关键词,不需要经过严格的去重和过滤,因为会有新的链接覆盖和用户自动选择。
  湾 威望优先策略:搜索引擎会为每个网站分配一个威望度,通过网站历史、网站更新等来确定该网站的威望度,优先抓取威望高的网站链接。
  C。用户点击策略:当大多数在专业词库中搜索关键词时,频繁点击同一网站的搜索结果,搜索引擎会更频繁地抓取该网站。
  d. 历史参考策略:对于坚持频繁更新的网站,搜索引擎会为该网站建立一个更新历史,并根据更新历史估计未来的更新量并确定抓取频率。
  SEO作业辅导:
  搜索引擎的爬取原理已经讲得很深入了,下面就来解释一下这些原理对SEO作业的辅导效果:
  A. 准时、定量的更新会让蜘蛛按时抓取网站页面;
  B. 公司网站比个人网站有更高的声望;
  C. 建站时间长的网站更容易被爬取;
  D. 链接在页面内要适当传播,过多或过少都不好;
  E. 受用户喜爱的网站也受搜索引擎喜爱;
  F. 重要页面应放在较浅的网站结构中;
  G. 网站中的专业声望信息将提高网站的声望。
  成都网站建设公司_创信互联网,为您提供营销型网站建设、网站改版、网站收录、微信小程序、小程序开发、自适应网站 查看全部

  浏览器抓取网页(查找引擎页面作业靠蜘蛛(Spider)来核算链接权重)
  搜索引擎看似简单的爬取-放养-查询操作,但每个链接所隐含的算法却非常复杂。
  搜索引擎抓取页面是由蜘蛛完成的。爬行动作很简单就可以完成。但是,要爬取哪些页面,先爬取哪些页面,则需要由算法来决定。以下是一些爬行算法:
  1、宽度优先的爬取策略:
  我们都知道大多数网站都是按照树状图来完成页面分布的,那么在树状图链接结构中,哪些页面会先被抓取呢?为什么要先抓取这些页面?广度优先爬取策略是按照树状结构先爬取同级链接,等同级链接爬取完成后再爬取下一级链接。
  我们可以发现,当我陈述时,我使用了链接结构而不是网站结构。此处的链接结构可以收录
指向任何页面的链接,不一定是网站上的内部链接。这是一种理想化的广度优先爬行策略。在实际爬取过程中,不可能想到这么彻底的广度优先,而是有限的广度优先。
  2、 不完整的遍历链接权重计算:
  每个搜索引擎都有一套pagerank(指页面权重,非google PR)计算方法,并且经常更新。互联网几乎是无限的,每天都会出现大量的新链接。搜索引擎对链接权重的计算只能彻底遍历对错。为什么 Google PR 需要每三个月更新一次?为什么百度一个月更新1-2两次?这是因为搜索引擎使用非穷举的遍历链接权重算法来计算链接权重。其实按照现在的技能,完成更快的权重更新并不难。计算速度和存储速度完全可以跟得上,但为什么不这样做呢?既然不是那么必要,现在可能已经结束了,但我不想宣布。然后,
  为什么阻尼系数乘以网站数量?由于并非页面内的所有页面都参与权重转移,因此搜索引擎将再次删除 15% 的已过滤链接。
  但是这种非穷举的遍历权重计算需要积累一定的链接数才能再次开始计算,所以一般更新周期比较慢,不能满足用户对即时信息的需求。因此在此基础上,提出了一种实时权重分布捕获策略。即当蜘蛛爬完页面进入后,立即进行权重分配,将权重重新分配给要爬取的链接库,然后根据权重凹凸进行爬取。
  3、社会工程学抓策略
  社会工程学的策略是参与人工智能,或许是人工智能训练出来的机器智能,在蜘蛛爬行过程中决定爬行的优先级。我现在知道的爬取策略是:
  一个。热门优先策略:优先抓取爆款热门关键词,不需要经过严格的去重和过滤,因为会有新的链接覆盖和用户自动选择。
  湾 威望优先策略:搜索引擎会为每个网站分配一个威望度,通过网站历史、网站更新等来确定该网站的威望度,优先抓取威望高的网站链接。
  C。用户点击策略:当大多数在专业词库中搜索关键词时,频繁点击同一网站的搜索结果,搜索引擎会更频繁地抓取该网站。
  d. 历史参考策略:对于坚持频繁更新的网站,搜索引擎会为该网站建立一个更新历史,并根据更新历史估计未来的更新量并确定抓取频率。
  SEO作业辅导:
  搜索引擎的爬取原理已经讲得很深入了,下面就来解释一下这些原理对SEO作业的辅导效果:
  A. 准时、定量的更新会让蜘蛛按时抓取网站页面;
  B. 公司网站比个人网站有更高的声望;
  C. 建站时间长的网站更容易被爬取;
  D. 链接在页面内要适当传播,过多或过少都不好;
  E. 受用户喜爱的网站也受搜索引擎喜爱;
  F. 重要页面应放在较浅的网站结构中;
  G. 网站中的专业声望信息将提高网站的声望。
  成都网站建设公司_创信互联网,为您提供营销型网站建设、网站改版、网站收录、微信小程序、小程序开发、自适应网站

浏览器抓取网页(如何自己制作一个动态字体,如何让屏幕使用这些字体?)

网站优化优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2021-12-25 15:08 • 来自相关话题

  浏览器抓取网页(如何自己制作一个动态字体,如何让屏幕使用这些字体?)
  浏览器抓取网页,字体变成横向或竖向,通过判断前景色和背景色,根据本身的类型对字体进行选择,处理出想要的效果。js多看看mdn和w3school就好了。
  css有marginflow属性,兼容性不是太好。百度了一下,发现monospace居然是一个算法,来实现字体的纵向居中。css里可以用其它方法实现相同效果,但是效率比较低。思路是:让网页中的文字部分向左浮动,同时让背景层浮动。然后直接用webgl用3d曲面方法合成阴影。本人试过效果不是很好,不是程序猿如果能找到合适的算法,应该能实现很好的效果。用到一点geometrydiff的知识。
  一行代码搞定!还带方向
  完美解决
  osx和mac的safari:[userselections]:webgl->margintext[userselections]:webgl->margin-text[userselections]:webgl->margin-text
  网页中使用webgl和d3库就能完美做到,尤其是用d3.js,还能自动根据当前的网页渲染。但是渲染之后还是png这点糟心。
  css3renderingmonospacepreferences(方向传递)-mdn
  我个人也不知道有什么具体可行的方法,webgl方向传递方法,或许有些不稳定因素。曾经回答过这个问题,现在来完善下。感谢daisy:daisy:如何自己制作一个动态字体,如何让屏幕使用这些字体?的回答,我用到了alfredium,wordcloud,magician.il(这个id也可以是其他任何类似id)。有些是完全可以调试的,也就是说可以编辑看到。 查看全部

  浏览器抓取网页(如何自己制作一个动态字体,如何让屏幕使用这些字体?)
  浏览器抓取网页,字体变成横向或竖向,通过判断前景色和背景色,根据本身的类型对字体进行选择,处理出想要的效果。js多看看mdn和w3school就好了。
  css有marginflow属性,兼容性不是太好。百度了一下,发现monospace居然是一个算法,来实现字体的纵向居中。css里可以用其它方法实现相同效果,但是效率比较低。思路是:让网页中的文字部分向左浮动,同时让背景层浮动。然后直接用webgl用3d曲面方法合成阴影。本人试过效果不是很好,不是程序猿如果能找到合适的算法,应该能实现很好的效果。用到一点geometrydiff的知识。
  一行代码搞定!还带方向
  完美解决
  osx和mac的safari:[userselections]:webgl->margintext[userselections]:webgl->margin-text[userselections]:webgl->margin-text
  网页中使用webgl和d3库就能完美做到,尤其是用d3.js,还能自动根据当前的网页渲染。但是渲染之后还是png这点糟心。
  css3renderingmonospacepreferences(方向传递)-mdn
  我个人也不知道有什么具体可行的方法,webgl方向传递方法,或许有些不稳定因素。曾经回答过这个问题,现在来完善下。感谢daisy:daisy:如何自己制作一个动态字体,如何让屏幕使用这些字体?的回答,我用到了alfredium,wordcloud,magician.il(这个id也可以是其他任何类似id)。有些是完全可以调试的,也就是说可以编辑看到。

浏览器抓取网页(Javascript在网页定位方面的相关知识在定位中的应用)

网站优化优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2021-12-21 19:18 • 来自相关话题

  浏览器抓取网页(Javascript在网页定位方面的相关知识在定位中的应用)
  下面的教程总结了网页定位中Javascript的相关知识。
  一、网页的绝对和相对大小
  首先,我们必须澄清两个基本概念。
  一个网页的总面积就是它的绝对大小。通常,网页的绝对大小由内容和 CSS 样式表决定。
  网页的相对大小是指在浏览器窗口中看到的网页部分,即浏览器窗口的大小,也称为视口。
  下图中央的方框代表浏览器窗口,一次只能显示网页的一部分。
  (图1网页的绝对和相对大小)
  显然,如果网页的内容可以在浏览器窗口中显示出来(即不出现滚动条),那么网页的绝对大小和相对大小是相等的。
  二、获取网页的相对大小
  网页上的每个元素都有 clientHeight 和 clientWidth 属性,您可以使用它们来获取网页的相对大小。这两个属性所代表的大小是指元素的内容部分加上padding的大小,但不包括边框和滚动条所占用的空间。
  (图 2 clientHeight 和 clientWidth 属性)
  因此,文档元素的 clientHeight 和 clientWidth 属性表示网页的相对大小。
  函数 getViewport(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.clientWidth,
  高度:document.body.clientHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.clientWidth,
  高度:document.documentElement.clientHeight
  }
  }
  }
  上面的getViewport函数可以返回浏览器窗口的高度和宽度。使用时,有三个地方需要注意:
  1)这个函数必须在页面加载完成后运行,否则文档对象还没有生成,浏览器会报错。
  2) 在大多数情况下,document.documentElement.clientWidth 返回正确的值。但是在IE6的quirks模式下,document.body.clientWidth返回的是正确的值,所以在函数中加入了文档模式的判断。
  3)clientWidth 和 clientHeight 都是只读属性,不能赋值。
  三、获取网页的绝对大小
  document对象的scrollHeight和scrollWidth属性是网页的绝对大小,即滚动条的所有长度和宽度。
  以 getViewport() 函数为模型,您可以编写 getPagearea() 函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.scrollWidth,
  高度:document.body.scrollHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.scrollWidth,
  高度:document.documentElement.scrollHeight
  }
  }
  }
  但是,这个功能有问题。前面说过,如果网页的内容可以在没有滚动条的浏览器窗口中显示,那么网页的绝对大小和相对大小应该相等,即clientWidth和scrollWidth应该相等。但实际上,不同浏览器的处理方式不同,这两个值可能并不相等。因此,我们需要取其中较大的值,因此需要重写getPagearea()函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:Math.max(document.body.scrollWidth,
  document.body.clientWidth),
  高度:Math.max(document.body.scrollHeight,
  文档.body.clientHeight)
  }
  } 别的 {
  返回 {
  宽度:Math.max(document.documentElement.scrollWidth,
  document.documentElement.clientWidth),
  高度:Math.max(document.documentElement.scrollHeight,
  document.documentElement.clientHeight)
  }
  }
  }
  四、获取网页元素的绝对位置
  由于网页的大小可以分为绝对和相对,因此网页元素的位置也可以分为绝对和相对。网页元素左上角相对于整个网页左上角的坐标为绝对位置;相对于浏览器窗口左上角的坐标是相对位置。
  在Javascript中,网页元素的绝对坐标只能通过计算来获得。每个元素都有 offsetTop 和 offsetLeft 属性,表示元素左上角到父容器(offsetParent 对象)左上角的距离。因此,只需要将这两个值累加就可以得到元素的绝对坐标。
  (图3 offsetTop和offsetLeft属性)
  可以使用以下两个函数来获取绝对位置的横坐标和纵坐标。
  函数getElementLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  返回实际左;
  }
  函数 getElementTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  返回实际顶部;
  }
  由于在tables和iframes中,offsetParent对象可能不等于父容器,所以上述函数不适用于tables和iframes中的元素。
  五、获取网页元素的相对位置
  一旦有了元素的绝对位置,就很容易得到相对位置,只需从绝对坐标中减去滚动条的距离即可。滚动条的垂直距离是文档对象的scrollTop属性;滚动条的水平距离是文档对象的 scrollLeft 属性。
  (图4 scrollTop和scrollLeft属性)
  相应地重写上一节中的两个函数:
  函数 getElementViewLeft(element){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollLeft=document.body.scrollLeft;
  } 别的 {
  var elementScrollLeft=document.documentElement.scrollLeft;
  }
  返回actualLeft-elementScrollLeft;
  }
  函数 getElementViewTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  实际顶部 += 当前。偏移顶部;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollTop=document.body.scrollTop;
  } 别的 {
  var elementScrollTop=document.documentElement.scrollTop;
  }
  返回actualTop-elementScrollTop;
  }
  scrollTop 和 scrollLeft 属性可以赋值,它们会立即自动将网页滚动到相应的位置,因此您可以使用它们来改变网页元素的相对位置。另外 element.scrollIntoView() 方法也有类似的效果,可以让网页元素出现在浏览器窗口的左上角。
  六、快速获取元素位置的方法
  除了上述功能外,还有一种快速获取网页元素位置的方法。
  即使用 getBoundingClientRect() 方法。它返回一个收录四个属性的对象:left、right、top和bottom,分别对应元素左上角和右下角相对于浏览器窗口(视口)左上角的距离。
  所以,网页元素的相对位置是
  var X = this.getBoundingClientRect().left;
  var Y =this.getBoundingClientRect().top;
  加上滚动距离,可以得到绝对位置
  var X = this.getBoundingClientRect().left+document.documentElement.scrollLeft;
  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
  目前IE、Firefox 3.0+、Opera 9.5+都支持这种方式,但Firefox 2.x、Safari、Chrome、Konqueror不支持。
  (结束) 查看全部

  浏览器抓取网页(Javascript在网页定位方面的相关知识在定位中的应用)
  下面的教程总结了网页定位中Javascript的相关知识。
  一、网页的绝对和相对大小
  首先,我们必须澄清两个基本概念。
  一个网页的总面积就是它的绝对大小。通常,网页的绝对大小由内容和 CSS 样式表决定。
  网页的相对大小是指在浏览器窗口中看到的网页部分,即浏览器窗口的大小,也称为视口。
  下图中央的方框代表浏览器窗口,一次只能显示网页的一部分。
  (图1网页的绝对和相对大小)
  显然,如果网页的内容可以在浏览器窗口中显示出来(即不出现滚动条),那么网页的绝对大小和相对大小是相等的。
  二、获取网页的相对大小
  网页上的每个元素都有 clientHeight 和 clientWidth 属性,您可以使用它们来获取网页的相对大小。这两个属性所代表的大小是指元素的内容部分加上padding的大小,但不包括边框和滚动条所占用的空间。
  (图 2 clientHeight 和 clientWidth 属性)
  因此,文档元素的 clientHeight 和 clientWidth 属性表示网页的相对大小。
  函数 getViewport(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.clientWidth,
  高度:document.body.clientHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.clientWidth,
  高度:document.documentElement.clientHeight
  }
  }
  }
  上面的getViewport函数可以返回浏览器窗口的高度和宽度。使用时,有三个地方需要注意:
  1)这个函数必须在页面加载完成后运行,否则文档对象还没有生成,浏览器会报错。
  2) 在大多数情况下,document.documentElement.clientWidth 返回正确的值。但是在IE6的quirks模式下,document.body.clientWidth返回的是正确的值,所以在函数中加入了文档模式的判断。
  3)clientWidth 和 clientHeight 都是只读属性,不能赋值。
  三、获取网页的绝对大小
  document对象的scrollHeight和scrollWidth属性是网页的绝对大小,即滚动条的所有长度和宽度。
  以 getViewport() 函数为模型,您可以编写 getPagearea() 函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.scrollWidth,
  高度:document.body.scrollHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.scrollWidth,
  高度:document.documentElement.scrollHeight
  }
  }
  }
  但是,这个功能有问题。前面说过,如果网页的内容可以在没有滚动条的浏览器窗口中显示,那么网页的绝对大小和相对大小应该相等,即clientWidth和scrollWidth应该相等。但实际上,不同浏览器的处理方式不同,这两个值可能并不相等。因此,我们需要取其中较大的值,因此需要重写getPagearea()函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:Math.max(document.body.scrollWidth,
  document.body.clientWidth),
  高度:Math.max(document.body.scrollHeight,
  文档.body.clientHeight)
  }
  } 别的 {
  返回 {
  宽度:Math.max(document.documentElement.scrollWidth,
  document.documentElement.clientWidth),
  高度:Math.max(document.documentElement.scrollHeight,
  document.documentElement.clientHeight)
  }
  }
  }
  四、获取网页元素的绝对位置
  由于网页的大小可以分为绝对和相对,因此网页元素的位置也可以分为绝对和相对。网页元素左上角相对于整个网页左上角的坐标为绝对位置;相对于浏览器窗口左上角的坐标是相对位置。
  在Javascript中,网页元素的绝对坐标只能通过计算来获得。每个元素都有 offsetTop 和 offsetLeft 属性,表示元素左上角到父容器(offsetParent 对象)左上角的距离。因此,只需要将这两个值累加就可以得到元素的绝对坐标。
  (图3 offsetTop和offsetLeft属性)
  可以使用以下两个函数来获取绝对位置的横坐标和纵坐标。
  函数getElementLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  返回实际左;
  }
  函数 getElementTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  返回实际顶部;
  }
  由于在tables和iframes中,offsetParent对象可能不等于父容器,所以上述函数不适用于tables和iframes中的元素。
  五、获取网页元素的相对位置
  一旦有了元素的绝对位置,就很容易得到相对位置,只需从绝对坐标中减去滚动条的距离即可。滚动条的垂直距离是文档对象的scrollTop属性;滚动条的水平距离是文档对象的 scrollLeft 属性。
  (图4 scrollTop和scrollLeft属性)
  相应地重写上一节中的两个函数:
  函数 getElementViewLeft(element){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollLeft=document.body.scrollLeft;
  } 别的 {
  var elementScrollLeft=document.documentElement.scrollLeft;
  }
  返回actualLeft-elementScrollLeft;
  }
  函数 getElementViewTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  实际顶部 += 当前。偏移顶部;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollTop=document.body.scrollTop;
  } 别的 {
  var elementScrollTop=document.documentElement.scrollTop;
  }
  返回actualTop-elementScrollTop;
  }
  scrollTop 和 scrollLeft 属性可以赋值,它们会立即自动将网页滚动到相应的位置,因此您可以使用它们来改变网页元素的相对位置。另外 element.scrollIntoView() 方法也有类似的效果,可以让网页元素出现在浏览器窗口的左上角。
  六、快速获取元素位置的方法
  除了上述功能外,还有一种快速获取网页元素位置的方法。
  即使用 getBoundingClientRect() 方法。它返回一个收录四个属性的对象:left、right、top和bottom,分别对应元素左上角和右下角相对于浏览器窗口(视口)左上角的距离。
  所以,网页元素的相对位置是
  var X = this.getBoundingClientRect().left;
  var Y =this.getBoundingClientRect().top;
  加上滚动距离,可以得到绝对位置
  var X = this.getBoundingClientRect().left+document.documentElement.scrollLeft;
  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
  目前IE、Firefox 3.0+、Opera 9.5+都支持这种方式,但Firefox 2.x、Safari、Chrome、Konqueror不支持。
  (结束)

浏览器抓取网页(Fatkun批量图片下载工具(、edge浏览器扩展插件)图片批量下载)

网站优化优采云 发表了文章 • 0 个评论 • 288 次浏览 • 2021-12-21 19:18 • 来自相关话题

  浏览器抓取网页(Fatkun批量图片下载工具(、edge浏览器扩展插件)图片批量下载)
  Fatkun 批量图片下载工具(Chrome、边缘浏览器扩展)
  Fatkun 图片批量下载是适用于 Google Chrome 的免费且易于使用的 Chrome 扩展程序。它可以帮助您查找当前页面上的所有图片,您可以根据图片分辨率、链接等过滤图片,或自由点击。选择,最后一个键保存所有图片。
  安装Fatkun图片批量下载插件后,点击任意网页工具栏中的图标,会询问是下载所有标签页图片还是只下载当前标签页图片(如下图) ),也可以使用Alt+Z快捷键快速抓取当前标签的图片。
  
  在你要批量下载图片的网页上点击Fatkun插件后,它会帮你抓取页面上的所有图片,如下图所示,点击“保存图片”按钮进行下载和批量保存所有图片。
  
  可以看出,Fatkun图片批量下载插件还为我们提供了按图片分辨率大小过滤的功能(设置最小宽度和最小高度)和根据图片链接地址过滤的功能。合理的设置可以有效避免批量下载时在网站上下载一些无关图片如表情、缩略图、小装饰图标的尴尬。
  另外,点击“选项”后,Fatkun图片批量下载插件还可以设置按网页顺序重命名文件,或者将所有图片的链接导出到一个列表中以供其他方式使用,比如使用迅雷进行批量下载下载等等,还是很方便的。
  PS:最好等到页面完全加载完毕,再点击按钮批量下载图片,否则可能会出现抓取不完整或顺序不正确的问题。另外需要注意的是,在使用插件之前,请在浏览器设置中取消勾选“下载前询问每个文件的保存位置”,否则批量下载时会弹出大量保存框。
  img2tab-在新标签页中列出当前页面中的所有图片(支持Chrome和Firefox)
  严格来说,img2tab 并不是专门用于批量下载图片的扩展。顾名思义,它的功能就是抓取网页上的所有图片,然后按照新标签页上图片的顺序一一展示。
  但它的应用场景也很多。例如,一些网站 排版不佳,许多广告文字杂乱。这时候我们就可以用img2tab把所有的图片都提取出来放到一个新的页面上慢慢看。或者,在图片目录/相册列表等一些网页上,您也可以使用它来将所有图片提取到一个地方,而无需一一点击。
  
  当然,抓取图片后,我们也可以利用浏览器的“页面另存为...”功能,接受所有图片,实现“曲线”批量下载。
  img2tab 支持 Chrome 和 Firefox 浏览器。安装后会出现在网页的右键菜单中。有两种显示图像的方式,即“实际图像”和“链接图像”。前者是提取页面实际显示的图片,后者是提取链接所指向的图片(比如一个缩略图实际上显示在很多页面上,但是缩略图会有原创图片的链接,此功能将提取原创图片)。另外,单标签是指在一个标签页中显示所有图片,而没有单标签的选项是为每张图片创建一个新的标签页。 查看全部

  浏览器抓取网页(Fatkun批量图片下载工具(、edge浏览器扩展插件)图片批量下载)
  Fatkun 批量图片下载工具(Chrome、边缘浏览器扩展)
  Fatkun 图片批量下载是适用于 Google Chrome 的免费且易于使用的 Chrome 扩展程序。它可以帮助您查找当前页面上的所有图片,您可以根据图片分辨率、链接等过滤图片,或自由点击。选择,最后一个键保存所有图片。
  安装Fatkun图片批量下载插件后,点击任意网页工具栏中的图标,会询问是下载所有标签页图片还是只下载当前标签页图片(如下图) ),也可以使用Alt+Z快捷键快速抓取当前标签的图片。
  https://img.iplaysoft.com/wp-c ... .webp 2x" />
  在你要批量下载图片的网页上点击Fatkun插件后,它会帮你抓取页面上的所有图片,如下图所示,点击“保存图片”按钮进行下载和批量保存所有图片。
  https://img.iplaysoft.com/wp-c ... .webp 2x" />
  可以看出,Fatkun图片批量下载插件还为我们提供了按图片分辨率大小过滤的功能(设置最小宽度和最小高度)和根据图片链接地址过滤的功能。合理的设置可以有效避免批量下载时在网站上下载一些无关图片如表情、缩略图、小装饰图标的尴尬。
  另外,点击“选项”后,Fatkun图片批量下载插件还可以设置按网页顺序重命名文件,或者将所有图片的链接导出到一个列表中以供其他方式使用,比如使用迅雷进行批量下载下载等等,还是很方便的。
  PS:最好等到页面完全加载完毕,再点击按钮批量下载图片,否则可能会出现抓取不完整或顺序不正确的问题。另外需要注意的是,在使用插件之前,请在浏览器设置中取消勾选“下载前询问每个文件的保存位置”,否则批量下载时会弹出大量保存框。
  img2tab-在新标签页中列出当前页面中的所有图片(支持Chrome和Firefox)
  严格来说,img2tab 并不是专门用于批量下载图片的扩展。顾名思义,它的功能就是抓取网页上的所有图片,然后按照新标签页上图片的顺序一一展示。
  但它的应用场景也很多。例如,一些网站 排版不佳,许多广告文字杂乱。这时候我们就可以用img2tab把所有的图片都提取出来放到一个新的页面上慢慢看。或者,在图片目录/相册列表等一些网页上,您也可以使用它来将所有图片提取到一个地方,而无需一一点击。
  https://img.iplaysoft.com/wp-c ... .webp 2x" />
  当然,抓取图片后,我们也可以利用浏览器的“页面另存为...”功能,接受所有图片,实现“曲线”批量下载。
  img2tab 支持 Chrome 和 Firefox 浏览器。安装后会出现在网页的右键菜单中。有两种显示图像的方式,即“实际图像”和“链接图像”。前者是提取页面实际显示的图片,后者是提取链接所指向的图片(比如一个缩略图实际上显示在很多页面上,但是缩略图会有原创图片的链接,此功能将提取原创图片)。另外,单标签是指在一个标签页中显示所有图片,而没有单标签的选项是为每张图片创建一个新的标签页。

浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)

网站优化优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2021-12-17 21:18 • 来自相关话题

  浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
  urllib.error.HTTPError:HTTP 错误 403:禁止
  从403 Forbidden我们可以发现,此时网站是禁止程序访问的。这是因为csdn网站 设置了反爬虫机制。当网站检测到爬虫时,访问会被拒绝,所以我们会得到上面的结果。
  这时候就需要模拟浏览器访问,以避免网站的反爬虫机制,然后顺利抓取到我们想要的内容。
  接下来,我们将使用魔法库 urllib.request.Request 进行我们的模拟工作。这次我们也会先上传代码,然后再解释,不过这次要提醒大家的是,下面的代码不能直接使用。my_headers 中的 User-Agent 替换为我自己的。因为为了保密我加了省略号,不能直接使用。更换方法如下图所示。这次为了使用方便,我们引入一个函数:
  #coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/")
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  使用上面的代码,我们就可以正常的抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
  由于我们要模拟一个浏览器进行网页访问,这些参数自然需要我们在浏览器中搜索。
  首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下图框,然后我们点击Network,然后我们会发现没有我们页面的信息都打开了,没关系,这时候我们刷新页面的时候,就会出现下图所示的信息。
  
  这时候我们会在第一行看到51251757,就是我们网页网址后面的标签。这时候我们点击这个标签,就会出现下图所示的内容:
  
  下面是我直接访问这个网址时得到的截图:
  
  前两张图,之前写过版本2的访问,现在直接用了。当时我在csdn主页上点了这个博客,所以在代码中的header里填了referer和前两张图。是的
  ,而且这张图是我直接通过URL链接进入浏览器访问的,所以从图中可以看出referer是,这是我们的网站,贴在这里是为了让大家更好的了解这个referer。不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候一定不要用我给的User-Agent,因为我用省略号代替了一些。每个人都需要用自己的方式来弥补。
  这时候我们就会发现Headers,是不是有一种豁然开朗的感觉?是的,你的直觉是对的,我们需要的信息在这个标题中。
  然后,根据代码中需要的参数,把信息复制回来就可以使用了,因为这里显示的信息正好对应了key值,所以我们复制使用起来非常方便。
  下面介绍一下这个urllib.request.Request的用法(从官方文档翻译过来的):
  类 urllib.request。request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) 参数: url:不用说,这是我们即将访问的URL,是一个字符串。data:数据必须是一个字节对象,它指定要发送到服务器的附加数据,如果不需要,则为 None。目前,只有 HTTP 请求使用数据;当提供数据参数时,http 请求应该是 post 而不是 get。数据应以标准 application/x-www-form-urlencoded 格式进行缓冲。urllib.parse.urlencode() 函数的参数是一个映射或二进制序列,并以这种格式返回一个 ASCII 字符串。当它用作数据参数时,它应该被编码为字节。(我们暂时不需要这个,不用管它) headers: headers 是字典数据。当使用键和值参数调用 add_header() 时,此标头将作为请求进行处理。此标头通常用于防止爬虫访问服务器。头部是浏览器用来标识自己的,因为有些HTTP服务器只允许来自普通浏览器的请求而不是脚本(可以理解为爬虫)。
  这必然会增加网站服务器的处理负担,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以爬虫检测机制不是越严格越好,必须考虑服务器的负担。origin_req_host: origin_req_host 应该是发出原创事务请求的主机,RFC 2965 定义了它。它默认为 http.cookiejar.request_host(self)。
  这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是对收录图像的页面的请求的主机。(我们一般不使用这个,这里就知道了) unverifiable: unverifiable 应该表示请求是否是不可验证的,由RFC 2965定义,默认值为false。无法验证的请求意味着无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器上取回图片时,此时unverifiable值应该为true。method:method 应该是一个字符串,指示将使用 HTTP 请求方法(例如,“header”)。如果提供,它的值存储在方法属性中并由方法 get_method() 调用。子类可以通过在类中设置方法属性来指示默认方法。(这个我基本不会用。)说了这么多无聊的定义,我自己也受不了翻译了。让我们继续回到我们的程序:对于我们的程序,只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。
  req.add_header("User-Agent", random_header) 告诉网络服务器我是通过浏览器访问它,我不是爬虫。req.add_header("GET",url) 告诉浏览器我们正在访问的URL,req.add_header("Host","") 这是网站的信息,我们取自网站@ &gt; 填写即可。这句话req.add_header("Referer","") 很重要。它告诉 网站 服务器我们在哪里找到了我们想要访问的网页。比如你点击了百度,如果一个链接跳转到当前访问的页面,那么referer就是百度中的链接,这是一个判断机制。对于 header 构造方法也可以这样做:
  #coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/")
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  从上面的程序中可以看出,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent是硬编码的。其实我们可以发现,对于不同的主机访问同一个网页时,我们的另外三个信息:GET、Host、Referer可能都是一样的,而此时仅以User-Agent作为判断标准用户的异同,那么问题来了,如果我们向同学“借”一些User-Agents来使用,是不是模拟多个用户访问?是不是更酷。其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agents,然后通过random函数随机选择一个组合起来创建一个用户。多人访问的错觉其实很有用。要知道,对于网站来说,访问过多会阻塞用户的ip。这不好玩,所以想要永久访问一个网站而不被屏蔽,还是需要很多技巧的。
  当我们要爬取一个网站的多个网页时,很容易被网站检测到,由于主机频繁访问,进而被拦截。而如果我们在列表中放更多不同的主机号并随机使用它们,是不是很容易被发现?当然,当我们防止这种情况时,更好的方法是使用IP代理,因为我们不容易获得很多主机信息,而IP代理很容易从互联网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。 查看全部

  浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
  urllib.error.HTTPError:HTTP 错误 403:禁止
  从403 Forbidden我们可以发现,此时网站是禁止程序访问的。这是因为csdn网站 设置了反爬虫机制。当网站检测到爬虫时,访问会被拒绝,所以我们会得到上面的结果。
  这时候就需要模拟浏览器访问,以避免网站的反爬虫机制,然后顺利抓取到我们想要的内容。
  接下来,我们将使用魔法库 urllib.request.Request 进行我们的模拟工作。这次我们也会先上传代码,然后再解释,不过这次要提醒大家的是,下面的代码不能直接使用。my_headers 中的 User-Agent 替换为我自己的。因为为了保密我加了省略号,不能直接使用。更换方法如下图所示。这次为了使用方便,我们引入一个函数:
  #coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/";)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  使用上面的代码,我们就可以正常的抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
  由于我们要模拟一个浏览器进行网页访问,这些参数自然需要我们在浏览器中搜索。
  首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下图框,然后我们点击Network,然后我们会发现没有我们页面的信息都打开了,没关系,这时候我们刷新页面的时候,就会出现下图所示的信息。
  
  这时候我们会在第一行看到51251757,就是我们网页网址后面的标签。这时候我们点击这个标签,就会出现下图所示的内容:
  
  下面是我直接访问这个网址时得到的截图:
  
  前两张图,之前写过版本2的访问,现在直接用了。当时我在csdn主页上点了这个博客,所以在代码中的header里填了referer和前两张图。是的
  ,而且这张图是我直接通过URL链接进入浏览器访问的,所以从图中可以看出referer是,这是我们的网站,贴在这里是为了让大家更好的了解这个referer。不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候一定不要用我给的User-Agent,因为我用省略号代替了一些。每个人都需要用自己的方式来弥补。
  这时候我们就会发现Headers,是不是有一种豁然开朗的感觉?是的,你的直觉是对的,我们需要的信息在这个标题中。
  然后,根据代码中需要的参数,把信息复制回来就可以使用了,因为这里显示的信息正好对应了key值,所以我们复制使用起来非常方便。
  下面介绍一下这个urllib.request.Request的用法(从官方文档翻译过来的):
  类 urllib.request。request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) 参数: url:不用说,这是我们即将访问的URL,是一个字符串。data:数据必须是一个字节对象,它指定要发送到服务器的附加数据,如果不需要,则为 None。目前,只有 HTTP 请求使用数据;当提供数据参数时,http 请求应该是 post 而不是 get。数据应以标准 application/x-www-form-urlencoded 格式进行缓冲。urllib.parse.urlencode() 函数的参数是一个映射或二进制序列,并以这种格式返回一个 ASCII 字符串。当它用作数据参数时,它应该被编码为字节。(我们暂时不需要这个,不用管它) headers: headers 是字典数据。当使用键和值参数调用 add_header() 时,此标头将作为请求进行处理。此标头通常用于防止爬虫访问服务器。头部是浏览器用来标识自己的,因为有些HTTP服务器只允许来自普通浏览器的请求而不是脚本(可以理解为爬虫)。
  这必然会增加网站服务器的处理负担,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以爬虫检测机制不是越严格越好,必须考虑服务器的负担。origin_req_host: origin_req_host 应该是发出原创事务请求的主机,RFC 2965 定义了它。它默认为 http.cookiejar.request_host(self)。
  这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是对收录图像的页面的请求的主机。(我们一般不使用这个,这里就知道了) unverifiable: unverifiable 应该表示请求是否是不可验证的,由RFC 2965定义,默认值为false。无法验证的请求意味着无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器上取回图片时,此时unverifiable值应该为true。method:method 应该是一个字符串,指示将使用 HTTP 请求方法(例如,“header”)。如果提供,它的值存储在方法属性中并由方法 get_method() 调用。子类可以通过在类中设置方法属性来指示默认方法。(这个我基本不会用。)说了这么多无聊的定义,我自己也受不了翻译了。让我们继续回到我们的程序:对于我们的程序,只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。
  req.add_header("User-Agent", random_header) 告诉网络服务器我是通过浏览器访问它,我不是爬虫。req.add_header("GET",url) 告诉浏览器我们正在访问的URL,req.add_header("Host","") 这是网站的信息,我们取自网站@ &gt; 填写即可。这句话req.add_header("Referer","") 很重要。它告诉 网站 服务器我们在哪里找到了我们想要访问的网页。比如你点击了百度,如果一个链接跳转到当前访问的页面,那么referer就是百度中的链接,这是一个判断机制。对于 header 构造方法也可以这样做:
  #coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/";)
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  从上面的程序中可以看出,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent是硬编码的。其实我们可以发现,对于不同的主机访问同一个网页时,我们的另外三个信息:GET、Host、Referer可能都是一样的,而此时仅以User-Agent作为判断标准用户的异同,那么问题来了,如果我们向同学“借”一些User-Agents来使用,是不是模拟多个用户访问?是不是更酷。其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agents,然后通过random函数随机选择一个组合起来创建一个用户。多人访问的错觉其实很有用。要知道,对于网站来说,访问过多会阻塞用户的ip。这不好玩,所以想要永久访问一个网站而不被屏蔽,还是需要很多技巧的。
  当我们要爬取一个网站的多个网页时,很容易被网站检测到,由于主机频繁访问,进而被拦截。而如果我们在列表中放更多不同的主机号并随机使用它们,是不是很容易被发现?当然,当我们防止这种情况时,更好的方法是使用IP代理,因为我们不容易获得很多主机信息,而IP代理很容易从互联网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。

浏览器抓取网页(网页开发时需要操作相同类名的元素,不足之处的方法)

网站优化优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-12-15 20:03 • 来自相关话题

  浏览器抓取网页(网页开发时需要操作相同类名的元素,不足之处的方法)
  在网页开发中,我们经常需要对具有相同类名的元素进行操作,即具有相同类名的元素。在昨天的笔试中,我没有回答一个相关的问题:
  JavaScript获取页面中带有类test的节点
  因此,本文采集了一些相关资料,列举了两种较好的方法和不足之处。我希望你能批评和纠正他们。如果你有更好的方法,我希望你能分享
  解决方案1 Jeremy keuth解决方案
  Jeremy keuth叔叔在《JavaScript DOM编程艺术》(第二版)(英文:使用JavaScript和文档对象模型编写DOM脚本的web设计)第3章第4节中谈到了getelementsbyclass方法,以及如何在不支持此属性的浏览器(IE6、IE7和IE8,让我们瞧不起它们)中使用此方法,此处摘录并在某些地方进行了修改
  HTML5DOM中的一个新方法允许我们通过class属性中的类名访问元素,即getelementsbyclassname。由于该方法相对较新,因此在某些DOM实现中不可用,因此在使用它时应小心。让我们看看这个方法能为我们做什么,然后讨论如何可靠地使用这个方法
  与getElementsByTagName方法类似,getelementsbyclassname只接受一个参数,即类名:
  副本代码如下:
  getElementsByClassName(类)
  此方法的返回值类似于getElementsByTagName。它是具有相同类名的元素数组。以下代码行返回一个数组,其中收录类名为“sale”的所有元素:
  副本代码如下:
  文件。getElementsByClassName(“销售”)
  使用此方法,还可以查找具有多个类名的元素。要指定多个类名,只需在字符串参数中用空格分隔类名。例如,在
  您将在警告框中看到1,表示只有一个元素匹配,因为只有一个元素同时具有“重要”和“销售”类名。请注意,即使元素的class属性中类名的顺序是“sale-important”,而不是参数中指定的“重要sale”,元素仍将匹配。不仅类名的实际顺序无关紧要,元素是否有更多的类名也无关紧要。与getElementsByTagName一样,getelementsbyclassname和getelementbyid可以组合使用。如果您想知道ID为purchase的元素中有多少类名收录test的列表项,可以先找到特定的对象,然后调用getelementsbyclassname:
  副本代码如下:
  var购物=文档。getElementById(“购买”)
  var销售=购物。getElementsByClassName(“出售”)
  这样,sales数组只收录“purchase”列表中具有“sales”类的元素。运行以下代码行以查看sales数组收录两项:
  副本代码如下:
  警报(sales.length)
  这个getElementsByCassName方法非常有用,但它只受较新浏览器(Safari3.1、chorme、Firefox 3和opera9.5及更高版本)的支持。为了弥补这一不足,DOM脚本程序员需要使用现有的DOM方法来实现他们自己的GetElementsByCassName,这有点像成年礼。在大多数情况下,它们的实现过程大致类似于下面的getelementsbyclassname。此功能可应用于新浏览器和旧浏览器
  副本代码如下:
  函数getElementsByClassName(节点,类名){
  if(node.getElementsByClassName){
  返回节点。getElementsByClassName(类名称)
  }否则{
  var结果=[]
  var elems=节点。getElementsByTagName(“*”)
  for(var i=0;i if(elems[i].className.indexOf(className)!=-1){
  结果[结果.长度]=元素[i]
  }
  }
  返回结果
  }
  }
  getelementsbyclassname函数接受两个参数。第一个节点表示DOM树中的搜索起点,第二个类名是要搜索的类名。如果传入节点上已经存在相应的getelementsbyclassname函数,则新函数将直接返回相应的节点列表。如果getElementsByCassName函数不存在,新函数将遍历所有标记以查找具有相应类名的元素
  此方法的缺点是它不适用于多个类名
  如果您使用此函数模拟之前获取购物清单的操作,则可以编写如下:
  副本代码如下:
  var购物=文档。getElementById(“购买”)
  var销售=购物。getElementsByClassName(购物,“测试”)
  控制台。日志(销售)
  因此,要解决文章开头的问题,代码如下:
  副本代码如下:
  买什么
  别忘了买这东西
  解决方案2罗伯特·尼曼解决方案
  有许多方法可以搜索匹配的DOM元素,但很少有真正有效的方法。Jeremy keuth叔叔的方法有一个缺点,即它不能用于多个类名。2008年,Robert Nyman在文章最终的getelements byclassname中提供了自己的解决方案,anno 2008。2005年,罗伯特叔叔给出了他自己的getelementsbyclassname函数。2008年,他修改了一些代码并添加了许多新功能:
  1.如果当前浏览器支持GetElementsByCassName函数,请调用本机函数
  2.如果当前浏览器支持XPath,请使用它//Little flying fish:查找浏览器中内置的XML文档的强大方法,但浏览器支持并不统一
  3.支持搜索多个类名,而不考虑顺序
  4.返回一个真实的节点数组,而不是本机节点列表//Little flying fish:本机getElementsByCassName方法返回一个类似于数组的节点列表对象。它具有长度和数字索引属性,但不是数组。无法使用特定于数组的方法,如pop和push。在Robert提供的代码中,NodeList对象被转换为数组。将节点列表对象转换为数组的方法:
  副本代码如下:
  myList=数组。原型片呼叫(myNodeList)
  这是罗伯特叔叔的方法。有些地方我不太懂。我会在研究之后更新它
  副本代码如下:
  /*
  由Robert Nyman开发
  代码/许可证:
  */
  var getElementsByClassName=函数(类名、标记、elm){
  if(document.getElementsByClassName){
  getElementsByCassName=函数(类名、标记、elm){
  elm=elm | |文件
  var元素=elm。getElementsByClassName(类名称)
  节点名=(标记)?新的RegExp(“\\b”+标记+”\\b,“i”):null
  returnElements=[]
  电流
  对于(var i=0,il=elements.length;icurrent=elements[i]
  如果(!nodeName | | nodeName.test(current.nodeName)){
  返回元素。推动(电流)
  }
  }
  返回元素
  })
  }
  else if(文档评估){
  getElementsByCassName=函数(类名、标记、elm){
  标记=标记| |“*”
  elm=elm | |文件
  var classes=className。拆分(“”)
  classesToCheck=“”
  xhtmlNamespace=“”
  namespaceResolver=(document.documentElement.namespaceURI==xhtmlNamespace)?xhtmlNamespace:null
  returnElements=[]
  元素
  节点
  对于(var j=0,jl=classes.length;jclassesToCheck+=”[收录(concat(“”,@class'),“+classes[j]+”)]”
  }
  试一试{
  元素=文档。求值(“./”+标记+classesToCheck,elm,namespacesolver,0,null)
  }
  捕获(e){
  元素=文档。求值(“./”+标记+classesToCheck,elm,null,0,null)
  }
  while((node=elements.iterateNext()){
  返回元素。推送(节点)
  }
  返回元素
  })
  }
  否则{
  getElementsByCassName=函数(类名、标记、elm){
  标记=标记| |“*”
  elm=elm | |文件
  var classes=className。拆分(“”)
  classesToCheck=[]
  元素=(标记==“*”&&elm.all)?榆树所有人:埃尔姆。getElementsByTagName(标记)
  现在,
  returnElements=[]
  匹配
  对于(var k=0,kl=classes.length;kclassesToCheck.push(新的RegExp(“(^ |\\s)”+classes[k]+”(\\s |$)))
  }
  对于(var l=0,ll=elements.length;LCCurrent=elements[l]
  匹配=假
  for(var m=0,ml=classesToCheck.length;mmatch=classesToCheck[m].test(current.className)
  如果(!匹配){
  中断
  }
  }
  如果(匹配){
  返回元素。推动(电流)
  }
  }
  返回元素
  })
  }
  返回getElementsByClassName(className,tag,elm)
  }) 查看全部

  浏览器抓取网页(网页开发时需要操作相同类名的元素,不足之处的方法)
  在网页开发中,我们经常需要对具有相同类名的元素进行操作,即具有相同类名的元素。在昨天的笔试中,我没有回答一个相关的问题:
  JavaScript获取页面中带有类test的节点
  因此,本文采集了一些相关资料,列举了两种较好的方法和不足之处。我希望你能批评和纠正他们。如果你有更好的方法,我希望你能分享
  解决方案1 Jeremy keuth解决方案
  Jeremy keuth叔叔在《JavaScript DOM编程艺术》(第二版)(英文:使用JavaScript和文档对象模型编写DOM脚本的web设计)第3章第4节中谈到了getelementsbyclass方法,以及如何在不支持此属性的浏览器(IE6、IE7和IE8,让我们瞧不起它们)中使用此方法,此处摘录并在某些地方进行了修改
  HTML5DOM中的一个新方法允许我们通过class属性中的类名访问元素,即getelementsbyclassname。由于该方法相对较新,因此在某些DOM实现中不可用,因此在使用它时应小心。让我们看看这个方法能为我们做什么,然后讨论如何可靠地使用这个方法
  与getElementsByTagName方法类似,getelementsbyclassname只接受一个参数,即类名:
  副本代码如下:
  getElementsByClassName(类)
  此方法的返回值类似于getElementsByTagName。它是具有相同类名的元素数组。以下代码行返回一个数组,其中收录类名为“sale”的所有元素:
  副本代码如下:
  文件。getElementsByClassName(“销售”)
  使用此方法,还可以查找具有多个类名的元素。要指定多个类名,只需在字符串参数中用空格分隔类名。例如,在
  您将在警告框中看到1,表示只有一个元素匹配,因为只有一个元素同时具有“重要”和“销售”类名。请注意,即使元素的class属性中类名的顺序是“sale-important”,而不是参数中指定的“重要sale”,元素仍将匹配。不仅类名的实际顺序无关紧要,元素是否有更多的类名也无关紧要。与getElementsByTagName一样,getelementsbyclassname和getelementbyid可以组合使用。如果您想知道ID为purchase的元素中有多少类名收录test的列表项,可以先找到特定的对象,然后调用getelementsbyclassname:
  副本代码如下:
  var购物=文档。getElementById(“购买”)
  var销售=购物。getElementsByClassName(“出售”)
  这样,sales数组只收录“purchase”列表中具有“sales”类的元素。运行以下代码行以查看sales数组收录两项:
  副本代码如下:
  警报(sales.length)
  这个getElementsByCassName方法非常有用,但它只受较新浏览器(Safari3.1、chorme、Firefox 3和opera9.5及更高版本)的支持。为了弥补这一不足,DOM脚本程序员需要使用现有的DOM方法来实现他们自己的GetElementsByCassName,这有点像成年礼。在大多数情况下,它们的实现过程大致类似于下面的getelementsbyclassname。此功能可应用于新浏览器和旧浏览器
  副本代码如下:
  函数getElementsByClassName(节点,类名){
  if(node.getElementsByClassName){
  返回节点。getElementsByClassName(类名称)
  }否则{
  var结果=[]
  var elems=节点。getElementsByTagName(“*”)
  for(var i=0;i if(elems[i].className.indexOf(className)!=-1){
  结果[结果.长度]=元素[i]
  }
  }
  返回结果
  }
  }
  getelementsbyclassname函数接受两个参数。第一个节点表示DOM树中的搜索起点,第二个类名是要搜索的类名。如果传入节点上已经存在相应的getelementsbyclassname函数,则新函数将直接返回相应的节点列表。如果getElementsByCassName函数不存在,新函数将遍历所有标记以查找具有相应类名的元素
  此方法的缺点是它不适用于多个类名
  如果您使用此函数模拟之前获取购物清单的操作,则可以编写如下:
  副本代码如下:
  var购物=文档。getElementById(“购买”)
  var销售=购物。getElementsByClassName(购物,“测试”)
  控制台。日志(销售)
  因此,要解决文章开头的问题,代码如下:
  副本代码如下:
  买什么
  别忘了买这东西
  解决方案2罗伯特·尼曼解决方案
  有许多方法可以搜索匹配的DOM元素,但很少有真正有效的方法。Jeremy keuth叔叔的方法有一个缺点,即它不能用于多个类名。2008年,Robert Nyman在文章最终的getelements byclassname中提供了自己的解决方案,anno 2008。2005年,罗伯特叔叔给出了他自己的getelementsbyclassname函数。2008年,他修改了一些代码并添加了许多新功能:
  1.如果当前浏览器支持GetElementsByCassName函数,请调用本机函数
  2.如果当前浏览器支持XPath,请使用它//Little flying fish:查找浏览器中内置的XML文档的强大方法,但浏览器支持并不统一
  3.支持搜索多个类名,而不考虑顺序
  4.返回一个真实的节点数组,而不是本机节点列表//Little flying fish:本机getElementsByCassName方法返回一个类似于数组的节点列表对象。它具有长度和数字索引属性,但不是数组。无法使用特定于数组的方法,如pop和push。在Robert提供的代码中,NodeList对象被转换为数组。将节点列表对象转换为数组的方法:
  副本代码如下:
  myList=数组。原型片呼叫(myNodeList)
  这是罗伯特叔叔的方法。有些地方我不太懂。我会在研究之后更新它
  副本代码如下:
  /*
  由Robert Nyman开发
  代码/许可证:
  */
  var getElementsByClassName=函数(类名、标记、elm){
  if(document.getElementsByClassName){
  getElementsByCassName=函数(类名、标记、elm){
  elm=elm | |文件
  var元素=elm。getElementsByClassName(类名称)
  节点名=(标记)?新的RegExp(“\\b”+标记+”\\b,“i”):null
  returnElements=[]
  电流
  对于(var i=0,il=elements.length;icurrent=elements[i]
  如果(!nodeName | | nodeName.test(current.nodeName)){
  返回元素。推动(电流)
  }
  }
  返回元素
  })
  }
  else if(文档评估){
  getElementsByCassName=函数(类名、标记、elm){
  标记=标记| |“*”
  elm=elm | |文件
  var classes=className。拆分(“”)
  classesToCheck=“”
  xhtmlNamespace=“”
  namespaceResolver=(document.documentElement.namespaceURI==xhtmlNamespace)?xhtmlNamespace:null
  returnElements=[]
  元素
  节点
  对于(var j=0,jl=classes.length;jclassesToCheck+=”[收录(concat(“”,@class'),“+classes[j]+”)]”
  }
  试一试{
  元素=文档。求值(“./”+标记+classesToCheck,elm,namespacesolver,0,null)
  }
  捕获(e){
  元素=文档。求值(“./”+标记+classesToCheck,elm,null,0,null)
  }
  while((node=elements.iterateNext()){
  返回元素。推送(节点)
  }
  返回元素
  })
  }
  否则{
  getElementsByCassName=函数(类名、标记、elm){
  标记=标记| |“*”
  elm=elm | |文件
  var classes=className。拆分(“”)
  classesToCheck=[]
  元素=(标记==“*”&&elm.all)?榆树所有人:埃尔姆。getElementsByTagName(标记)
  现在,
  returnElements=[]
  匹配
  对于(var k=0,kl=classes.length;kclassesToCheck.push(新的RegExp(“(^ |\\s)”+classes[k]+”(\\s |$)))
  }
  对于(var l=0,ll=elements.length;LCCurrent=elements[l]
  匹配=假
  for(var m=0,ml=classesToCheck.length;mmatch=classesToCheck[m].test(current.className)
  如果(!匹配){
  中断
  }
  }
  如果(匹配){
  返回元素。推动(电流)
  }
  }
  返回元素
  })
  }
  返回getElementsByClassName(className,tag,elm)
  })

浏览器抓取网页(如何在Linux上的顶级网页浏览器,你有哪些最佳选择)

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-12-15 13:14 • 来自相关话题

  浏览器抓取网页(如何在Linux上的顶级网页浏览器,你有哪些最佳选择)
  译者:王星宇
  没有完美的网络浏览器这样的东西。这一切都取决于你喜欢什么以及你用它做什么。
  但是对于 Linux 上的 Web 浏览器,您的最佳选择是什么?
  在这个 文章 中,我试图为您提供在 Ubuntu 和其他 Linux 系统上使用的最佳 Web 浏览器。
  注意:我们已经在 Ubuntu 上尝试并测试了这些浏览器。但是,您应该能够将它安装在您选择的任何 Linux 发行版上。
  Linux 上的顶级 Web 浏览器
  每个浏览器都有自己的独特性。此外,Linux 平台还有一些有趣且独特的选项。
  在您看到此列表之前,请注意这不是排名列表。排名第 1 的浏览器不应被认为比排名第 2、3 或 10 的浏览器更好。
  非自由和开源软件警告!
  这里提到的一些应用程序不是开源的。之所以在此列出它们,是因为它们可在 Linux 上使用,并且 文章 的重点是 Linux。我们还有一个单独的开源 Web 浏览器专用列表。
  1、维瓦尔第
  
  优势
  快速访问 Web 应用程序的侧边栏
  集成日历和电子邮件
  独特的标签管理
  番茄钟功能(时钟定时器)
  有一个移动应用程序
  缺点
  使用各种功能时,资源消耗大
  不是 100% 开源
  它是一款令人印象深刻的浏览器,越来越受到 Linux 用户的关注。
  虽然它不是 100% 开源,但您可以在网上找到它的大部分源代码(除了它的用户界面)。
  即使它是一个快速的网络浏览器,我也不认为它是“最快的”或最轻量的。您在工作时需要大量内存来执行其所有功能。
  简而言之,它是一个功能丰富的网络浏览器。因此,如果您需要尽可能多的功能来完成多项任务,Vivaldi 可以是您的选择。
  如何在 Linux 上安装 Vivaldi?
  Vivaldi 提供了 .deb 和 .rpm 两个软件包,因此您可以直接在 Linux 系统上安装它。
  如果您是 Linux 新手,您可以参考我们的资源来安装 Deb 文件和安装 RPM 文件。
  2、Mozilla Firefox
  
  优势
  隐私保护
  不基于 Chrome 引擎
  开源
  火狐账号服务
  缺点
  用户体验将随着重大更新而改变
  除了开源之外,它还提供了一些最好的隐私保护功能。此外,通过正确的设置,您可以将其变成类似于 Tor 浏览器(也基于 Firefox)的最安全的浏览器之一。
  不仅安全,当您使用 Firefox 帐户登录时,它还集成了一些有用的功能,例如 Pocket(保存网页并稍后阅读)、VPN、电子邮件别名、漏洞监控等。
  如何在 Linux 上安装 Firefox?
  它应该预先安装在您的 Linux 发行版中。但是,如果不存在,可以在软件中心搜索,或者在终端中使用以下命令进行安装:
  3、铬
  
  优势
  Chrome 浏览器的开源替代品
  类似于Chrome浏览器的功能
  缺点
  缺少 Chrome 浏览器提供的某些功能
  如果您不想使用 Chrome 浏览器,Chromium 是您在 Linux 上获得相同体验的最佳选择。
  如何在 Linux 上安装 Chromium?
  您应该能够在软件中心轻松找到它。但是,如果您需要帮助,可以参考我们的 Chromium 安装指南。
  4、谷歌浏览器
  
  优势
  与 Google 服务无缝集成
  缺点
  不开源
  您可以获得所有基本功能并能够集成所有谷歌服务。如果你喜欢在 Android 上使用 Chrome 浏览器,并希望在多个平台上同步,那么它是桌面 Linux 的不二之选。
  如果您在使用 Google 服务时正在寻找一个简单而强大的网络浏览器,那么 Chrome 浏览器可能是一个不错的选择。
  如何在 Linux 上安装 Chrome 浏览器?
  Chrome 浏览器提供了 Deb 和 RPM 包,允许您安装在任何 Ubuntu 或 Fedora/openSUSE 发行版上。
  如果您在安装方面需要帮助,我应该向您指出我们在 Linux 上安装 Chrome 浏览器的指南。
  5、勇敢
  
  优势
  隐私保护功能
  表现
  缺点
  没有基于帐户的同步
  该浏览器是最流行的 Linux 浏览器之一。
  它是一个基于 Chromium 的开源项目。它提供了几个有用的隐私保护功能,并以其极快的性能而闻名。
  与其他浏览器不同的是,即使在网站上屏蔽广告,仍然可以获得奖励。您采集的奖励只能用于回馈您喜欢的网站。通过这种方式,您还可以在屏蔽广告的同时获得对 网站 的支持。
  您可以期望以最少的资源使用获得更快的用户体验。
  如果你需要在两者之间做出选择,我们还有Brave和Firefox文章的详细对比。
  如何在 Linux 上安装 Brave?
  与其他一些网络浏览器不同,您无法直接在软件中心找到软件包。您需要在终端中输入一些命令来安装浏览器。
  别担心,您可以按照我们的说明安装 Brave 浏览器。
  6、歌剧
  
  优势
  内置免费 VPN
  额外功能
  缺点
  不开源
  它有一个内置的 VPN 和广告拦截器。因此,在Opera浏览器的帮助下,您应该得到基本的隐私保护。
  您可以直接从侧边栏快速访问流行的聊天信使,而无需启动单独的应用程序或窗口。这个侧边栏聊天信使网络应用程序与 Vivaldi 类似,但用户体验明显不同。
  一般来说,如果你想要一个免费的 VPN 作为其他基本浏览功能的额外奖励,它是一个不错的选择。
  如何安装 Opera?
  Opera 为 Linux 提供了 Deb 包。你只需要去它的官方网站下载安装即可。
  7、Microsoft Edge
  
  优势
  它为也使用 Linux 的 Windows 用户提供了一个方便的选择。
  缺点
  不开源
  Microsoft Edge 的受欢迎程度已经超过了 Mozilla Firefox。不仅因为它是默认的 Windows 浏览器,而且因为它是基于 Chrome 浏览器的,所以它也提供了很有前途的网络体验。
  Microsoft Edge 已发布适用于 Linux 的稳定版本。它目前运行良好,但缺少一些通常可用于 Windows 的功能。
  一般来说,您应该会发现大部分基本功能都可用。
  如果您使用 Windows 和 Linux 作为桌面平台,Microsoft Edge 可被视为您首选的 Web 浏览器。
  如何在 Linux 上安装 Microsoft Edge?
  现在,您可以通过 Microsoft Edge 的官方网页获取 Deb/RPM 文件并进行安装。
  您还可以查看我们在 Linux 上安装 Microsoft 的方法。
  Linux 独特的网络浏览器
  考虑到安全更新和未来升级,大多数用户喜欢坚持主流选项,但也有一些不同的选项。此外,有些是 Linux 用户独有的。
  8、GNOME Web(顿悟)
  
  优势
  精简
  开源
  缺点
  许多功能缺失
  没有跨平台支持
  Epiphany 浏览器是 GNOME 的默认浏览器。elementary OS 也将其用作默认的 Web 浏览器。
  它是一个流线型的浏览器,可提供干净优雅的用户体验。您无法同步您的书签或历史记录,因此如果您要备份或传输到其他浏览器,则需要手动导出它们。
  如何安装 GNOME Web?
  您可能会发现它已预安装在某些 Linux 发行版中。如果没有,您可以使用它的 Flatpak 包在任何 Linux 发行版上安装最新版本。
  9、法尔肯
  
  优势
  基于 Firefox 的替代方案
  缺点
  无法取代火狐
  没有跨平台支持 查看全部

  浏览器抓取网页(如何在Linux上的顶级网页浏览器,你有哪些最佳选择)
  译者:王星宇
  没有完美的网络浏览器这样的东西。这一切都取决于你喜欢什么以及你用它做什么。
  但是对于 Linux 上的 Web 浏览器,您的最佳选择是什么?
  在这个 文章 中,我试图为您提供在 Ubuntu 和其他 Linux 系统上使用的最佳 Web 浏览器。
  注意:我们已经在 Ubuntu 上尝试并测试了这些浏览器。但是,您应该能够将它安装在您选择的任何 Linux 发行版上。
  Linux 上的顶级 Web 浏览器
  每个浏览器都有自己的独特性。此外,Linux 平台还有一些有趣且独特的选项。
  在您看到此列表之前,请注意这不是排名列表。排名第 1 的浏览器不应被认为比排名第 2、3 或 10 的浏览器更好。
  非自由和开源软件警告!
  这里提到的一些应用程序不是开源的。之所以在此列出它们,是因为它们可在 Linux 上使用,并且 文章 的重点是 Linux。我们还有一个单独的开源 Web 浏览器专用列表。
  1、维瓦尔第
  
  优势
  快速访问 Web 应用程序的侧边栏
  集成日历和电子邮件
  独特的标签管理
  番茄钟功能(时钟定时器)
  有一个移动应用程序
  缺点
  使用各种功能时,资源消耗大
  不是 100% 开源
  它是一款令人印象深刻的浏览器,越来越受到 Linux 用户的关注。
  虽然它不是 100% 开源,但您可以在网上找到它的大部分源代码(除了它的用户界面)。
  即使它是一个快速的网络浏览器,我也不认为它是“最快的”或最轻量的。您在工作时需要大量内存来执行其所有功能。
  简而言之,它是一个功能丰富的网络浏览器。因此,如果您需要尽可能多的功能来完成多项任务,Vivaldi 可以是您的选择。
  如何在 Linux 上安装 Vivaldi?
  Vivaldi 提供了 .deb 和 .rpm 两个软件包,因此您可以直接在 Linux 系统上安装它。
  如果您是 Linux 新手,您可以参考我们的资源来安装 Deb 文件和安装 RPM 文件。
  2、Mozilla Firefox
  
  优势
  隐私保护
  不基于 Chrome 引擎
  开源
  火狐账号服务
  缺点
  用户体验将随着重大更新而改变
  除了开源之外,它还提供了一些最好的隐私保护功能。此外,通过正确的设置,您可以将其变成类似于 Tor 浏览器(也基于 Firefox)的最安全的浏览器之一。
  不仅安全,当您使用 Firefox 帐户登录时,它还集成了一些有用的功能,例如 Pocket(保存网页并稍后阅读)、VPN、电子邮件别名、漏洞监控等。
  如何在 Linux 上安装 Firefox?
  它应该预先安装在您的 Linux 发行版中。但是,如果不存在,可以在软件中心搜索,或者在终端中使用以下命令进行安装:
  3、铬
  
  优势
  Chrome 浏览器的开源替代品
  类似于Chrome浏览器的功能
  缺点
  缺少 Chrome 浏览器提供的某些功能
  如果您不想使用 Chrome 浏览器,Chromium 是您在 Linux 上获得相同体验的最佳选择。
  如何在 Linux 上安装 Chromium?
  您应该能够在软件中心轻松找到它。但是,如果您需要帮助,可以参考我们的 Chromium 安装指南。
  4、谷歌浏览器
  
  优势
  与 Google 服务无缝集成
  缺点
  不开源
  您可以获得所有基本功能并能够集成所有谷歌服务。如果你喜欢在 Android 上使用 Chrome 浏览器,并希望在多个平台上同步,那么它是桌面 Linux 的不二之选。
  如果您在使用 Google 服务时正在寻找一个简单而强大的网络浏览器,那么 Chrome 浏览器可能是一个不错的选择。
  如何在 Linux 上安装 Chrome 浏览器?
  Chrome 浏览器提供了 Deb 和 RPM 包,允许您安装在任何 Ubuntu 或 Fedora/openSUSE 发行版上。
  如果您在安装方面需要帮助,我应该向您指出我们在 Linux 上安装 Chrome 浏览器的指南。
  5、勇敢
  
  优势
  隐私保护功能
  表现
  缺点
  没有基于帐户的同步
  该浏览器是最流行的 Linux 浏览器之一。
  它是一个基于 Chromium 的开源项目。它提供了几个有用的隐私保护功能,并以其极快的性能而闻名。
  与其他浏览器不同的是,即使在网站上屏蔽广告,仍然可以获得奖励。您采集的奖励只能用于回馈您喜欢的网站。通过这种方式,您还可以在屏蔽广告的同时获得对 网站 的支持。
  您可以期望以最少的资源使用获得更快的用户体验。
  如果你需要在两者之间做出选择,我们还有Brave和Firefox文章的详细对比。
  如何在 Linux 上安装 Brave?
  与其他一些网络浏览器不同,您无法直接在软件中心找到软件包。您需要在终端中输入一些命令来安装浏览器。
  别担心,您可以按照我们的说明安装 Brave 浏览器。
  6、歌剧
  
  优势
  内置免费 VPN
  额外功能
  缺点
  不开源
  它有一个内置的 VPN 和广告拦截器。因此,在Opera浏览器的帮助下,您应该得到基本的隐私保护。
  您可以直接从侧边栏快速访问流行的聊天信使,而无需启动单独的应用程序或窗口。这个侧边栏聊天信使网络应用程序与 Vivaldi 类似,但用户体验明显不同。
  一般来说,如果你想要一个免费的 VPN 作为其他基本浏览功能的额外奖励,它是一个不错的选择。
  如何安装 Opera?
  Opera 为 Linux 提供了 Deb 包。你只需要去它的官方网站下载安装即可。
  7、Microsoft Edge
  
  优势
  它为也使用 Linux 的 Windows 用户提供了一个方便的选择。
  缺点
  不开源
  Microsoft Edge 的受欢迎程度已经超过了 Mozilla Firefox。不仅因为它是默认的 Windows 浏览器,而且因为它是基于 Chrome 浏览器的,所以它也提供了很有前途的网络体验。
  Microsoft Edge 已发布适用于 Linux 的稳定版本。它目前运行良好,但缺少一些通常可用于 Windows 的功能。
  一般来说,您应该会发现大部分基本功能都可用。
  如果您使用 Windows 和 Linux 作为桌面平台,Microsoft Edge 可被视为您首选的 Web 浏览器。
  如何在 Linux 上安装 Microsoft Edge?
  现在,您可以通过 Microsoft Edge 的官方网页获取 Deb/RPM 文件并进行安装。
  您还可以查看我们在 Linux 上安装 Microsoft 的方法。
  Linux 独特的网络浏览器
  考虑到安全更新和未来升级,大多数用户喜欢坚持主流选项,但也有一些不同的选项。此外,有些是 Linux 用户独有的。
  8、GNOME Web(顿悟)
  
  优势
  精简
  开源
  缺点
  许多功能缺失
  没有跨平台支持
  Epiphany 浏览器是 GNOME 的默认浏览器。elementary OS 也将其用作默认的 Web 浏览器。
  它是一个流线型的浏览器,可提供干净优雅的用户体验。您无法同步您的书签或历史记录,因此如果您要备份或传输到其他浏览器,则需要手动导出它们。
  如何安装 GNOME Web?
  您可能会发现它已预安装在某些 Linux 发行版中。如果没有,您可以使用它的 Flatpak 包在任何 Linux 发行版上安装最新版本。
  9、法尔肯
  
  优势
  基于 Firefox 的替代方案
  缺点
  无法取代火狐
  没有跨平台支持

浏览器抓取网页(获取Chrome浏览器分享时的页面的截屏,运行结果)

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-12-13 12:19 • 来自相关话题

  浏览器抓取网页(获取Chrome浏览器分享时的页面的截屏,运行结果)
  今天在项目中遇到这样一个需求:在Chrome浏览器分享时获取页面截图。坐下想一想,既然是共享,就必须通过Intent来传递数据。如果真的能拿到Chrome分享页面的截图,那么Intent的数据中肯定有.jpg或.png结尾的数据。直接做,写Demo。
  首先,创建一个新的 BrowserScreenShotActivity.java 并在 AndroidManifest.xml 中注册它。
  接下来,在浏览器中打开一个页面并将其共享给 Demo。这里有问题。我们不知道Intent中截图数据对应的key,怎么办?停下来!
  
  通过断点查看Intent的数据结构,发现Intent中的mMap成员变量收录一个Uri,格式如下:content://com.android.chrome.FileProvider/BlockedFile_332。乍一看,我猜这个Uri是Chrome通过ContentProvider为其他程序提供的虽然和.jpg和.png末尾的数据不一致,但和一开始调用的数据不一致,但不知怎么的发现。
  那么现在还有一个问题,就是mMap.value[3]对应的key值是什么?在上面的断点界面,你根本看不到,但是Android Studio很强大,你却没有发现。由于mMap是一个Map,所以可以长时间通过keySet()方法获取到Map的key。接下来是 Android Studio 大展拳脚的时候了。
  
  如上图,在Debug界面,点击最后一个图标:Evaluate Expression(快捷键:option + f8)。在弹出的对话框中输入如下,回车,你会发现Map的key全部out了:
  
  通过和第一张图对比,发现下标3(share_screenshot_as_stream)的值就是我们需要的key。
  布局比较简单,这里就不贴了,简单截取BrowserSrceenShotActivity.java中的代码:
  
@Override
protected void onResume() {
super.onResume();
if (getIntent() == null) {
return;
}

Uri screenShot = getIntent().getExtras().getParcelable("screen_shot_as_stream");
if (screenShot == null) {
ToastUtil.showDefaultToast("获取浏览器截屏失败~");
return;
}
try {
//授权Uri的读取权限
//若不授权,在 Android 6.0 以上测试崩溃
//https://thinkandroid.wordpress ... ions/
//第一个参数为需要授权的apk包名
grantUriPermission("com.littlejie.demo", screenShot, Intent.FLAG_GRANT_READ_URI_PERMISSION);
//通过 Uri 获取截屏图片的输入流
InputStream is = getContentResolver().openInputStream(screenShot);
mIvScreenShot.setImageBitmap(BitmapFactory.decodeStream(is));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
  运行结果如下:
  
  Chrome浏览器分享页面截图到此结束。闲来无事,测试了几个浏览器,包括内置浏览器,QQ浏览器,UC浏览器,百度浏览器,火狐浏览器。浏览器差别很大。
  嗯,仅此而已。主要是浏览器支持获取浏览器分享页面截图。适配市面上那么多浏览器,真的很麻烦。这次主要是学习了Android Studio强大的Debug功能。PS:Android Studio 真的是一个非常强大的工具。用好它,事半功倍。唯一的缺点是它消耗了太多的性能。
  演示代码入口:DemoApplication_jb51.rar
  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持面圈教程。 查看全部

  浏览器抓取网页(获取Chrome浏览器分享时的页面的截屏,运行结果)
  今天在项目中遇到这样一个需求:在Chrome浏览器分享时获取页面截图。坐下想一想,既然是共享,就必须通过Intent来传递数据。如果真的能拿到Chrome分享页面的截图,那么Intent的数据中肯定有.jpg或.png结尾的数据。直接做,写Demo。
  首先,创建一个新的 BrowserScreenShotActivity.java 并在 AndroidManifest.xml 中注册它。
  接下来,在浏览器中打开一个页面并将其共享给 Demo。这里有问题。我们不知道Intent中截图数据对应的key,怎么办?停下来!
  
  通过断点查看Intent的数据结构,发现Intent中的mMap成员变量收录一个Uri,格式如下:content://com.android.chrome.FileProvider/BlockedFile_332。乍一看,我猜这个Uri是Chrome通过ContentProvider为其他程序提供的虽然和.jpg和.png末尾的数据不一致,但和一开始调用的数据不一致,但不知怎么的发现。
  那么现在还有一个问题,就是mMap.value[3]对应的key值是什么?在上面的断点界面,你根本看不到,但是Android Studio很强大,你却没有发现。由于mMap是一个Map,所以可以长时间通过keySet()方法获取到Map的key。接下来是 Android Studio 大展拳脚的时候了。
  
  如上图,在Debug界面,点击最后一个图标:Evaluate Expression(快捷键:option + f8)。在弹出的对话框中输入如下,回车,你会发现Map的key全部out了:
  
  通过和第一张图对比,发现下标3(share_screenshot_as_stream)的值就是我们需要的key。
  布局比较简单,这里就不贴了,简单截取BrowserSrceenShotActivity.java中的代码:
  
@Override
protected void onResume() {
super.onResume();
if (getIntent() == null) {
return;
}

Uri screenShot = getIntent().getExtras().getParcelable("screen_shot_as_stream");
if (screenShot == null) {
ToastUtil.showDefaultToast("获取浏览器截屏失败~");
return;
}
try {
//授权Uri的读取权限
//若不授权,在 Android 6.0 以上测试崩溃
//https://thinkandroid.wordpress ... ions/
//第一个参数为需要授权的apk包名
grantUriPermission("com.littlejie.demo", screenShot, Intent.FLAG_GRANT_READ_URI_PERMISSION);
//通过 Uri 获取截屏图片的输入流
InputStream is = getContentResolver().openInputStream(screenShot);
mIvScreenShot.setImageBitmap(BitmapFactory.decodeStream(is));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
  运行结果如下:
  
  Chrome浏览器分享页面截图到此结束。闲来无事,测试了几个浏览器,包括内置浏览器,QQ浏览器,UC浏览器,百度浏览器,火狐浏览器。浏览器差别很大。
  嗯,仅此而已。主要是浏览器支持获取浏览器分享页面截图。适配市面上那么多浏览器,真的很麻烦。这次主要是学习了Android Studio强大的Debug功能。PS:Android Studio 真的是一个非常强大的工具。用好它,事半功倍。唯一的缺点是它消耗了太多的性能。
  演示代码入口:DemoApplication_jb51.rar
  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持面圈教程。

浏览器抓取网页(获取高度和宽度都各有3种,如何解决各种计算定位问题 )

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

  浏览器抓取网页(获取高度和宽度都各有3种,如何解决各种计算定位问题
)
  目的
  在浏览器中,JS获取的高度和宽度有3种,分别是屏幕、浏览器和网页。用于解决各种计算定位问题!以至于各种事情都记不起来了,所以我可以写一篇文章,方便查询。
  屏幕宽度
  注:顾名思义,屏幕宽度和高度是指显示器的分辨率。系统分辨率可以更改此宽度和高度。
  获取方法:
  console.log(\'宽度:\', window.screen.width)
console.log(\'高度:\', window.screen.height)
  浏览器可用工作区的宽度和高度
  注意:浏览器的宽度和高度是指浏览器窗口最大化时的宽度和高度。正常最大化后,一般去掉系统任务栏的高度,宽度和屏幕宽度一致。当任务栏占用的空间发生变化时,宽度和高度也会发生变化。
  获取方法:
  console.log(\'宽度:\', window.screen.availWidth)
console.log(\'高度:\', window.screen.availHeight)
  页面宽度和高度
  注意:网页的宽度和高度是指页面所占的宽度和高度。页面内容以外的浏览器部分不计算在内。标签栏、地址栏、书签栏、控制台等不计入宽高范围,只计入网页内容区域。
  获取方法:
  console.log(\'宽度:\', window.innerWidth)
console.log(\'高度:\', window.innerHeight)
  其他(获取浏览器和屏幕的各种高度和宽度)
  js原生方法:
  document.body.clientWidth; //网页可见区域宽(body)
document.body.clientHeight; //网页可见区域高(body)
document.body.offsetWidth; //网页可见区域宽(body),包括border、margin等
document.body.offsetHeight; //网页可见区域宽(body),包括border、margin等
document.body.scrollWidth; //网页正文全文宽,包括有滚动条时的未见区域
document.body.scrollHeight; //网页正文全文高,包括有滚动条时的未见区域
document.body.scrollTop; //网页被卷去的Top(滚动条)
document.body.scrollLeft; //网页被卷去的Left(滚动条)
window.screenTop; //浏览器距离Top
window.screenLeft; //浏览器距离Left
  jQuery方法:
  $(window).height(); //浏览器当前窗口可视区域高度
$(document).height(); //浏览器当前窗口文档的高度
$(document.body).height(); //浏览器当前窗口文档body的高度
$(document.body).outerHeight(true); //浏览器当前窗口文档body的总高度 包括border padding margin
$(window).width(); //浏览器当前窗口可视区域宽度
$(document).width(); //浏览器当前窗口文档对象宽度
$(document.body).width(); //浏览器当前窗口文档body的宽度
$(document.body).outerWidth(true); //浏览器当前窗口文档body的总宽度 包括border padding margin 查看全部

  浏览器抓取网页(获取高度和宽度都各有3种,如何解决各种计算定位问题
)
  目的
  在浏览器中,JS获取的高度和宽度有3种,分别是屏幕、浏览器和网页。用于解决各种计算定位问题!以至于各种事情都记不起来了,所以我可以写一篇文章,方便查询。
  屏幕宽度
  注:顾名思义,屏幕宽度和高度是指显示器的分辨率。系统分辨率可以更改此宽度和高度。
  获取方法:
  console.log(\'宽度:\', window.screen.width)
console.log(\'高度:\', window.screen.height)
  浏览器可用工作区的宽度和高度
  注意:浏览器的宽度和高度是指浏览器窗口最大化时的宽度和高度。正常最大化后,一般去掉系统任务栏的高度,宽度和屏幕宽度一致。当任务栏占用的空间发生变化时,宽度和高度也会发生变化。
  获取方法:
  console.log(\'宽度:\', window.screen.availWidth)
console.log(\'高度:\', window.screen.availHeight)
  页面宽度和高度
  注意:网页的宽度和高度是指页面所占的宽度和高度。页面内容以外的浏览器部分不计算在内。标签栏、地址栏、书签栏、控制台等不计入宽高范围,只计入网页内容区域。
  获取方法:
  console.log(\'宽度:\', window.innerWidth)
console.log(\'高度:\', window.innerHeight)
  其他(获取浏览器和屏幕的各种高度和宽度)
  js原生方法:
  document.body.clientWidth; //网页可见区域宽(body)
document.body.clientHeight; //网页可见区域高(body)
document.body.offsetWidth; //网页可见区域宽(body),包括border、margin等
document.body.offsetHeight; //网页可见区域宽(body),包括border、margin等
document.body.scrollWidth; //网页正文全文宽,包括有滚动条时的未见区域
document.body.scrollHeight; //网页正文全文高,包括有滚动条时的未见区域
document.body.scrollTop; //网页被卷去的Top(滚动条)
document.body.scrollLeft; //网页被卷去的Left(滚动条)
window.screenTop; //浏览器距离Top
window.screenLeft; //浏览器距离Left
  jQuery方法:
  $(window).height(); //浏览器当前窗口可视区域高度
$(document).height(); //浏览器当前窗口文档的高度
$(document.body).height(); //浏览器当前窗口文档body的高度
$(document.body).outerHeight(true); //浏览器当前窗口文档body的总高度 包括border padding margin
$(window).width(); //浏览器当前窗口可视区域宽度
$(document).width(); //浏览器当前窗口文档对象宽度
$(document.body).width(); //浏览器当前窗口文档body的宽度
$(document.body).outerWidth(true); //浏览器当前窗口文档body的总宽度 包括border padding margin

浏览器抓取网页(两个对象的scrollHeight和scrollWidth属性就是网页的另一种方法)

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-12-09 18:00 • 来自相关话题

  浏览器抓取网页(两个对象的scrollHeight和scrollWidth属性就是网页的另一种方法)
  来自阮一峰的网络日志""
  一、两个概念
  网页大小:网页的整个区域就是它的大小。通常,网页的大小由内容和 CSS 样式表决定。
  浏览器窗口大小:浏览器窗口的大小是指在浏览器窗口中看到的网页的面积,也称为视口。
  显然,如果网页的内容可以在浏览器窗口中显示出来(即不出现滚动条),那么网页的大小和浏览器窗口的大小是相等的。
  如果无法全部显示,请滚动浏览器窗口以显示网页的所有部分。
  二、获取页面大小
  网页上的每个元素都有 clientHeight 和 clientWidth 属性。这两个属性是指元素的内容部分加上padding所占用的可视区域,不包括边框和滚动条所占用的空间。
  函数 getViewport(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.clientWidth,
  高度:document.body.clientHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.clientWidth,
  高度:document.documentElement.clientHeight
  }
  }
  }
  上面的getViewport函数可以返回浏览器窗口的高度和宽度。使用时,有三个地方需要注意:
  1)这个函数必须在页面加载完成后运行,否则文档对象还没有生成,浏览器会报错。
  2) 在大多数情况下,document.documentElement.clientWidth 返回正确的值。但是在IE6的quirks模式下,document.body.clientWidth返回的是正确的值,
  因此,功能中增加了文档模式的判断。
  3)clientWidth 和 clientHeight 都是只读属性,不能赋值。
  三、另一种获取页面大小的方法
  网页上的每个元素也有scrollHeight和scrollWidth属性,指的是包括滚动条在内的元素的可视区域。
  那么,文档对象的scrollHeight和scrollWidth属性就是网页的大小,即滚动条的所有长度和宽度。
  以 getViewport() 函数为模型,您可以编写 getPagearea() 函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.scrollWidth,
  高度:document.body.scrollHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.scrollWidth,
  高度:document.documentElement.scrollHeight
  }
  }
  }
  但是,这个功能有问题。如果网页的内容可以在没有滚动条的浏览器窗口中显示,那么网页的clientWidth和scrollWidth应该是相等的。
  但实际上,不同浏览器的处理方式不同,这两个值可能并不相等。因此,我们需要取其中较大的值,因此需要重写getPagearea()函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:Math.max(document.body.scrollWidth,
  document.body.clientWidth),
  高度:Math.max(document.body.scrollHeight,
  文档.body.clientHeight)
  }
  } 别的 {
  返回 {
  宽度:Math.max(document.documentElement.scrollWidth,
  document.documentElement.clientWidth),
  高度:Math.max(document.documentElement.scrollHeight,
  document.documentElement.clientHeight)
  }
  }
  }
  四、获取网页元素的绝对位置
  网页元素的绝对位置是指元素左上角相对于整个网页左上角的坐标。这个绝对位置只能通过计算得到。
  首先,每个元素都有offsetTop和offsetLeft属性,表示元素左上角到父容器(offsetParent对象)左上角的距离。
  因此,只需要将这两个值累加就可以得到元素的绝对坐标。
  可以使用以下两个函数来获取绝对位置的横坐标和纵坐标。
  函数getElementLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  返回实际左;
  }
  函数 getElementTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  返回实际顶部;
  }
  由于在tables和iframes中,offsetParent对象可能不等于父容器,所以上述函数不适用于tables和iframes中的元素。
  五、获取网页元素的相对位置
  网页元素的相对位置是指元素左上角相对于浏览器窗口左上角的坐标。
  有了绝对位置,就很容易得到相对位置,只需用页面滚动条的滚动距离减去绝对坐标即可。
  滚动条的垂直距离是文档对象的scrollTop属性;滚动条的水平距离是文档对象的 scrollLeft 属性。
  相应地重写上一节中的两个函数:
  函数 getElementViewLeft(element){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollLeft=document.body.scrollLeft;
  } 别的 {
  var elementScrollLeft=document.documentElement.scrollLeft;
  }
  返回actualLeft-elementScrollLeft;
  }
  函数 getElementViewTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  实际顶部 += 当前。偏移顶部;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollTop=document.body.scrollTop;
  } 别的 {
  var elementScrollTop=document.documentElement.scrollTop;
  }
  返回actualTop-elementScrollTop;
  }
  scrollTop 和 scrollLeft 属性可以赋值,它们会立即自动将网页滚动到相应的位置,因此您可以使用它们来改变网页元素的相对位置。
  另外 element.scrollIntoView() 方法也有类似的效果,可以让网页元素出现在浏览器窗口的左上角。
  六、快速获取元素位置的方法
  除了上述功能外,还有一种快速获取网页元素位置的方法。
  即使用 getBoundingClientRect() 方法。它返回一个收录四个属性的对象:left、right、top和bottom,分别对应元素左上角和右下角相对于浏览器窗口(视口)左上角的距离。
  所以,网页元素的相对位置是
  var X = this.getBoundingClientRect().left;
  var Y =this.getBoundingClientRect().top;
  加上滚动距离,可以得到绝对位置
  var X = this.getBoundingClientRect().left+document.documentElement.scrollLeft;
  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
  目前IE、Firefox 3.0+、Opera 9.5+都支持这种方式,但Firefox 2.x、Safari、Chrome、Konqueror不支持。 查看全部

  浏览器抓取网页(两个对象的scrollHeight和scrollWidth属性就是网页的另一种方法)
  来自阮一峰的网络日志""
  一、两个概念
  网页大小:网页的整个区域就是它的大小。通常,网页的大小由内容和 CSS 样式表决定。
  浏览器窗口大小:浏览器窗口的大小是指在浏览器窗口中看到的网页的面积,也称为视口。
  显然,如果网页的内容可以在浏览器窗口中显示出来(即不出现滚动条),那么网页的大小和浏览器窗口的大小是相等的。
  如果无法全部显示,请滚动浏览器窗口以显示网页的所有部分。
  二、获取页面大小
  网页上的每个元素都有 clientHeight 和 clientWidth 属性。这两个属性是指元素的内容部分加上padding所占用的可视区域,不包括边框和滚动条所占用的空间。
  函数 getViewport(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.clientWidth,
  高度:document.body.clientHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.clientWidth,
  高度:document.documentElement.clientHeight
  }
  }
  }
  上面的getViewport函数可以返回浏览器窗口的高度和宽度。使用时,有三个地方需要注意:
  1)这个函数必须在页面加载完成后运行,否则文档对象还没有生成,浏览器会报错。
  2) 在大多数情况下,document.documentElement.clientWidth 返回正确的值。但是在IE6的quirks模式下,document.body.clientWidth返回的是正确的值,
  因此,功能中增加了文档模式的判断。
  3)clientWidth 和 clientHeight 都是只读属性,不能赋值。
  三、另一种获取页面大小的方法
  网页上的每个元素也有scrollHeight和scrollWidth属性,指的是包括滚动条在内的元素的可视区域。
  那么,文档对象的scrollHeight和scrollWidth属性就是网页的大小,即滚动条的所有长度和宽度。
  以 getViewport() 函数为模型,您可以编写 getPagearea() 函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.scrollWidth,
  高度:document.body.scrollHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.scrollWidth,
  高度:document.documentElement.scrollHeight
  }
  }
  }
  但是,这个功能有问题。如果网页的内容可以在没有滚动条的浏览器窗口中显示,那么网页的clientWidth和scrollWidth应该是相等的。
  但实际上,不同浏览器的处理方式不同,这两个值可能并不相等。因此,我们需要取其中较大的值,因此需要重写getPagearea()函数。
  函数 getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:Math.max(document.body.scrollWidth,
  document.body.clientWidth),
  高度:Math.max(document.body.scrollHeight,
  文档.body.clientHeight)
  }
  } 别的 {
  返回 {
  宽度:Math.max(document.documentElement.scrollWidth,
  document.documentElement.clientWidth),
  高度:Math.max(document.documentElement.scrollHeight,
  document.documentElement.clientHeight)
  }
  }
  }
  四、获取网页元素的绝对位置
  网页元素的绝对位置是指元素左上角相对于整个网页左上角的坐标。这个绝对位置只能通过计算得到。
  首先,每个元素都有offsetTop和offsetLeft属性,表示元素左上角到父容器(offsetParent对象)左上角的距离。
  因此,只需要将这两个值累加就可以得到元素的绝对坐标。
  可以使用以下两个函数来获取绝对位置的横坐标和纵坐标。
  函数getElementLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  返回实际左;
  }
  函数 getElementTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  返回实际顶部;
  }
  由于在tables和iframes中,offsetParent对象可能不等于父容器,所以上述函数不适用于tables和iframes中的元素。
  五、获取网页元素的相对位置
  网页元素的相对位置是指元素左上角相对于浏览器窗口左上角的坐标。
  有了绝对位置,就很容易得到相对位置,只需用页面滚动条的滚动距离减去绝对坐标即可。
  滚动条的垂直距离是文档对象的scrollTop属性;滚动条的水平距离是文档对象的 scrollLeft 属性。
  相应地重写上一节中的两个函数:
  函数 getElementViewLeft(element){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== 空){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollLeft=document.body.scrollLeft;
  } 别的 {
  var elementScrollLeft=document.documentElement.scrollLeft;
  }
  返回actualLeft-elementScrollLeft;
  }
  函数 getElementViewTop(element){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== 空){
  实际顶部 += 当前。偏移顶部;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollTop=document.body.scrollTop;
  } 别的 {
  var elementScrollTop=document.documentElement.scrollTop;
  }
  返回actualTop-elementScrollTop;
  }
  scrollTop 和 scrollLeft 属性可以赋值,它们会立即自动将网页滚动到相应的位置,因此您可以使用它们来改变网页元素的相对位置。
  另外 element.scrollIntoView() 方法也有类似的效果,可以让网页元素出现在浏览器窗口的左上角。
  六、快速获取元素位置的方法
  除了上述功能外,还有一种快速获取网页元素位置的方法。
  即使用 getBoundingClientRect() 方法。它返回一个收录四个属性的对象:left、right、top和bottom,分别对应元素左上角和右下角相对于浏览器窗口(视口)左上角的距离。
  所以,网页元素的相对位置是
  var X = this.getBoundingClientRect().left;
  var Y =this.getBoundingClientRect().top;
  加上滚动距离,可以得到绝对位置
  var X = this.getBoundingClientRect().left+document.documentElement.scrollLeft;
  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
  目前IE、Firefox 3.0+、Opera 9.5+都支持这种方式,但Firefox 2.x、Safari、Chrome、Konqueror不支持。

浏览器抓取网页(titleprint(2)#获取当前页面的title属性值错误)

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-12-07 05:41 • 来自相关话题

  浏览器抓取网页(titleprint(2)#获取当前页面的title属性值错误)
  本博客中学习的API如下:
  当前URL获取当前页面的URL
  page_uuSource获取当前页面的源代码
  标题获取当前页面的标题
  按顺序练习上述方法。效果如GIF所示:
  从selenium导入webdriver
  从时间上导入睡眠
  睡眠(2)
  driver=webdriver.Chrome()
  驱动程序。获取(“”)
  #移动浏览器查看显示
  驱动程序。设置窗口大小(宽度=500,高度=500,windowHandle=“当前”)
  驱动程序。设置窗口位置(x=1000,y=100,windowHandle='current')
  睡眠(2)
  #获取当前页面的标题并断言
  title=driver.title
  打印(“当前页面的标题为:”,标题“\n”)
  断言title==u“百度,你会知道”,“页面标题属性值错误!”
  睡眠(2)
  #获取当前页面的源代码并断言
  pageSource=driver.page\u源
  尝试:
  在pagesource中断言U“百度一次,你不知道”,在页面源代码中找不到“百度一次,你知道”关键字
  除:
  打印(“此处的源代码故意声明错误”,“\n”)
  睡眠(2)
  #获取当前页面的URL并断言
  currentPageUrl=驱动程序。当前\u url
  打印(“当前页面的URL为:”,currentpageurl)
  断言currentpageurl==“”,当前网址是意外的
  睡眠(2)
  driver.quit()
  以上是本文的全部内容,希望对您的学习有所帮助,也希望您能予以支持 查看全部

  浏览器抓取网页(titleprint(2)#获取当前页面的title属性值错误)
  本博客中学习的API如下:
  当前URL获取当前页面的URL
  page_uuSource获取当前页面的源代码
  标题获取当前页面的标题
  按顺序练习上述方法。效果如GIF所示:
  从selenium导入webdriver
  从时间上导入睡眠
  睡眠(2)
  driver=webdriver.Chrome()
  驱动程序。获取(“”)
  #移动浏览器查看显示
  驱动程序。设置窗口大小(宽度=500,高度=500,windowHandle=“当前”)
  驱动程序。设置窗口位置(x=1000,y=100,windowHandle='current')
  睡眠(2)
  #获取当前页面的标题并断言
  title=driver.title
  打印(“当前页面的标题为:”,标题“\n”)
  断言title==u“百度,你会知道”,“页面标题属性值错误!”
  睡眠(2)
  #获取当前页面的源代码并断言
  pageSource=driver.page\u源
  尝试:
  在pagesource中断言U“百度一次,你不知道”,在页面源代码中找不到“百度一次,你知道”关键字
  除:
  打印(“此处的源代码故意声明错误”,“\n”)
  睡眠(2)
  #获取当前页面的URL并断言
  currentPageUrl=驱动程序。当前\u url
  打印(“当前页面的URL为:”,currentpageurl)
  断言currentpageurl==“”,当前网址是意外的
  睡眠(2)
  driver.quit()
  以上是本文的全部内容,希望对您的学习有所帮助,也希望您能予以支持

浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)

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

  浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
  urllib.error.HTTPError:HTTP 错误 403:禁止
  从403 Forbidden我们可以发现,此时网站是禁止程序访问的。这是因为csdn网站 设置了反爬虫机制。当网站检测到爬虫时,访问会被拒绝,所以我们会得到上面的结果。
  这时候就需要模拟浏览器访问,以避免网站的反爬虫机制,然后顺利抓取到我们想要的内容。
  接下来,我们将使用魔法库 urllib.request.Request 进行我们的模拟工作。这次我们也会先上传代码,然后再解释,不过这次要提醒大家的是,下面的代码不能直接使用。my_headers 中的 User-Agent 替换为我自己的。因为为了保密我加了省略号,不能直接使用。更换方法如下图所示。这次为了使用方便,我们引入一个函数:
  #coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/")
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  使用上面的代码,我们就可以正常的抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
  由于我们要模拟一个浏览器进行网页访问,这些参数自然需要我们在浏览器中搜索。
  首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下图框,然后我们点击Network,然后我们会发现没有我们页面的信息都打开了,没关系,这时候我们刷新页面的时候,就会出现下图所示的信息。
  
  这时候我们会在第一行看到51251757,就是我们网页网址后面的标签。这时候我们点击这个标签,就会出现下图所示的内容:
  
  下面是我直接访问这个网址时得到的截图:
  
  前两张图,之前写过版本2的访问,现在直接用了。当时我在csdn主页上点了这个博客,所以在代码中的header里填了referer和前两张图。是的
  ,而且这张图是我直接通过URL链接进入浏览器访问的,所以从图中可以看出referer是,这是我们的网站,贴在这里是为了让大家更好的了解这个referer。不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候一定不要用我给的User-Agent,因为我用省略号代替了一些。每个人都需要用自己的方式来弥补。
  这时候我们就会发现Headers,是不是有一种豁然开朗的感觉?是的,你的直觉是对的,我们需要的信息在这个标题中。
  然后,根据代码中需要的参数,把信息复制回来就可以使用了,因为这里显示的信息正好对应了key值,所以我们复制使用起来非常方便。
  下面介绍一下这个urllib.request.Request的用法(从官方文档翻译过来的):
  classurllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
  范围:
  url:不用说,这是我们即将访问的URL。它是一个字符串。
  data:数据必须是一个字节对象,它指定要发送到服务器的附加数据,如果不需要,则为 None。目前,只有 HTTP 请求使用数据;当提供数据参数时,http 请求应该是 post 而不是 get。数据应以标准 application/x-www-form-urlencoded 格式进行缓冲。urllib.parse.urlencode() 函数的参数是一个映射或二进制序列,并以这种格式返回一个 ASCII 字符串。当它用作数据参数时,它应该被编码为字节。(我们暂时不需要这个,就别管了)
  标题:标题是字典数据。当使用键和值参数调用 add_header() 时,此标头将作为请求进行处理。此标头通常用于防止爬虫访问服务器。头部是浏览器用来标识自己的,因为有些HTTP服务器只允许来自普通浏览器的请求而不是脚本(可以理解为爬虫)。例如,Mozilla Firefox 浏览器可以将自身识别为“Mozilla / 5 (X11; U; Linux i686)Gecko/2008070208火狐20071127 / 2.0.0.11”,模块默认的用户代理字符串为“python urllib / 2.6”(Python 2.6),即访问网页时,用于反爬虫机制网站 可以通过用户代理字符串“查看我们是爬虫” 在此,必须综合考虑网站的反爬虫机制有多严格,因为你对爬虫的监控越严格,你需要检查的东西就越多,这必然会增加处理负担网站服务器,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。在此,必须综合考虑网站的反爬虫机制有多严格,因为你对爬虫的监控越严格,你需要检查的东西就越多,这必然会增加处理负担网站服务器,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。必须在爬虫检测和 网站 服务器的计算负担之间做出权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。必须在爬虫检测和 网站 服务器的计算负担之间做出权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。
  origin_req_host: origin_req_host 应该是发起原创事务请求的主机,RFC 2965 定义了它。它默认为 http.cookiejar.request_host(self)。这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是对收录图像的页面的请求的主机。(我们一般不使用这个,知道这里就知道了)
  unverifiable:unverifiable 表示请求是否不可验证,由 RFC 2965 定义,默认值为 false。无法验证的请求意味着无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器上取回图片时,此时unverifiable值应该为true。
  method:method 应该是一个字符串,指示将使用 HTTP 请求方法(例如,“header”)。如果提供,则其值存储在方法属性中并由方法 get_method() 调用。子类可以通过在类中设置方法属性来指示默认方法。(这个基本不用)
  说了这么多无聊的定义,我自己也受不了翻译了。
  让我们继续回到我们的程序:
  对于我们的程序,我们只需要掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。req.add_header("User-Agent", random_header) 告诉网络服务器我是通过浏览器访问它,我不是爬虫。req.add_header("GET",url) 告诉浏览器我们正在访问的URL,req.add_header("Host","") 这是网站的信息,我们取自网站@ &gt; 填写即可。这句话req.add_header("Referer","") 很重要。它告诉 网站 服务器我们在哪里找到了我们想要访问的网页。比如你点击了百度 如果一个链接跳转到了当前访问的页面,
  对于 header 构造方法也可以这样做:
  #coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/")
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  从上面的程序中可以看出,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent是硬编码的。其实我们可以发现,对于不同的主机访问同一个网页时,我们的另外三个信息:GET、Host、Referer可能都是一样的,而此时仅以User-Agent作为判断标准用户的异同,那么问题来了,如果我们向同学“借”一些User-Agents来使用,是不是模拟多个用户访问?是不是更酷。其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agents,然后通过random函数随机选择一个组合起来创建一个用户。多人访问的错觉其实很有用。要知道,对于网站来说,访问过多会阻塞用户的ip。这不好玩,所以想要永久访问一个网站而不被屏蔽,还是需要很多技巧的。
  当我们要爬取一个网站的多个网页时,很容易被网站检测到,由于主机频繁访问,进而被拦截。而如果我们在列表中放更多不同的主机号并随机使用它们,是不是很容易被发现?当然,当我们防止这种情况时,更好的方法是使用IP代理,因为我们不容易获得很多主机信息,而IP代理很容易从互联网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。 查看全部

  浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
  urllib.error.HTTPError:HTTP 错误 403:禁止
  从403 Forbidden我们可以发现,此时网站是禁止程序访问的。这是因为csdn网站 设置了反爬虫机制。当网站检测到爬虫时,访问会被拒绝,所以我们会得到上面的结果。
  这时候就需要模拟浏览器访问,以避免网站的反爬虫机制,然后顺利抓取到我们想要的内容。
  接下来,我们将使用魔法库 urllib.request.Request 进行我们的模拟工作。这次我们也会先上传代码,然后再解释,不过这次要提醒大家的是,下面的代码不能直接使用。my_headers 中的 User-Agent 替换为我自己的。因为为了保密我加了省略号,不能直接使用。更换方法如下图所示。这次为了使用方便,我们引入一个函数:
  #coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/";)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  使用上面的代码,我们就可以正常的抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
  由于我们要模拟一个浏览器进行网页访问,这些参数自然需要我们在浏览器中搜索。
  首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下图框,然后我们点击Network,然后我们会发现没有我们页面的信息都打开了,没关系,这时候我们刷新页面的时候,就会出现下图所示的信息。
  
  这时候我们会在第一行看到51251757,就是我们网页网址后面的标签。这时候我们点击这个标签,就会出现下图所示的内容:
  
  下面是我直接访问这个网址时得到的截图:
  
  前两张图,之前写过版本2的访问,现在直接用了。当时我在csdn主页上点了这个博客,所以在代码中的header里填了referer和前两张图。是的
  ,而且这张图是我直接通过URL链接进入浏览器访问的,所以从图中可以看出referer是,这是我们的网站,贴在这里是为了让大家更好的了解这个referer。不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候一定不要用我给的User-Agent,因为我用省略号代替了一些。每个人都需要用自己的方式来弥补。
  这时候我们就会发现Headers,是不是有一种豁然开朗的感觉?是的,你的直觉是对的,我们需要的信息在这个标题中。
  然后,根据代码中需要的参数,把信息复制回来就可以使用了,因为这里显示的信息正好对应了key值,所以我们复制使用起来非常方便。
  下面介绍一下这个urllib.request.Request的用法(从官方文档翻译过来的):
  classurllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
  范围:
  url:不用说,这是我们即将访问的URL。它是一个字符串。
  data:数据必须是一个字节对象,它指定要发送到服务器的附加数据,如果不需要,则为 None。目前,只有 HTTP 请求使用数据;当提供数据参数时,http 请求应该是 post 而不是 get。数据应以标准 application/x-www-form-urlencoded 格式进行缓冲。urllib.parse.urlencode() 函数的参数是一个映射或二进制序列,并以这种格式返回一个 ASCII 字符串。当它用作数据参数时,它应该被编码为字节。(我们暂时不需要这个,就别管了)
  标题:标题是字典数据。当使用键和值参数调用 add_header() 时,此标头将作为请求进行处理。此标头通常用于防止爬虫访问服务器。头部是浏览器用来标识自己的,因为有些HTTP服务器只允许来自普通浏览器的请求而不是脚本(可以理解为爬虫)。例如,Mozilla Firefox 浏览器可以将自身识别为“Mozilla / 5 (X11; U; Linux i686)Gecko/2008070208火狐20071127 / 2.0.0.11”,模块默认的用户代理字符串为“python urllib / 2.6”(Python 2.6),即访问网页时,用于反爬虫机制网站 可以通过用户代理字符串“查看我们是爬虫” 在此,必须综合考虑网站的反爬虫机制有多严格,因为你对爬虫的监控越严格,你需要检查的东西就越多,这必然会增加处理负担网站服务器,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。在此,必须综合考虑网站的反爬虫机制有多严格,因为你对爬虫的监控越严格,你需要检查的东西就越多,这必然会增加处理负担网站服务器,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。必须在爬虫检测和 网站 服务器的计算负担之间做出权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。必须在爬虫检测和 网站 服务器的计算负担之间做出权衡。所以,并不是说爬虫检测机制越严格越好,反而是服务器的负担。
  origin_req_host: origin_req_host 应该是发起原创事务请求的主机,RFC 2965 定义了它。它默认为 http.cookiejar.request_host(self)。这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是对收录图像的页面的请求的主机。(我们一般不使用这个,知道这里就知道了)
  unverifiable:unverifiable 表示请求是否不可验证,由 RFC 2965 定义,默认值为 false。无法验证的请求意味着无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器上取回图片时,此时unverifiable值应该为true。
  method:method 应该是一个字符串,指示将使用 HTTP 请求方法(例如,“header”)。如果提供,则其值存储在方法属性中并由方法 get_method() 调用。子类可以通过在类中设置方法属性来指示默认方法。(这个基本不用)
  说了这么多无聊的定义,我自己也受不了翻译了。
  让我们继续回到我们的程序:
  对于我们的程序,我们只需要掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。req.add_header("User-Agent", random_header) 告诉网络服务器我是通过浏览器访问它,我不是爬虫。req.add_header("GET",url) 告诉浏览器我们正在访问的URL,req.add_header("Host","") 这是网站的信息,我们取自网站@ &gt; 填写即可。这句话req.add_header("Referer","") 很重要。它告诉 网站 服务器我们在哪里找到了我们想要访问的网页。比如你点击了百度 如果一个链接跳转到了当前访问的页面,
  对于 header 构造方法也可以这样做:
  #coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/";)
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  从上面的程序中可以看出,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent是硬编码的。其实我们可以发现,对于不同的主机访问同一个网页时,我们的另外三个信息:GET、Host、Referer可能都是一样的,而此时仅以User-Agent作为判断标准用户的异同,那么问题来了,如果我们向同学“借”一些User-Agents来使用,是不是模拟多个用户访问?是不是更酷。其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agents,然后通过random函数随机选择一个组合起来创建一个用户。多人访问的错觉其实很有用。要知道,对于网站来说,访问过多会阻塞用户的ip。这不好玩,所以想要永久访问一个网站而不被屏蔽,还是需要很多技巧的。
  当我们要爬取一个网站的多个网页时,很容易被网站检测到,由于主机频繁访问,进而被拦截。而如果我们在列表中放更多不同的主机号并随机使用它们,是不是很容易被发现?当然,当我们防止这种情况时,更好的方法是使用IP代理,因为我们不容易获得很多主机信息,而IP代理很容易从互联网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。

浏览器抓取网页(优采云云采集服务平台如何高效的抓取网页数据(组图))

网站优化优采云 发表了文章 • 0 个评论 • 94 次浏览 • 2021-12-04 05:00 • 来自相关话题

  浏览器抓取网页(优采云云采集服务平台如何高效的抓取网页数据(组图))
  优采云Cloud采集如何在服务平台上使用网络爬虫工具作为一个不会编码的技术新手,如何高效的爬取网络数据?有没有好用的数据抓取工具,可以帮助小白实现需要的数据采集功能?答案是肯定的。使用一个好的数据抓取工具,可以让我们使用优采云浏览器,通过模仿人们浏览网页的操作来完成数据的抓取。整个过程完全可视化,上手相对容易。它可以抓取 99% 的网页。还具有自动登录、验证码识别、IP代理、云端采集等功能应对网站采集的防范措施。下面是一个完整的使用优采云获取网页数据的例子。以京东为例。以 com 为例。采集网站:,3258,3304&amp;page=1&amp;sort=sort_totalsales15_desc&amp;trans=1&amp;JL=4_2_0#J_main 第一步:创建采集任务1)进入主界面选择,选择自定义模式优采云云采集 服务平台如何高效抓取网页数据,以京东商品信息采集为例 图1 2)复制粘贴网址以上 URL 到 网站输入框并点击“保存 URL”。优采云Cloud采集 服务平台如何高效抓取网页数据?以京东产品信息采集为例。图2 3) 保存URL后,页面会在优采云采集器中打开。红框内的书籍数据为本次演示的信息。采集例如图3 第二步:创建翻页循环,找到翻页按钮,设置翻页循环1)
  2) 移动鼠标选中红框中任意一个文本框后,列表中所有适配的内容都会变成绿色。在右侧的操作提示框中勾选提取的字段,可以删除不需要的字段。然后点击“全选”优采云云采集服务平台如何高效抓取网页数据,以京东产品信息采集为例。图6 注意:将鼠标放在该字段上,会出现一个删除标志,点击删除该字段。如何高效抓取网页数据,以京东产品信息采集为例 图7 优采云云采集服务平台3)点击“采集以下数据”如何高效抓取网页数据,获取京东商品信息采集 以图8 4)修改采集字段名优采云cloud采集如何高效抓取服务平台获取网页数据,以京东商品信息采集为一个例子。图9 5)点击下方红框中的“保存启动采集” 如何高效抓取网页数据并使用京东产品信息采集为例 图10 优采云云采集服务平台6)根据采集的情况选择合适的采集方式,这里选择“Start” Local 采集" 如何高效抓取网页数据,以京东产品信息采集为例 图11 说明:本地采集为采集占用当前计算机资源,如果存在&lt;
  第四步:数据采集并导出1)采集完成后会弹出提示,选择导出数据优采云云采集服务平台如何有效地抓取网页?数据,以京东商品信息采集为例 图12 2)选择合适的导出方式,导出采集好的数据优采云cloud采集怎么样服务平台 高效抓取网页数据,以京东商品信息采集为例。图13 通过以上操作,我们采集得到了京东-图书分类-文学综合图书馆-悬疑类下的图书商品信息。打开采集的URL后,我们并没有点击产品链接进入产品详情页面,而是直接用产品块建立了列表循环,采集各个产品信息。采集的具体字段为:价格、书名、评论数、附属店铺。其他网站采集的基本步骤同上,具体步骤需要观察网页的特点,做一些具体的设置。此处不再赘述优采云云采集服务平台优采云爬虫软件入门优采云数据爬虫入门基本操作优采云网站入门从爬虫功能介绍开始优采云爬虫软件功能使用教程优采云分页列表详解采集方法(7.0版本)优采云7. 0版网页简单 模式介绍及使用方法优采云云采集服务平台优采云——70万用户精选的网页数据采集器。1、操作简单,任何人都可以使用:无需技术背景,即可上网采集。过程完全可视化,点击鼠标即可完成操作,2分钟即可快速上手。
  2、功能强大,任何网站都可以使用:点击、登录、翻页、识别验证码、瀑布流、Ajax脚本异步加载数据网页,都可以通过简单的设置来设置&lt; @采集。3、云采集,可以关掉。配置完采集任务后,可以关闭,任务可以在云端执行。庞达云采集集群24*7不间断运行,不用担心IP被封,网络中断。4、特色免费+增值服务,可根据需要选择。免费版功能齐全,可以满足用户基本的采集需求。同时, 查看全部

  浏览器抓取网页(优采云云采集服务平台如何高效的抓取网页数据(组图))
  优采云Cloud采集如何在服务平台上使用网络爬虫工具作为一个不会编码的技术新手,如何高效的爬取网络数据?有没有好用的数据抓取工具,可以帮助小白实现需要的数据采集功能?答案是肯定的。使用一个好的数据抓取工具,可以让我们使用优采云浏览器,通过模仿人们浏览网页的操作来完成数据的抓取。整个过程完全可视化,上手相对容易。它可以抓取 99% 的网页。还具有自动登录、验证码识别、IP代理、云端采集等功能应对网站采集的防范措施。下面是一个完整的使用优采云获取网页数据的例子。以京东为例。以 com 为例。采集网站:,3258,3304&amp;page=1&amp;sort=sort_totalsales15_desc&amp;trans=1&amp;JL=4_2_0#J_main 第一步:创建采集任务1)进入主界面选择,选择自定义模式优采云云采集 服务平台如何高效抓取网页数据,以京东商品信息采集为例 图1 2)复制粘贴网址以上 URL 到 网站输入框并点击“保存 URL”。优采云Cloud采集 服务平台如何高效抓取网页数据?以京东产品信息采集为例。图2 3) 保存URL后,页面会在优采云采集器中打开。红框内的书籍数据为本次演示的信息。采集例如图3 第二步:创建翻页循环,找到翻页按钮,设置翻页循环1)
  2) 移动鼠标选中红框中任意一个文本框后,列表中所有适配的内容都会变成绿色。在右侧的操作提示框中勾选提取的字段,可以删除不需要的字段。然后点击“全选”优采云云采集服务平台如何高效抓取网页数据,以京东产品信息采集为例。图6 注意:将鼠标放在该字段上,会出现一个删除标志,点击删除该字段。如何高效抓取网页数据,以京东产品信息采集为例 图7 优采云云采集服务平台3)点击“采集以下数据”如何高效抓取网页数据,获取京东商品信息采集 以图8 4)修改采集字段名优采云cloud采集如何高效抓取服务平台获取网页数据,以京东商品信息采集为一个例子。图9 5)点击下方红框中的“保存启动采集” 如何高效抓取网页数据并使用京东产品信息采集为例 图10 优采云云采集服务平台6)根据采集的情况选择合适的采集方式,这里选择“Start” Local 采集" 如何高效抓取网页数据,以京东产品信息采集为例 图11 说明:本地采集为采集占用当前计算机资源,如果存在&lt;
  第四步:数据采集并导出1)采集完成后会弹出提示,选择导出数据优采云云采集服务平台如何有效地抓取网页?数据,以京东商品信息采集为例 图12 2)选择合适的导出方式,导出采集好的数据优采云cloud采集怎么样服务平台 高效抓取网页数据,以京东商品信息采集为例。图13 通过以上操作,我们采集得到了京东-图书分类-文学综合图书馆-悬疑类下的图书商品信息。打开采集的URL后,我们并没有点击产品链接进入产品详情页面,而是直接用产品块建立了列表循环,采集各个产品信息。采集的具体字段为:价格、书名、评论数、附属店铺。其他网站采集的基本步骤同上,具体步骤需要观察网页的特点,做一些具体的设置。此处不再赘述优采云云采集服务平台优采云爬虫软件入门优采云数据爬虫入门基本操作优采云网站入门从爬虫功能介绍开始优采云爬虫软件功能使用教程优采云分页列表详解采集方法(7.0版本)优采云7. 0版网页简单 模式介绍及使用方法优采云云采集服务平台优采云——70万用户精选的网页数据采集器。1、操作简单,任何人都可以使用:无需技术背景,即可上网采集。过程完全可视化,点击鼠标即可完成操作,2分钟即可快速上手。
  2、功能强大,任何网站都可以使用:点击、登录、翻页、识别验证码、瀑布流、Ajax脚本异步加载数据网页,都可以通过简单的设置来设置&lt; @采集。3、云采集,可以关掉。配置完采集任务后,可以关闭,任务可以在云端执行。庞达云采集集群24*7不间断运行,不用担心IP被封,网络中断。4、特色免费+增值服务,可根据需要选择。免费版功能齐全,可以满足用户基本的采集需求。同时,

浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)

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

  浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
  urllib.error.HTTPError:HTTP 错误 403:禁止
  从403 Forbidden我们可以发现,此时网站是禁止程序访问的。这是因为csdn网站 设置了反爬虫机制。当网站检测到爬虫时,访问会被拒绝,所以我们会得到上面的结果。
  这时候就需要模拟浏览器访问,以避免网站的反爬虫机制,然后顺利抓取到我们想要的内容。
  接下来,我们将使用魔法库 urllib.request.Request 进行我们的模拟工作。这次我们也会先上传代码,然后再解释,不过这次要提醒大家的是,下面的代码不能直接使用。my_headers 中的 User-Agent 替换为我自己的。因为为了保密我加了省略号,不能直接使用。更换方法如下图所示。这次为了使用方便,我们引入一个函数:
  #coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/")
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  使用上面的代码,我们就可以正常的抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
  由于我们要模拟一个浏览器进行网页访问,这些参数自然需要我们在浏览器中搜索。
  首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下图框,然后我们点击Network,然后我们会发现没有我们页面的信息都打开了,没关系,这时候我们刷新页面的时候,就会出现下图所示的信息。
  
  这时候我们会在第一行看到51251757,就是我们网页网址后面的标签。这时候我们点击这个标签,就会出现下图所示的内容:
  
  下面是我直接访问这个网址时得到的截图:
  
  前两张图,之前写过版本2的访问,现在直接用了。当时我在csdn主页上点了这个博客,所以在代码中的header里填了referer和前两张图。是的
  ,而且这张图是我直接通过URL链接进入浏览器访问的,所以从图中可以看出referer是,这是我们的网站,贴在这里是为了让大家更好的了解这个referer。不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候一定不要用我给的User-Agent,因为我用省略号代替了一些。每个人都需要用自己的方式来弥补。
  这时候我们就会发现Headers,是不是有一种豁然开朗的感觉?是的,你的直觉是对的,我们需要的信息在这个标题中。
  然后,根据代码中需要的参数,把信息复制回来就可以使用了,因为这里显示的信息正好对应了key值,所以我们复制使用起来非常方便。
  下面介绍一下这个urllib.request.Request的用法(从官方文档翻译过来的):
  类 urllib.request。request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) 参数: url:不用说,这是我们即将访问的URL,是一个字符串。data:数据必须是一个字节对象,它指定要发送到服务器的附加数据,如果不需要,则为 None。目前,只有 HTTP 请求使用数据;当提供数据参数时,http 请求应该是 post 而不是 get。数据应以标准 application/x-www-form-urlencoded 格式进行缓冲。urllib.parse.urlencode() 函数的参数是一个映射或二进制序列,并以这种格式返回一个 ASCII 字符串。当它用作数据参数时,它应该被编码为字节。(我们暂时不需要这个,不用管它) headers: headers 是字典数据。当使用键和值参数调用 add_header() 时,此标头将作为请求进行处理。此标头通常用于防止爬虫访问服务器。头部是浏览器用来标识自己的,因为有些HTTP服务器只允许来自普通浏览器的请求而不是脚本(可以理解为爬虫)。
  这必然会增加网站服务器的处理负担,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以爬虫检测机制不是越严格越好,必须考虑服务器的负担。origin_req_host: origin_req_host 应该是发出原创事务请求的主机,RFC 2965 定义了它。它默认为 http.cookiejar.request_host(self)。
  这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是对收录图像的页面的请求的主机。(我们一般不使用这个,这里就知道了) unverifiable: unverifiable 应该表示请求是否是不可验证的,由RFC 2965定义,默认值为false。无法验证的请求意味着无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器上取回图片时,此时unverifiable值应该为true。method:method 应该是一个字符串,指示将使用 HTTP 请求方法(例如,“header”)。如果提供,它的值存储在方法属性中并由方法 get_method() 调用。子类可以通过在类中设置方法属性来指示默认方法。(这个我基本不会用。)说了这么多无聊的定义,我自己也受不了翻译了。让我们继续回到我们的程序:对于我们的程序,只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。
  req.add_header("User-Agent", random_header) 告诉网络服务器我是通过浏览器访问它,我不是爬虫。req.add_header("GET",url) 告诉浏览器我们正在访问的URL,req.add_header("Host","") 这是网站的信息,我们取自网站@ &gt; 填写即可。这句话req.add_header("Referer","") 很重要。它告诉 网站 服务器我们在哪里找到了我们想要访问的网页。比如你点击了百度,如果一个链接跳转到当前访问的页面,那么referer就是百度中的链接,这是一个判断机制。对于 header 构造方法也可以这样做:
  #coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/")
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  从上面的程序中可以看出,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent是硬编码的。其实我们可以发现,对于不同的主机访问同一个网页时,我们的另外三个信息:GET、Host、Referer可能都是一样的,而此时仅以User-Agent作为判断标准用户的异同,那么问题来了,如果我们向同学“借”一些User-Agents来使用,是不是模拟多个用户访问?是不是更酷。其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agents,然后通过random函数随机选择一个组合起来创建一个用户。多人访问的错觉其实很有用。要知道,对于网站来说,访问过多会阻塞用户的ip。这不好玩,所以想要永久访问一个网站而不被屏蔽,还是需要很多技巧的。
  当我们要爬取一个网站的多个网页时,很容易被网站检测到,由于主机频繁访问,进而被拦截。而如果我们在列表中放更多不同的主机号并随机使用它们,是不是很容易被发现?当然,当我们防止这种情况时,更好的方法是使用IP代理,因为我们不容易获得很多主机信息,而IP代理很容易从互联网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。 查看全部

  浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
  urllib.error.HTTPError:HTTP 错误 403:禁止
  从403 Forbidden我们可以发现,此时网站是禁止程序访问的。这是因为csdn网站 设置了反爬虫机制。当网站检测到爬虫时,访问会被拒绝,所以我们会得到上面的结果。
  这时候就需要模拟浏览器访问,以避免网站的反爬虫机制,然后顺利抓取到我们想要的内容。
  接下来,我们将使用魔法库 urllib.request.Request 进行我们的模拟工作。这次我们也会先上传代码,然后再解释,不过这次要提醒大家的是,下面的代码不能直接使用。my_headers 中的 User-Agent 替换为我自己的。因为为了保密我加了省略号,不能直接使用。更换方法如下图所示。这次为了使用方便,我们引入一个函数:
  #coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/";)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  使用上面的代码,我们就可以正常的抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
  由于我们要模拟一个浏览器进行网页访问,这些参数自然需要我们在浏览器中搜索。
  首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下图框,然后我们点击Network,然后我们会发现没有我们页面的信息都打开了,没关系,这时候我们刷新页面的时候,就会出现下图所示的信息。
  
  这时候我们会在第一行看到51251757,就是我们网页网址后面的标签。这时候我们点击这个标签,就会出现下图所示的内容:
  
  下面是我直接访问这个网址时得到的截图:
  
  前两张图,之前写过版本2的访问,现在直接用了。当时我在csdn主页上点了这个博客,所以在代码中的header里填了referer和前两张图。是的
  ,而且这张图是我直接通过URL链接进入浏览器访问的,所以从图中可以看出referer是,这是我们的网站,贴在这里是为了让大家更好的了解这个referer。不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候一定不要用我给的User-Agent,因为我用省略号代替了一些。每个人都需要用自己的方式来弥补。
  这时候我们就会发现Headers,是不是有一种豁然开朗的感觉?是的,你的直觉是对的,我们需要的信息在这个标题中。
  然后,根据代码中需要的参数,把信息复制回来就可以使用了,因为这里显示的信息正好对应了key值,所以我们复制使用起来非常方便。
  下面介绍一下这个urllib.request.Request的用法(从官方文档翻译过来的):
  类 urllib.request。request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) 参数: url:不用说,这是我们即将访问的URL,是一个字符串。data:数据必须是一个字节对象,它指定要发送到服务器的附加数据,如果不需要,则为 None。目前,只有 HTTP 请求使用数据;当提供数据参数时,http 请求应该是 post 而不是 get。数据应以标准 application/x-www-form-urlencoded 格式进行缓冲。urllib.parse.urlencode() 函数的参数是一个映射或二进制序列,并以这种格式返回一个 ASCII 字符串。当它用作数据参数时,它应该被编码为字节。(我们暂时不需要这个,不用管它) headers: headers 是字典数据。当使用键和值参数调用 add_header() 时,此标头将作为请求进行处理。此标头通常用于防止爬虫访问服务器。头部是浏览器用来标识自己的,因为有些HTTP服务器只允许来自普通浏览器的请求而不是脚本(可以理解为爬虫)。
  这必然会增加网站服务器的处理负担,即网站必须在爬虫检测和网站服务器的计算负担之间进行权衡。所以爬虫检测机制不是越严格越好,必须考虑服务器的负担。origin_req_host: origin_req_host 应该是发出原创事务请求的主机,RFC 2965 定义了它。它默认为 http.cookiejar.request_host(self)。
  这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是对收录图像的页面的请求的主机。(我们一般不使用这个,这里就知道了) unverifiable: unverifiable 应该表示请求是否是不可验证的,由RFC 2965定义,默认值为false。无法验证的请求意味着无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器上取回图片时,此时unverifiable值应该为true。method:method 应该是一个字符串,指示将使用 HTTP 请求方法(例如,“header”)。如果提供,它的值存储在方法属性中并由方法 get_method() 调用。子类可以通过在类中设置方法属性来指示默认方法。(这个我基本不会用。)说了这么多无聊的定义,我自己也受不了翻译了。让我们继续回到我们的程序:对于我们的程序,只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。只需掌握几个要点。首先,我们必须构造一个请求:req =Request(url)。此时请求为空。我们需要向其中添加信息,供浏览器查看。
  req.add_header("User-Agent", random_header) 告诉网络服务器我是通过浏览器访问它,我不是爬虫。req.add_header("GET",url) 告诉浏览器我们正在访问的URL,req.add_header("Host","") 这是网站的信息,我们取自网站@ &gt; 填写即可。这句话req.add_header("Referer","") 很重要。它告诉 网站 服务器我们在哪里找到了我们想要访问的网页。比如你点击了百度,如果一个链接跳转到当前访问的页面,那么referer就是百度中的链接,这是一个判断机制。对于 header 构造方法也可以这样做:
  #coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/";)
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
  从上面的程序中可以看出,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent是硬编码的。其实我们可以发现,对于不同的主机访问同一个网页时,我们的另外三个信息:GET、Host、Referer可能都是一样的,而此时仅以User-Agent作为判断标准用户的异同,那么问题来了,如果我们向同学“借”一些User-Agents来使用,是不是模拟多个用户访问?是不是更酷。其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agents,然后通过random函数随机选择一个组合起来创建一个用户。多人访问的错觉其实很有用。要知道,对于网站来说,访问过多会阻塞用户的ip。这不好玩,所以想要永久访问一个网站而不被屏蔽,还是需要很多技巧的。
  当我们要爬取一个网站的多个网页时,很容易被网站检测到,由于主机频繁访问,进而被拦截。而如果我们在列表中放更多不同的主机号并随机使用它们,是不是很容易被发现?当然,当我们防止这种情况时,更好的方法是使用IP代理,因为我们不容易获得很多主机信息,而IP代理很容易从互联网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。

浏览器抓取网页(【】自动爬起来算法(一):继续循环)

网站优化优采云 发表了文章 • 0 个评论 • 68 次浏览 • 2021-11-27 05:06 • 来自相关话题

  浏览器抓取网页(【】自动爬起来算法(一):继续循环)
  前言:在写这篇文章之前,主要看了几个类似的爬虫写法,有的写成队列,感觉不是很直观,有的只有一个请求然后解析页面,但是没有自动爬上去。这也叫爬虫?所以我根据自己的想法写了一个简单的爬虫。
  算法介绍
  程序在思想上采用了广度优先算法。它对没有被遍历过的链接一一发起GET请求,然后用正则表达式解析返回的页面,取出没有找到的新链接,加入集合中,等待下一次遍历的同时循环.
  具体实现中使用的是map,key-value对就是链接和是否遍历。程序中用到了两个Map集合,分别是:oldMap和newMap。初始链接在oldMap中,然后请求oldMap中flag为false的链接,解析页面,使用常规规则检索标签下的链接。如果这个链接不在oldMap和newMap中,就说明这是一个新的链接,如果这个链接是我们需要获取的目标网站的链接,我们会把这个链接放到newMap中,继续解析。, 页面解析完成后,将oldMap中当前页面上的链接值设置为true,表示已经被遍历。
  最后,当整个oldMap没有遍历过的链接遍历完成后,如果发现newMap不为空,说明在这个循环中产生了新的链接。因此,将这些新链接加入到oldMap中,继续递归遍历,反之亦然。此循环中不会生成新链接。如果循环继续,则无法生成新链接。因为任务结束,返回链接集合oldMap
  二 方案实施
  上面的相关思路已经解释的很清楚了,代码中关键地方都有注释,这里就不多说了,代码如下:
  
package action;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WebCrawlerDemo {
public static void main(String[] args) {
WebCrawlerDemo webCrawlerDemo = new WebCrawlerDemo();
webCrawlerDemo.myPrint("http://www.zifangsky.cn");
}

public void myPrint(String baseUrl) {
Map oldMap = new LinkedHashMap(); // 存储链接-是否被遍历
// 键值对
String oldLinkHost = ""; //host

Pattern p = Pattern.compile("(https?://)?[^/\\s]*"); //比如:http://www.zifangsky.cn
Matcher m = p.matcher(baseUrl);
if (m.find()) {
oldLinkHost = m.group();
}

oldMap.put(baseUrl, false);
oldMap = crawlLinks(oldLinkHost, oldMap);
for (Map.Entry mapping : oldMap.entrySet()) {
System.out.println("链接:" + mapping.getKey());

}

}

/**
* 抓取一个网站所有可以抓取的网页链接,在思路上使用了广度优先算法
* 对未遍历过的新链接不断发起GET请求,一直到遍历完整个集合都没能发现新的链接
* 则表示不能发现新的链接了,任务结束
*
* @param oldLinkHost 域名,如:http://www.zifangsky.cn
* @param oldMap 待遍历的链接集合
*
* @return 返回所有抓取到的链接集合
* */
private Map crawlLinks(String oldLinkHost,
Map oldMap) {
Map newMap = new LinkedHashMap();
String oldLink = "";

for (Map.Entry mapping : oldMap.entrySet()) {
System.out.println("link:" + mapping.getKey() + "--------check:"
+ mapping.getValue());
// 如果没有被遍历过
if (!mapping.getValue()) {
oldLink = mapping.getKey();
// 发起GET请求
try {
URL url = new URL(oldLink);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(2000);
connection.setReadTimeout(2000);

if (connection.getResponseCode() == 200) {
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(inputStream, "UTF-8"));
String line = "";
Pattern pattern = Pattern
.compile("(.+)</a>");
Matcher matcher = null;
while ((line = reader.readLine()) != null) {
matcher = pattern.matcher(line);
if (matcher.find()) {
String newLink = matcher.group(1).trim(); // 链接
// String title = matcher.group(3).trim(); //标题
// 判断获取到的链接是否以http开头
if (!newLink.startsWith("http")) {
if (newLink.startsWith("/"))
newLink = oldLinkHost + newLink;
else
newLink = oldLinkHost + "/" + newLink;
}
//去除链接末尾的 /
if(newLink.endsWith("/"))
newLink = newLink.substring(0, newLink.length() - 1);
//去重,并且丢弃其他网站的链接
if (!oldMap.containsKey(newLink)
&& !newMap.containsKey(newLink)
&& newLink.startsWith(oldLinkHost)) {
// System.out.println("temp2: " + newLink);
newMap.put(newLink, false);
}
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
oldMap.replace(oldLink, false, true);
}
}
//有新链接,继续遍历
if (!newMap.isEmpty()) {
oldMap.putAll(newMap);
oldMap.putAll(crawlLinks(oldLinkHost, oldMap)); //由于Map的特性,不会导致出现重复的键值对
}
return oldMap;
}
}
  三项最终测试结果
  
  PS:它的实际递归性不是很好,因为如果网站页多的话,程序运行时间长的话内存消耗会很大。
  感谢您的阅读,希望对您有所帮助,感谢您对本站的支持! 查看全部

  浏览器抓取网页(【】自动爬起来算法(一):继续循环)
  前言:在写这篇文章之前,主要看了几个类似的爬虫写法,有的写成队列,感觉不是很直观,有的只有一个请求然后解析页面,但是没有自动爬上去。这也叫爬虫?所以我根据自己的想法写了一个简单的爬虫。
  算法介绍
  程序在思想上采用了广度优先算法。它对没有被遍历过的链接一一发起GET请求,然后用正则表达式解析返回的页面,取出没有找到的新链接,加入集合中,等待下一次遍历的同时循环.
  具体实现中使用的是map,key-value对就是链接和是否遍历。程序中用到了两个Map集合,分别是:oldMap和newMap。初始链接在oldMap中,然后请求oldMap中flag为false的链接,解析页面,使用常规规则检索标签下的链接。如果这个链接不在oldMap和newMap中,就说明这是一个新的链接,如果这个链接是我们需要获取的目标网站的链接,我们会把这个链接放到newMap中,继续解析。, 页面解析完成后,将oldMap中当前页面上的链接值设置为true,表示已经被遍历。
  最后,当整个oldMap没有遍历过的链接遍历完成后,如果发现newMap不为空,说明在这个循环中产生了新的链接。因此,将这些新链接加入到oldMap中,继续递归遍历,反之亦然。此循环中不会生成新链接。如果循环继续,则无法生成新链接。因为任务结束,返回链接集合oldMap
  二 方案实施
  上面的相关思路已经解释的很清楚了,代码中关键地方都有注释,这里就不多说了,代码如下:
  
package action;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WebCrawlerDemo {
public static void main(String[] args) {
WebCrawlerDemo webCrawlerDemo = new WebCrawlerDemo();
webCrawlerDemo.myPrint("http://www.zifangsky.cn";);
}

public void myPrint(String baseUrl) {
Map oldMap = new LinkedHashMap(); // 存储链接-是否被遍历
// 键值对
String oldLinkHost = ""; //host

Pattern p = Pattern.compile("(https?://)?[^/\\s]*"); //比如:http://www.zifangsky.cn
Matcher m = p.matcher(baseUrl);
if (m.find()) {
oldLinkHost = m.group();
}

oldMap.put(baseUrl, false);
oldMap = crawlLinks(oldLinkHost, oldMap);
for (Map.Entry mapping : oldMap.entrySet()) {
System.out.println("链接:" + mapping.getKey());

}

}

/**
* 抓取一个网站所有可以抓取的网页链接,在思路上使用了广度优先算法
* 对未遍历过的新链接不断发起GET请求,一直到遍历完整个集合都没能发现新的链接
* 则表示不能发现新的链接了,任务结束
*
* @param oldLinkHost 域名,如:http://www.zifangsky.cn
* @param oldMap 待遍历的链接集合
*
* @return 返回所有抓取到的链接集合
* */
private Map crawlLinks(String oldLinkHost,
Map oldMap) {
Map newMap = new LinkedHashMap();
String oldLink = "";

for (Map.Entry mapping : oldMap.entrySet()) {
System.out.println("link:" + mapping.getKey() + "--------check:"
+ mapping.getValue());
// 如果没有被遍历过
if (!mapping.getValue()) {
oldLink = mapping.getKey();
// 发起GET请求
try {
URL url = new URL(oldLink);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(2000);
connection.setReadTimeout(2000);

if (connection.getResponseCode() == 200) {
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(inputStream, "UTF-8"));
String line = "";
Pattern pattern = Pattern
.compile("(.+)</a>");
Matcher matcher = null;
while ((line = reader.readLine()) != null) {
matcher = pattern.matcher(line);
if (matcher.find()) {
String newLink = matcher.group(1).trim(); // 链接
// String title = matcher.group(3).trim(); //标题
// 判断获取到的链接是否以http开头
if (!newLink.startsWith("http")) {
if (newLink.startsWith("/"))
newLink = oldLinkHost + newLink;
else
newLink = oldLinkHost + "/" + newLink;
}
//去除链接末尾的 /
if(newLink.endsWith("/"))
newLink = newLink.substring(0, newLink.length() - 1);
//去重,并且丢弃其他网站的链接
if (!oldMap.containsKey(newLink)
&& !newMap.containsKey(newLink)
&& newLink.startsWith(oldLinkHost)) {
// System.out.println("temp2: " + newLink);
newMap.put(newLink, false);
}
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
oldMap.replace(oldLink, false, true);
}
}
//有新链接,继续遍历
if (!newMap.isEmpty()) {
oldMap.putAll(newMap);
oldMap.putAll(crawlLinks(oldLinkHost, oldMap)); //由于Map的特性,不会导致出现重复的键值对
}
return oldMap;
}
}
  三项最终测试结果
  
  PS:它的实际递归性不是很好,因为如果网站页多的话,程序运行时间长的话内存消耗会很大。
  感谢您的阅读,希望对您有所帮助,感谢您对本站的支持!

浏览器抓取网页(小编来一起获取浏览器信息的方法(1)_java代码参考文章)

网站优化优采云 发表了文章 • 0 个评论 • 88 次浏览 • 2021-11-23 07:09 • 来自相关话题

  浏览器抓取网页(小编来一起获取浏览器信息的方法(1)_java代码参考文章)
  java request.getHeader("user-agent") 获取浏览器信息的方法
  更新时间:2019-03-29 14:53:22 作者:小天才
  本文文章主要介绍java request.getHeader("user-agent")获取浏览器信息的方法。本文介绍的示例代码非常详细,对你的学习或工作有一定的参考价值。有需要的朋友,和小编一起学习吧。
  一、用户代理的含义
  User Agent的中文名称是User Agent,简称UA。它是一个特殊的字符串头,使服务器能够识别操作系统和版本、CPU 类型、客户端使用的浏览器和版本、浏览器渲染引擎、浏览器语言和浏览器插件等。
  一些网站经常判断UA将不同的页面发送到不同的操作系统和不同的浏览器,这可能会导致某些页面在某个浏览器中无法正常显示,但是可以通过伪装UA来绕过检测。
  浏览器的UA字符串
  标准格式为:浏览器标识(操作系统标识;加密级别标识;浏览器语言)渲染引擎标识版本信息
  浏览器 ID
  由于很多网站在进行UA检测时忽略了两位版本号,可能会导致浏览器及以后的版本收到不良页面。因此,浏览器10以后版本中的浏览器标识项固定为Browser,在UA字符串末尾添加真实版本信息。
  注:来自百度百科
  当浏览器发起请求时,我们可以查看请求信息。
  
  请求头:请求头将收录请求信息。
  2:在浏览器请求头中获取User-Agent
  (1) 请求
  
String userAgent = request.getHeader("user-agent");
  (2)获取
  
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
  三、UserAgentUtils.jar
  UserAgentUtils.jar 是 UserAgent 的工具类。
  (1)maven
  
eu.bitwalker
UserAgentUtils
1.20
  (2)java 代码
  
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
Browser browser = userAgent.getBrowser();
OperatingSystem os = userAgent.getOperatingSystem();
  参考文章: 查看全部

  浏览器抓取网页(小编来一起获取浏览器信息的方法(1)_java代码参考文章)
  java request.getHeader("user-agent") 获取浏览器信息的方法
  更新时间:2019-03-29 14:53:22 作者:小天才
  本文文章主要介绍java request.getHeader("user-agent")获取浏览器信息的方法。本文介绍的示例代码非常详细,对你的学习或工作有一定的参考价值。有需要的朋友,和小编一起学习吧。
  一、用户代理的含义
  User Agent的中文名称是User Agent,简称UA。它是一个特殊的字符串头,使服务器能够识别操作系统和版本、CPU 类型、客户端使用的浏览器和版本、浏览器渲染引擎、浏览器语言和浏览器插件等。
  一些网站经常判断UA将不同的页面发送到不同的操作系统和不同的浏览器,这可能会导致某些页面在某个浏览器中无法正常显示,但是可以通过伪装UA来绕过检测。
  浏览器的UA字符串
  标准格式为:浏览器标识(操作系统标识;加密级别标识;浏览器语言)渲染引擎标识版本信息
  浏览器 ID
  由于很多网站在进行UA检测时忽略了两位版本号,可能会导致浏览器及以后的版本收到不良页面。因此,浏览器10以后版本中的浏览器标识项固定为Browser,在UA字符串末尾添加真实版本信息。
  注:来自百度百科
  当浏览器发起请求时,我们可以查看请求信息。
  
  请求头:请求头将收录请求信息。
  2:在浏览器请求头中获取User-Agent
  (1) 请求
  
String userAgent = request.getHeader("user-agent");
  (2)获取
  
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
  三、UserAgentUtils.jar
  UserAgentUtils.jar 是 UserAgent 的工具类。
  (1)maven
  
eu.bitwalker
UserAgentUtils
1.20
  (2)java 代码
  
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
Browser browser = userAgent.getBrowser();
OperatingSystem os = userAgent.getOperatingSystem();
  参考文章:

浏览器抓取网页(我们浏览器提供宝藏网站/常用网站的新导航(组图))

网站优化优采云 发表了文章 • 0 个评论 • 81 次浏览 • 2021-11-22 17:12 • 来自相关话题

  浏览器抓取网页(我们浏览器提供宝藏网站/常用网站的新导航(组图))
  GM浏览器旨在为您提供更实用的网站和更愉快的浏览体验。
  【新导航】我们的浏览器为宝藏网站/常用网站提供了新的导航,区别于传统的网站导航。我们的网站导航收录很多宝物网站常用网站等你发现。上百条新闻网站,想看就看。近百首音乐网站,随时听。有很多新奇奇特的网站等你去发现,比如在线图片制作网络、文章自动生成器网络、千亿大像素网络等有趣的网站等你来发现你的赞赏。
  【音频和视频的获取】我们的浏览器提供了获取和保存网页音乐和视频的功能。它可以在网页上下载许多音乐视频并将它们保存在本地,以便在没有互联网的情况下轻松观看。我们已经支持对m3u8视频ts流视频的简单分析。我们的浏览器集成了下载功能,可以下载zip/pdf/word等,当然也可以下载mp4/mp3/aac等音乐视频。
  【边看新闻边听dj】可以下载自己喜欢的dj,只要在“已下载”中点击下载的音乐,正在播放,然后点击返回按钮,就可以暂停成循环音乐该播放器允许您在看新闻的同时听 dj。您可以在看新闻的同时通过向下滑动锁屏来控制音乐的“上一首”、“下一首”和播放进度。
  【图片获取】我们的浏览器优化了原图的长按获取,现在可以获取更多图片,包括各种动画图片和各种网上制作的表情。
  [广告过滤] 我们的浏览器现在可以屏蔽一些一般的广告网络广告。我们也非常关注广告拦截的功能。我们将在未来继续优化广告拦截。
  【新工具】手机鼠标:我们发现一些优秀的网站网页在电脑版上很难点击,一些小广告的关闭按钮很小,很难点击。所以我们开发了一个手机鼠标来辅助点击网页,它只是一个辅助工具哦!指针:我们想减少手指滑动点击的频率和压力,所以我们开发了一个网页链接器,可以辅助自动执行记录的点击路径并辅助点击。它也只是一个辅助点击工具!它可能无法用于日常浏览。我们已经向未来的自动浏览和解放双手迈出了第一步。
  【小工具】右侧边栏集成了自动纠错计算器、函数绘图仪、分贝计、二维码扫描仪、二维码生成器等小工具。
  [隐私]您的浏览记录和采集记录不会上传到我们的服务器,请随时浏览和采集。除了你自己和你浏览的对方网站和网络运营商,估计没有人知道你浏览访问的内容。请放心使用本浏览器。我们将尽最大努力确保用户无需登录的隐私。 查看全部

  浏览器抓取网页(我们浏览器提供宝藏网站/常用网站的新导航(组图))
  GM浏览器旨在为您提供更实用的网站和更愉快的浏览体验。
  【新导航】我们的浏览器为宝藏网站/常用网站提供了新的导航,区别于传统的网站导航。我们的网站导航收录很多宝物网站常用网站等你发现。上百条新闻网站,想看就看。近百首音乐网站,随时听。有很多新奇奇特的网站等你去发现,比如在线图片制作网络、文章自动生成器网络、千亿大像素网络等有趣的网站等你来发现你的赞赏。
  【音频和视频的获取】我们的浏览器提供了获取和保存网页音乐和视频的功能。它可以在网页上下载许多音乐视频并将它们保存在本地,以便在没有互联网的情况下轻松观看。我们已经支持对m3u8视频ts流视频的简单分析。我们的浏览器集成了下载功能,可以下载zip/pdf/word等,当然也可以下载mp4/mp3/aac等音乐视频。
  【边看新闻边听dj】可以下载自己喜欢的dj,只要在“已下载”中点击下载的音乐,正在播放,然后点击返回按钮,就可以暂停成循环音乐该播放器允许您在看新闻的同时听 dj。您可以在看新闻的同时通过向下滑动锁屏来控制音乐的“上一首”、“下一首”和播放进度。
  【图片获取】我们的浏览器优化了原图的长按获取,现在可以获取更多图片,包括各种动画图片和各种网上制作的表情。
  [广告过滤] 我们的浏览器现在可以屏蔽一些一般的广告网络广告。我们也非常关注广告拦截的功能。我们将在未来继续优化广告拦截。
  【新工具】手机鼠标:我们发现一些优秀的网站网页在电脑版上很难点击,一些小广告的关闭按钮很小,很难点击。所以我们开发了一个手机鼠标来辅助点击网页,它只是一个辅助工具哦!指针:我们想减少手指滑动点击的频率和压力,所以我们开发了一个网页链接器,可以辅助自动执行记录的点击路径并辅助点击。它也只是一个辅助点击工具!它可能无法用于日常浏览。我们已经向未来的自动浏览和解放双手迈出了第一步。
  【小工具】右侧边栏集成了自动纠错计算器、函数绘图仪、分贝计、二维码扫描仪、二维码生成器等小工具。
  [隐私]您的浏览记录和采集记录不会上传到我们的服务器,请随时浏览和采集。除了你自己和你浏览的对方网站和网络运营商,估计没有人知道你浏览访问的内容。请放心使用本浏览器。我们将尽最大努力确保用户无需登录的隐私。

浏览器抓取网页(Google搜索蜘蛛就要开始对部分网站开始用HTTP/2方式抓取网站内容)

网站优化优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2021-11-22 06:19 • 来自相关话题

  浏览器抓取网页(Google搜索蜘蛛就要开始对部分网站开始用HTTP/2方式抓取网站内容)
  国外谷歌站长透露,从今年11月开始,谷歌搜索将很快启用HTTP/2小范围抓取内容。抓取网页时效率会更高,不会影响网站搜索排名。 .
  
  我了解到HTTP/基于SPDY,一种注重性能的网络传输协议。与 HTTP/1 相比,它具有新的特性,如二进制成帧、多路复用等特性。正式使用HTTP/2抓包后,最大的特点就是支持一个目标用户和网站之间只有一个连接,相比HTTP/1谷歌蜘蛛抓取网站,谷歌可以用更少的资源更快地抓取内容@网站 更高的效率。
  Google 表示,目前主要的网站 和主流浏览器已经支持 HTTP/2 很长时间了。大多数CDN服务商也支持HTTP/2,使用HTTP/2的条件也基本成熟。从2020年11月开始,谷歌搜索蜘蛛将开始使用HTTP/2抓取一些网站 网站内容,然后慢慢增加对越来越多的网站的支持。
  当然,如果网站不支持HTTP/2或者网站不希望谷歌使用HTTP/2进行爬取,站长也可以,使用HTTP/1和HTTP/ 2.协议可以正常支持谷歌蜘蛛爬取网站的内容,不影响网站的搜索排名,谷歌蜘蛛爬取网站的质量和数量将保持不变。 查看全部

  浏览器抓取网页(Google搜索蜘蛛就要开始对部分网站开始用HTTP/2方式抓取网站内容)
  国外谷歌站长透露,从今年11月开始,谷歌搜索将很快启用HTTP/2小范围抓取内容。抓取网页时效率会更高,不会影响网站搜索排名。 .
  
  我了解到HTTP/基于SPDY,一种注重性能的网络传输协议。与 HTTP/1 相比,它具有新的特性,如二进制成帧、多路复用等特性。正式使用HTTP/2抓包后,最大的特点就是支持一个目标用户和网站之间只有一个连接,相比HTTP/1谷歌蜘蛛抓取网站,谷歌可以用更少的资源更快地抓取内容@网站 更高的效率。
  Google 表示,目前主要的网站 和主流浏览器已经支持 HTTP/2 很长时间了。大多数CDN服务商也支持HTTP/2,使用HTTP/2的条件也基本成熟。从2020年11月开始,谷歌搜索蜘蛛将开始使用HTTP/2抓取一些网站 网站内容,然后慢慢增加对越来越多的网站的支持。
  当然,如果网站不支持HTTP/2或者网站不希望谷歌使用HTTP/2进行爬取,站长也可以,使用HTTP/1和HTTP/ 2.协议可以正常支持谷歌蜘蛛爬取网站的内容,不影响网站的搜索排名,谷歌蜘蛛爬取网站的质量和数量将保持不变。

官方客服QQ群

微信人工客服

QQ人工客服


线