前言
说到爬取文章啥的, 最好使的肯定是python, python中有很多爬虫库可供我们使用, 方便快捷, 虽然工具很多, 但是大同小异, 我们只需要用好一个库就够了
接下来以掘金为例, 给大家演示一下如何爬取网站中的文章:
网站结构分析
调出浏览器控制台, 通过分析, 我们发现掘金和简书不同, 其网站中的文章链接全部都是通过接口动态请求的, 而非以Nginx
容器静态存放
由于我们需要获取多篇文章,而不是单篇, 所以文章链接我们必须先拿到手, 然后再根据链接挨个将文章爬出来
文章链接获取
在推荐一栏通过上拉加载我们很轻松就能获取到请求的接口和参数, 我们只需要将其拷贝出来用python
模拟请求即可
请求接口:
1 | https://api.juejin.cn/recommend_api/v1/article/recommend_cate_feed?aid=xxx&uuid=xxx |
请求参数:
1 | {"id_type":2,"sort_type":200,"cate_id":"6809637769959178254","cursor":"1","limit":20} |
其中cursor
字段表示页数, 我们可以循环递增这个字段的值来源源不断地获取数据
响应数据:
这个article_id
就是我们需要获取的值, 将这个值和https://juejin.cn/post/
进行拼接就得到了文章的实际地址, 如下:
1 | https://juejin.cn/post/7016520448204603423 |
好了, 分析完毕后, 直接上代码实现:
1 | # coding:utf-8 |
执行该代码前先在同级目录下新建一个temp_juejin.txt
文件, 用于存放获取到的所有文章链接, 对于初学者, 这里需要注意的是json
的转换处理和请求头的设置, 如果没有使用json.dumps
进行转换, 那么请求会失败, 如果请求头不加Content-type
和accept
或者没填对, 请求正常但是返回的不是正常的数据, 这一块是很多人极易忽视的地方
代码运行后爬取的结果如下:
好了, 有了文章链接, 下一步我们就开始挨个文章的爬取
文章爬取
爬虫框架, 我这里使用的是PyQuery
, 关于PyQuery
的用法, 可参见《Python爬虫框架之PyQuery的使用》
接下来我们爬取文章的标题和内容, 代码如下:
1 | # -*- coding:utf-8 -*- |
但是打印结果全部为None
, 去控台一查发现掘金文章页面内容是通过js
动态渲染的, 如果直接获取html
是无法通过PyQuery
获取到我们想要的内容的, 那这咋办?
想一下, 如果我们能拿到渲染完成后的html
, 然后再通过PyQuery
进行查找, 不就完事了
问题在于如何获取到渲染完成后的页面源码, 单纯的Get
请求肯定是不行的, 我们需要模拟浏览器渲染才行,
这个时候我们就需要用到一个Web
自动化框架, 也就是大名鼎鼎的selenium
, 它可以模拟真实的浏览器访问和查找甚至是点击操作, 这里我们只需要利用它得到页面源码即可, 关于selenium
的详细使用, 可参见《Web自动化框架selenium的介绍与使用》
于是代码修改成如下模样:
1 | # -*- coding:utf-8 -*- |
该代码运行的前提是需要安装谷歌浏览器
运行时如果提示This version of ChromeDriver only supports Chrome version
, 那么说明浏览器版本和驱动版本不一致, 需要下载与浏览器相匹配的驱动
查看谷歌浏览器版本:
然后下载驱动:
将下载的驱动解压到以下目录:
1 | Win:复制webdriver到Python安装目录下 |
至此, 我们成功爬取到指定文章地址的标题和内容
既然获取到了想要的数据, 那么接下来你可以考虑将其存放到本地, 或者上传到你的wordpress
关于wordpress
文章的上传,可参考文章《如何将python采集到的文章保存到wordpress》
文章上传到wordpress
秉着善始善终的原则, 以上面的代码为例给大家补充上上传wordpress
后的最终代码:
1 | # -*- coding:utf-8 -*- |
只要将域名, 用户名和密码替换成你自己的就行
注意wordpress_xmlrpc
库的安装:
1 | pip install python-wordpress-xmlrpc |
补充
另外 上面获取文章链接环节也可以直接使用selenium
进行获取, 虽然不如调接口来的快, 但是碰上接口被加密的情况, 那么selenium
的方式能快速解决
本文为作者原创转载时请注明出处 谢谢