2019年11月2日 | 标签:

项目背景和挑战

有时候需要使用爬虫批量抓取一系列网址的指定位置,并且导入到excel,一般的思路是使用python,但是需要懂编程语言 并且假设运行环境 并且学习保存文件 和乱码 要累死人,使用桌面端软件如八爪鱼 火车头等软件是简单,但是需要安装软件并且保存的数据也是有格式要求,如果是少量的数据 特地去下载安装也比较费事,

解决思路
有没有一种比较简单的
不需要任何编程基础
不需要安装任何软件
只要点几下鼠标就能做出来爬虫 抓取大量网站的内容 并且把需要的数据保存到excel
答案是有的 只需要3秒,复制2次就可以抓取任意网站的任意内容
操作方法
其实就利用谷歌的产品谷歌文档 google docs中google sheets,它其实是一个在线的excel网站
但是有一个函数功能可以抓取网页,并且能指定抓取的方法(xpath) 达到精准抓取的目的
当然整个解决方案的前提是
你要能扶墙到国外,访问谷歌文档的google sheets,使用他的importxml 函数
1,使用谷歌浏览器 chrome 选择你要抓取的网页的内容  点击右键 选择
如图所示 打开https://news.163.com/18/1203/10/E23JJ2DN0001875P.html 网易新闻
选中标题右键检查后
查看更多精彩图片
2 在chrome打开的开发工具里面选择标题的代码 选择 复制  – xpath

查看更多精彩图片

3  打开谷歌文档的谷歌sheets 可以新建一个 https://docs.google.com/spreadsheets/u/0/

输入公式,这里可以把抓取的网址放在一个单元格, 复制过来的xpath放在另外一个单元格
使用公式importxml 输入这2个单元格的地址即可  可以看到 该公式会抓取页面后 根据xpath的路径把文字抓取来 放到单元格中
查看更多精彩图片
再换一个例子 看看我们抓取新闻来源
1,打开网址http://money.163.com/18/1203/10/E23I0L6D002580S6.html 选择新闻来源文字右键检查 在打开的开发者工具中复制 xpath
查看更多精彩图片
2 在google sheets中 插入xpath公式 发现公式无法运行 原因是公式的输出会覆盖别的单元格 我们需要换个位置放公式
查看更多精彩图片
3我们修改下公式的位置放到别的地方
发现输出的信息分到3个单元格 原因是因为抓取的文字是包含在3个不同的html标签 所以会被分成3个单元格存放
这里有2个解决办法

查看更多精彩图片

4.1 解决google sheets中的importxml 输出多个单元格的方法1,再使用一个concatenate公式 强行把输出的信息写成一个字符串
查看更多精彩图片

4.2解决google sheets中的importxml 输出多个单元格的方法2,
重新选择xpath ,精确选择具体的元素 重新修改xpath
查看更多精彩图片

4.2.1 这里可以看到精确修改后的xpath就只会输出一个元素 不需要加公司 更加精确(推荐)

如果我们要抓取的是非文字信息如超链接的地址
只需要把xpath里面的信息 //*[@id=”ne_article_source”] 换成了//*[@id=”ne_article_source”]/@href
就可以抓取这个a标签的href属性的值 是不是很简单

查看更多精彩图片

写在最后
 
 
本文介绍了一种迅速简单的办法根据页面的URL和对应元素的xpath 利用谷歌文档来当爬虫 抓取的例子
方法比较简单 容易上手
关于xpath的详细介绍 可以看这篇 xpath语法入门到实战
但有的网址会有反爬机制 需要指定浏览器访问头信息 和其他信息 就不能用这种了
并且如果我们想要抓取列表信息,如一个页面有20个新闻标题以及对应的url或者百度的搜索结果
页面 我们要抓取前100个网址结果来比对 查询seo排名(后面会讲) 这个方法就不适用了
针对使用importxml 抓取多个结果的方法 会另外写一篇来讲解
项目背景和挑战

有时候需要使用爬虫批量抓取一系列网址的指定位置,并且导入到excel,一般的思路是使用python,但是需要懂编程语言 并且假设运行环境 并且学习保存文件 和乱码 要累死人,使用桌面端软件如八爪鱼 火车头等软件是简单,但是需要安装软件并且保存的数据也是有格式要求,如果是少量的数据 特地去下载安装也比较费事,

