知乎的网页标题title的提取一直有各种问题。可能是知乎自己做了防止被爬虫抓取的。普通的问题详情页和知乎专栏,都提取不到网页title,或者提取到了错误的title。
本文记录了实际可用的方法,分别提取知乎问题详情页的title与知乎专栏页的title和封面图片的提取方法。
知乎问题详情页的title提取
首先看一下源代码
<title>你必讲的笑话是哪个? - 知乎</title><title>知乎 - 有问题上知乎</title>
中间部分源代码省略了。其中有2个title,直接使用正则匹配时,只能匹配到第2个title——“知乎 - 有问题上知乎”,所有页都是这个。
再继续向下面寻找,看到这么一段:
<h1 class="QuestionHeader-title">你必讲的笑话是哪个?</h1>
直接使用正则匹配即可,正则匹配规则为:
<h1\sclass=\"QuestionHeader-title\">([\s\S]+?)<\/h1>
知乎专栏文章页的title提取与封面图片提取
首先看一下源代码
<title>智能闹钟音箱能给自己的商业世界打开一扇窗吗? - 知乎</title><title>知乎 - 有问题上知乎</title>
中间部分源代码省略了。其中有2个title,直接使用正则匹配时,只能匹配到第2个title——“知乎 - 有问题上知乎”,所有页都是这个。
再继续向下面寻找,看到这么一段:
<header class="Post-Header"><h1 class="Post-Title">智能闹钟音箱能给自己的商业世界打开一扇窗吗?</h1>
使用正则匹配也匹配不到。可能是因为知乎专栏页的数据是使用js加载的,网页源代码初始代码中不含有这些数据。
稍微看看知乎专栏网页代码可以发现,如果在浏览器中访问类似这样的专栏文章链接:
https://zhuanlan.zhihu.com/p/42557513
实际会加载下面的文章内容数据 API 链接,知乎专栏页面加载完数据之后才会显示:
https://zhuanlan.zhihu.com/api/posts/42557513
而且返回的数据就是json格式的,可以直接转换为PHP数组,然后根据数组的key值,直接获取需要的字段,然后即可使用。
扩展其他知乎相关页的爬虫抓取
后面的参考链接中里面有一句话说的好:
不管AngularJS还是其它架构,都是服务端的东西,再天花乱坠的服务端架构,到了客户端终究逃不脱HTTP协议,至少目前来说还是如此。
知道用户ID之后可以相机获取:
- 获得用户专栏入口
- 获得专栏文章信息
- 获得专栏文章
参考链接:https://www.zhihu.com/question/24948369/answer/29611724
小结
使用以上各种方法,基本可以解决与知乎相关内容的爬虫爬取相关的问题。
另一篇参考文章:简单PHP实现Pocket抓取知乎专栏文章