php抓取网页title(PHP程序Pocket抓取知乎专栏的问题(一)_)
优采云 发布时间: 2021-10-05 03:19php抓取网页title(PHP程序Pocket抓取知乎专栏的问题(一)_)
口袋抓取知乎列问题
Pocket 是一种网络服务,我通常会在以后阅读时使用更多。对在线文章文字进行采集爬取效果更好。可以去除页面广告等无关内容。支持标注和搜索,同步速度也高。没关系。免费会员限制很小,所以如果我看到一些来不及阅读和消化的文章,我会先将其添加到Pocket队列中,有空时查看存档。
只是由于目前抓取网页正文的原理的限制,Pocket 基本上不支持越来越多的 AJAX 动态网页。最典型的就是知乎栏文章。之前的知乎列是用来支持Pocket的直接取的,改成AJAX加载数据后,将文章发送到Pocket会有这样的效果:
Pocket正常抓取的文章应该可以显示文章中的摘要文本或图片,知乎栏文章为空,点击文章@ >入口也是直接跳转到知乎栏目链接,并没有表现出Pocket抓取优化的效果。
问题分析
稍微看一下知乎专栏网页的代码,可以发现,如果在浏览器中访问这样的专栏,文章链接:
下面的文章内容数据API链接会实际加载,直到数据加载完毕才会显示知乎栏目页面:
这种动态加载显然是 Pocket 不支持的,但是很容易处理。我们用PHP或者Node.js实现一个简单的程序读取文章栏目的内容并输出,然后放到VPS或者其他虚拟主机上运行,然后访问我自己的网站并发送到 Pocket,Pocket 应该能够正确捕获它。另外,这种方法比较好的一面是输出内容中没有其他知乎相关网页代码,只有列文章内容,更便于Pocket抓取和处理。
PHP程序Pocket抓取效果
这个PHP程序真的没有技术含量。我只是写了一个简单的PHP文件,接受列页面ID的page参数,输出文章的内容:
上面的程序只是一个简单的判断。如果请求头收录Referer信息(例如从Pocket跳转网站等)或者请求地址中的redirect参数值为1,则直接跳转到知乎列页面,内容文章 列的默认输出。另外,程序使用getallheaders函数获取HTTP请求头信息。默认情况下,仅支持 Apache。如果想在nginx等服务器上使用,可以稍微修改一下。
此外,程序还将referrer值指定为never,防止页面引用知乎图片等资源时触发知乎的反盗链机制。
将上面的PHP程序放在虚拟主机上,访问类似如下的链接(仅供演示,需要翻墙):
~nocwat/知乎-grub.php?page=21542817
正确显示文章的内容后,把上面的链接发给Pocket。过一会就可以在Pocket队列中看到爬取的列文章。
暗示
由于知乎栏的图片有防盗链策略,直接访问上面的链接可能会导致文章中的图片无法正确显示的问题,不过没关系,Pocket会自动抓拍保存对于我们文章 在图片中。
最后来看看我的Pocket队列中的显示效果:
并点击文章条目进入,还可以看到Pocket优化文章的内容。在Pocket中点击查看原文档还可以自动跳转到知乎的栏目文章页面,这样你就不用担心专栏作家是否删除了文章而不会被能够再次查看它。
没有相关的文章。