解决思路
有没有一种比较简单的
不需要任何编程基础
不需要安装任何软件
只要点几下鼠标就能做出来爬虫 抓取大量网站的内容 并且把需要的数据保存到excel
答案是有的 只需要3秒,复制2次就可以抓取任意网站的任意内容
操作方法
其实就利用谷歌的产品谷歌文档 google docs中google sheets,它其实是一个在线的excel网站
但是有一个函数功能可以抓取网页,并且能指定抓取的方法(xpath) 达到精准抓取的目的
当然整个解决方案的前提是
你要能扶墙到国外,访问谷歌文档的google sheets,使用他的importxml 函数
1,使用谷歌浏览器 chrome 选择你要抓取的网页的内容  点击右键 选择
如图所示 打开https://news.163.com/18/1203/10/E23JJ2DN0001875P.html 网易新闻
选中标题右键检查后
查看更多精彩图片
2 在chrome打开的开发工具里面选择标题的代码 选择 复制  – xpath

查看更多精彩图片

3  打开谷歌文档的谷歌sheets 可以新建一个 https://docs.google.com/spreadsheets/u/0/

输入公式,这里可以把抓取的网址放在一个单元格, 复制过来的xpath放在另外一个单元格
使用公式importxml 输入这2个单元格的地址即可  可以看到 该公式会抓取页面后 根据xpath的路径把文字抓取来 放到单元格中
查看更多精彩图片
再换一个例子 看看我们抓取新闻来源
1,打开网址http://money.163.com/18/1203/10/E23I0L6D002580S6.html 选择新闻来源文字右键检查 在打开的开发者工具中复制 xpath
查看更多精彩图片
2 在google sheets中 插入xpath公式 发现公式无法运行 原因是公式的输出会覆盖别的单元格 我们需要换个位置放公式
查看更多精彩图片
3我们修改下公式的位置放到别的地方
发现输出的信息分到3个单元格 原因是因为抓取的文字是包含在3个不同的html标签 所以会被分成3个单元格存放
这里有2个解决办法

查看更多精彩图片

4.1 解决google sheets中的importxml 输出多个单元格的方法1,再使用一个concatenate公式 强行把输出的信息写成一个字符串
查看更多精彩图片

4.2解决google sheets中的importxml 输出多个单元格的方法2,
重新选择xpath ,精确选择具体的元素 重新修改xpath
查看更多精彩图片

4.2.1 这里可以看到精确修改后的xpath就只会输出一个元素 不需要加公司 更加精确(推荐)

如果我们要抓取的是非文字信息如超链接的地址
只需要把xpath里面的信息 //*[@id=”ne_article_source”] 换成了//*[@id=”ne_article_source”]/@href
就可以抓取这个a标签的href属性的值 是不是很简单

查看更多精彩图片

写在最后
 
 
本文介绍了一种迅速简单的办法根据页面的URL和对应元素的xpath 利用谷歌文档来当爬虫 抓取的例子
方法比较简单 容易上手
关于xpath的详细介绍 可以看这篇 xpath语法入门到实战
但有的网址会有反爬机制 需要指定浏览器访问头信息 和其他信息 就不能用这种了
并且如果我们想要抓取列表信息,如一个页面有20个新闻标题以及对应的url或者百度的搜索结果
页面 我们要抓取前100个网址结果来比对 查询seo排名(后面会讲) 这个方法就不适用了
针对使用importxml 抓取多个结果的方法 会另外写一篇来讲解
2019年11月1日 | 标签:

 

前面写了一篇文章 介绍使用google sheets里面的importxml 公式 使用xpath提取网页信息 这边附上一些基础知

