php 网页内容抓取(PHP程序Pocket抓取知乎专栏的问题(一)_)

优采云 发布时间: 2022-04-18 13:15

  php 网页内容抓取(PHP程序Pocket抓取知乎专栏的问题(一)_)

  Pocket爬取知乎列问题

  Pocket 是我以后经常阅读的一种网络服务。它对在线文章文字的采集和爬取效果比较好,对页面广告等不相关内容的去除也相当强大。它支持标记和搜索,同步速度也很快。没关系,免费会员限制也很少,所以如果我看到一些我无法立即阅读和消化的文章,我会先将其添加到Pocket队列中,然后在我有的时候检查存档时间。

  只是由于目前爬取网页文本原理的限制,Pocket 基本上不能很好地支持越来越多的 AJAX 动态网页。典型的是知乎列文章。知乎 列之前用于支持Pocket 的直接捕获。改成AJAX加载数据,发送文章到Pocket后,效果如下:

  

  Pocket正常爬取的文章应该可以在文章中显示抽象文本或者图片,知乎栏文章为空白,点击文章 条目也是直接跳转到知乎 列链接,没有显示Pocket 爬取优化的效果。

  问题分析

  稍微看一下 知乎 栏目页面的代码就会发现,如果你在浏览器中访问这样的栏目 文章 链接:

  下面的文章内容数据API链接实际会被加载,直到数据加载完毕才会显示知乎栏页面:

  这种动态加载方式显然是Pocket不支持的,但是很好处理。我们使用PHP或者Node.js来实现一个简单的程序,读取文章列的内容并输出,然后放到VPS或者其他虚拟机中。在主机上运行,​​然后访问我自己的 URL 并将其发送到 Pocket 应该可以让 Pocket 正确爬行。另外,这种方法比较好的一面是输出内容中没有其他知乎相关的网页代码,只有文章栏的内容,方便Pocket抓取和处理。

  PHP程序口袋抓取效果

  这个 PHP 程序没有技术内容。我只是写了一个简单的PHP文件,接受列页面ID的页面参数,输出文章的内容:

  上面的程序只是做一个简单的判断。如果请求头中收录Referer信息(如从Pocket中跳转网站等)或者请求地址中的redirect参数值为1,则直接跳转到知乎列页面,默认情况下, 文章 列的内容被输出。另外,程序使用getallheaders函数来获取HTTP请求头信息。默认情况下,仅支持 Apache。如果想在nginx等服务器上使用,可以稍作修改。

  此外,程序还将referrer值指定为never,以防止页面引用知乎图片等资源时触发知乎的防盗链机制。

  将上面的PHP程序放到虚拟主机上,访问类似如下的链接(仅供演示,需要翻墙):

  ~nocwat/知乎-grub.php?page=21542817

  一旦 文章 内容正确显示,将上面的链接发送到 Pocket 并稍等片刻,即可在 Pocket 队列中看到抓取的列 文章。

  暗示

  由于知乎栏目中的图片采用了防盗链政策,直接访问上面的链接可能会出现文章中的图片无法正确显示的问题,不过没关系,Pocket将自动为我们抓取并保存它文章 中的图片。

  最后再来看看我的Pocket队列中的显示效果:

  

<p>而且,点击文章条目还可以看到Pocket文章优化的内容,点击查看Pocket中的原创文档也可以自动跳转到

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线