Xpath简介(xpath,html,xml 3者之间关系)
XPath是XML Path的简称,它是一种非常强大的元素查找定位语法,使用这种xml 查找语言几乎可以定位到页面上的任意元素。又因为HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位HTML语言写的网页上的页面元素。
XPath语法基本元素:
路径参考windows操作系统下文件的地址表示,例如c://tools/qq/pic/a.jpg,通过一系列的路径来定位位置(表示在c盘下的tools文件夹下的qq文件夹下的pic文件夹下的a文件,文件的后缀名为jpg)
xpath有2种类型的路径
绝对路径(/ )
查找页面根元素:/
查找页面上的form元素:/html/body/f0rm[1] 
表示的是在文档根目录的html标签下的body标签下的form标签,因为html和body都是唯一,但是body下的form有多个所以使用了form[1] 表示body下的第1个f0rm标签
注意:
1. 元素的xpath绝对路径可通过chrome直接查询。
2. 一般不推荐使用绝对路径的写法,因为一旦页面结构发生变化,该路径也随之失效,必须重新写。
3. 绝对路径以单/号表示,而下面要讲的相对路径则以//表示(2个斜线),这个区别非常重要。
相对路径(//)
查找页面内所有的input元素,无论在什么层级://input
绝对路径和相对路径的区别
当xpath的路径以/开头时,表示让Xpath解析引擎从文档的根节点开始解析
当xpath路径以//开头时,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析。
/出现在xpath路径中时,则表示寻找父节点的直接子节点
//出现在xpath路径中时,表示寻找父节点下任意符合条件的子,孙,曾孙 节点,不管嵌套了多少层级。
弄清这个原则,就可以理解其实xpath的路径可以绝对路径和相对路径混合在一起来进行表示
索引查找([n])
如果有多个结果符合 这里使用标签名称[n] 这种形式代表
 [3] 来符合的第3个结果
页面上的form元素:/html/body/f0rm[1] 表示的是在文档根目录的html标签下的body标签下的form标签,因为html和body都是唯一,但是body下的f0rm有多个所以使用了form[1] 表示body下的第1个form标签
//form[1]//input
查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号):
//form[1]/input
查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号):
//form[1]/input[3]
(如果有多个input返回值符合 可以使用//f0rm[1]/input[3]) 表示符合条件的第3个input
属性查找([@])
查找页面上id为loginform的form元素:
//form[@id=’loginf0rm’]
查找页面上具有name属性为username的input元素:
//input[@name=’username’]
查找页面上id为loginform的form元素下的第一个input元素:
//form[@id=’loginf0rm’]/input[1]
查找页面上任意标签但是包含id属性以及值为loginf0rm下的第一个input元素:
//*[@id=’loginf0rm’]/input[1]
下面讲3种高级的方法
1 xpath多属性组合查找-符合多个属性值的元素 ([][])
使用多个连续的[] 将属性条件合并在一起 并列查找页面具有name属性为contiune并且type属性为button的input元素:
//input[@name=’continue’][@type=’button’]
上面是并列满足 如果是多属性只要满足一个的是
//input[@name=’continue’ or @type=’button’]
//a[@name or @href]
2 xpath 属性查找后-返回另外一个属性的值//*[@属性1=值1]
/@属性2通过[@属性1=值1]/@属性2
例如页面有一段代码是
<meta itemprop=”pricecontent=”888.0“>
现在我们需要取出来这个888这个值
我们使用
//*[@itemprop=”price”]/@content 获取这个zhi
这里解释下//*[@itemprop=”price”] 表示匹配任何标签 只要包含属性itemprop 并且值为price, 这样就得到了这个<meta整个标签,然后通过/@content 来获取这个标签中content的值 ,类似的还是有a/@href 获取a标签的href值
3 xpath 属性加索引合并查找-属性选择后有多个返回结果 
使用属性查找以后 会有多个符合的结果
需要再筛选一次索引值后再使用
举例如下查找页面具有name属性为contiune的input元素
但是有10个input, 需要找到第8个input
 然后再找第8个input元素下包含的a标签的href属性
(//input[@name=’continue’])[8]//a/@href
这里要注意下
先选择属性后 //input[@name=’continue’] 需要括号() 再使用[8] 才能选择第8个复合条件的元素
再使用//a 代表这第8个input下面的 所有子元素中的a标签 然后在使用/@href 取出这个元素的 href值
如果不打括号会逻辑混乱 这点要注意 既选择了属性后的多个结果需要用括号再指定下取的具体序列
 
最后附上老外的一个cheat sheet
https://devhints.io/xpath
有很多学习的例子

前面写了一篇文章 介绍使用google sheets里面的importxml 公式 使用xpath提取网页信息 这边附上一些基础知识 http://cotine.blog.hexun.com/117798350_d.html

Xpath简介(xpath,html,xml 3者之间关系)
XPath是XML Path的简称,它是一种非常强大的元素查找定位语法,使用这种xml 查找语言几乎可以定位到页面上的任意元素。又因为HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位HTML语言写的网页上的页面元素。
XPath语法基本元素:
路径参考windows操作系统下文件的地址表示,例如c://tools/qq/pic/a.jpg,通过一系列的路径来定位位置(表示在c盘下的tools文件夹下的qq文件夹下的pic文件夹下的a文件,文件的后缀名为jpg)
xpath有2种类型的路径
绝对路径(/ )
查找页面根元素:/
查找页面上的form元素:/html/body/f0rm[1] 
表示的是在文档根目录的html标签下的body标签下的form标签,因为html和body都是唯一,但是body下的form有多个所以使用了form[1] 表示body下的第1个f0rm标签
注意:
1. 元素的xpath绝对路径可通过chrome直接查询。
2. 一般不推荐使用绝对路径的写法,因为一旦页面结构发生变化,该路径也随之失效,必须重新写。
3. 绝对路径以单/号表示,而下面要讲的相对路径则以//表示(2个斜线),这个区别非常重要。
相对路径(//)
查找页面内所有的input元素,无论在什么层级://input
绝对路径和相对路径的区别
当xpath的路径以/开头时,表示让Xpath解析引擎从文档的根节点开始解析
当xpath路径以//开头时,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析。
/出现在xpath路径中时,则表示寻找父节点的直接子节点
//出现在xpath路径中时,表示寻找父节点下任意符合条件的子,孙,曾孙 节点,不管嵌套了多少层级。
弄清这个原则,就可以理解其实xpath的路径可以绝对路径和相对路径混合在一起来进行表示
索引查找([n])
如果有多个结果符合 这里使用标签名称[n] 这种形式代表
 [3] 来符合的第3个结果
页面上的form元素:/html/body/f0rm[1] 表示的是在文档根目录的html标签下的body标签下的form标签,因为html和body都是唯一,但是body下的f0rm有多个所以使用了form[1] 表示body下的第1个form标签
//form[1]//input
查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号):
//form[1]/input
查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号):
//form[1]/input[3]
(如果有多个input返回值符合 可以使用//f0rm[1]/input[3]) 表示符合条件的第3个input
属性查找([@])
查找页面上id为loginform的form元素:
//form[@id=’loginf0rm’]
查找页面上具有name属性为username的input元素:
//input[@name=’username’]
查找页面上id为loginform的form元素下的第一个input元素:
//form[@id=’loginf0rm’]/input[1]
查找页面上任意标签但是包含id属性以及值为loginf0rm下的第一个input元素:
//*[@id=’loginf0rm’]/input[1]
下面讲3种高级的方法
1 xpath多属性组合查找-符合多个属性值的元素 ([][])
使用多个连续的[] 将属性条件合并在一起 并列查找页面具有name属性为contiune并且type属性为button的input元素:
//input[@name=’continue’][@type=’button’]
上面是并列满足 如果是多属性只要满足一个的是
//input[@name=’continue’ or @type=’button’]
//a[@name or @href]
2 xpath 属性查找后-返回另外一个属性的值//*[@属性1=值1]
/@属性2通过[@属性1=值1]/@属性2
例如页面有一段代码是
<meta itemprop=”pricecontent=”888.0“>
现在我们需要取出来这个888这个值
我们使用
//*[@itemprop=”price”]/@content 获取这个zhi
这里解释下//*[@itemprop=”price”] 表示匹配任何标签 只要包含属性itemprop 并且值为price, 这样就得到了这个<meta整个标签,然后通过/@content 来获取这个标签中content的值 ,类似的还是有a/@href 获取a标签的href值
3 xpath 属性加索引合并查找-属性选择后有多个返回结果 
使用属性查找以后 会有多个符合的结果
需要再筛选一次索引值后再使用
举例如下查找页面具有name属性为contiune的input元素
但是有10个input, 需要找到第8个input
 然后再找第8个input元素下包含的a标签的href属性
(//input[@name=’continue’])[8]//a/@href
这里要注意下
先选择属性后 //input[@name=’continue’] 需要括号() 再使用[8] 才能选择第8个复合条件的元素
再使用//a 代表这第8个input下面的 所有子元素中的a标签 然后在使用/@href 取出这个元素的 href值
如果不打括号会逻辑混乱 这点要注意 既选择了属性后的多个结果需要用括号再指定下取的具体序列
 
最后附上老外的一个cheat sheet
https://devhints.io/xpath
有很多学习的例子
2019年10月3日 | 标签:

内容:

首先要了解下usb.2.0 就是我们见的最多的u盘的接口

但是随着大型的视频文件 特别是高清电影 动不动就几个G的 依靠usb2.0接口是很慢的
于是就出现了usb 3.0 接口规范,这个接口和2.0 很像 判断的标准就是 这个接口是蓝色的
它的速度是5G每秒,而usb 2.0 是480M 每秒,快了10倍!!
所以理论上 以前一部电影需要10分钟的 现在只需要一分钟就可以拷贝到usb3.0的移动硬盘了
那type-c是什么鬼呢
其实type-c 是usb3.1的其中一个接口,全称是 USB3.1 Type-C, 所以就有type a, type b
type-a,就是和我们的u盘一样的接口
type-b 是正方形的 打印机的接口和部分显示器接口
type-c 就是现在最新的手机的接口 也是苹果电脑的接口(从苹果和安卓能使用同一个接口 说明未来的趋势)
蓝色为usb3.0 小口是usb3.1的type-c接口
查看更多精彩图片
从数据传输速度上来说 type c 既usb3.1 和3.0的速度只是相差2倍, 一个是5g 一个是10g 也符合命名规范
毕竟2.0 到3.0 速度快了10倍, 那么3.0到3.1 快2倍 也是合理的
速度不是这个接口最核心  而是电压和功率
在usb2.0 和3.0 世代  电压只有5V 电流是0.5A和1A 既最大功率也就5W
在3.1时代 可以支持到20V电压5A电流,既功率可以有100W
这样可以给手机快速充电提供了可能 也可以同一个接口 既可以让手机这种小电器充电 也可以给pad和笔记本这样相对大的设备充电
这就是为什么type c这种接口以后是主流
苹果手机以后会和安卓手机使用同一个数据线和充电线的
总结
Type-C的好处如下
传输数据比USB 3.0 快1倍  
充电功率是之前的20倍(同一个type-c的充电器 可以给笔记本充电 还可以给手机充电了)
接口体积只有以前4分之一(对应越做越小的手机 非常合适)

首先要了解下usb.2.0 就是我们见的最多的u盘的接口

但是随着大型的视频文件 特别是高清电影 动不动就几个G的 依靠usb2.0接口是很慢的
于是就出现了usb 3.0 接口规范,这个接口和2.0 很像 判断的标准就是 这个接口是蓝色的
它的速度是5G每秒,而usb 2.0 是480M 每秒,快了10倍!!
所以理论上 以前一部电影需要10分钟的 现在只需要一分钟就可以拷贝到usb3.0的移动硬盘了
那type-c是什么鬼呢
其实type-c 是usb3.1的其中一个接口,全称是 USB3.1 Type-C, 所以就有type a, type b
type-a,就是和我们的u盘一样的接口
type-b 是正方形的 打印机的接口和部分显示器接口
type-c 就是现在最新的手机的接口 也是苹果电脑的接口(从苹果和安卓能使用同一个接口 说明未来的趋势)
蓝色为usb3.0 小口是usb3.1的type-c接口
查看更多精彩图片
从数据传输速度上来说 type c 既usb3.1 和3.0的速度只是相差2倍, 一个是5g 一个是10g 也符合命名规范
毕竟2.0 到3.0 速度快了10倍, 那么3.0到3.1 快2倍 也是合理的
速度不是这个接口最核心  而是电压和功率
在usb2.0 和3.0 世代  电压只有5V 电流是0.5A和1A 既最大功率也就5W
在3.1时代 可以支持到20V电压5A电流,既功率可以有100W
这样可以给手机快速充电提供了可能 也可以同一个接口 既可以让手机这种小电器充电 也可以给pad和笔记本这样相对大的设备充电
这就是为什么type c这种接口以后是主流
苹果手机以后会和安卓手机使用同一个数据线和充电线的
总结
Type-C的好处如下
传输数据比USB 3.0 快1倍  
充电功率是之前的20倍(同一个type-c的充电器 可以给笔记本充电 还可以给手机充电了)
接口体积只有以前4分之一(对应越做越小的手机 非常合适)