python抓取头条文章

最近做了个项目,希望把运营同学在今日头条上发的文章自动发布到公司的官方博客中去,然后可以人工筛选需要发布的文章~

很明显,要实现这功能,就需要程序自动抓取头条号发布过的文章(文本、图片、视频等元素),然后插入到博客后台的数据库。

单说爬虫,分定向爬虫和全网爬虫。除了搜索引擎会使用全网爬虫,大部分自己写的爬虫都是定向爬虫,比如抓取豆瓣电影数据,抓取youtube视频,或者今天要说的抓取头条文章等。

因为python有很多专门实现爬虫的库,比如urllib,requests,scrapy,grab等,所以首选python进行抓取。

1、寻找url规律

这里我找了个头条号主页:http://www.toutiao.com/c/user/6493820122/#mid=6493820122,通过浏览器中请求,发现页面数据是异步加载的,如下:

打开这个请求,并去掉无用参数,得出如下api地址:

http://www.toutiao.com/c/user/article/?page_type=1&user_id=6493820122&max_behot_time=0&count=20

参数说明:

page_type: 文章类型,1应该是图文类型,0代表视频类型;

user_id: 这个不用说,是头条号的唯一标识;

max_behot_time: 获取下一页数据的标识时间戳,0代表获取第一页数据,时间戳值就代表获取这条数据以后的数据;

count: 每页返回多少条,默认20条;

url规律已经找到,获取下一页数据,只需修改max_behot_time的值即可~

2、模拟请求,获取数据

模拟请求方式比较多,我这里就直接用requests了,如下:

url = 'http://www.toutiao.com/c/user/article/?page_type=1&user_id=6820944107&max_behot_time=%d&count=20' % max_behot_time
result = requests.get(url)
text = json.loads(result.text)

json数据很好处理,直接获取,入库即可。问题是这个列表数据只返回了title,time等字段,并没有返回文章详细内容,标签等元素。所以还要再进入详情页,获取详细内容。

3、处理返回数据 & 入库

详情页数据返回后,你会发现返回结果是HTML,这就和上面直接返回json数据的处理方式不一样了,获取HTML中的元素内容,常见的方法是使用xpath进行匹配,但我们明显是要获取整个页面中包含HTML元素的文章内容,显然xpath很难做到这点儿。

好吧,换一个提取数据的Python库吧——BeautifulSoup,写法比较像jquery选取节点,非常实用。

url = 'http://www.toutiao.com%s' % r['source_url']
result = requests.get(url)
text = result.content
soup = BeautifulSoup(text)
article = soup.find(attrs={'class', 'article-content'})
article = article.contents[0]
article = article.encode('utf-8')

labels = soup.find_all(attrs={'class', 'label-item'})

find()方法返回一条匹配数据,find_all()则返回所有匹配结果,然后写入mongo:

db.toutiao.update({"_id": id, {"$set": {"article": article, ...}})

4、写个定时任务或者手动触发

以上代码虽然实现了抓取数据并入库,但是,需要每次执行脚本才能抓取,如果你有时间,建议写个定时任务,或者在管理后台上添加“一键抓取”的按钮来触发:

while True:
    current_time = time.localtime(time.time())
    if (current_time.tm_hour == 6) and (current_time.tm_min == 0):
        print "================ 开始执行脚本: ================"
        spider_article()
    time.sleep(1)

当然,如果你抓取的内容比较多,你也可以创建集群进行爬取~以上也并没有写下载图片和视频的功能,感兴趣的同学,私下讨论~

原文发布于微信公众号 - 知晓程序员(bainaweb)

原文发表时间:2017-08-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯社交用户体验设计

移动H5前端性能优化指南 - 腾讯ISUX

1641
来自专栏腾讯NEXT学位

React 16 加载性能优化指南(上)

公司的新项目迁移到了 React 16 和 Webpack 4.0,写一篇文章来总结一下。

1123
来自专栏lestat's blog

关于vue中$nextTick的一点使用心得

当下公司在做一个媒体门户网站,后台由另一家公司使用java开发并提供接口,本人负责开发后台页面,使用的是vue-element-admin开发 下面说一下问题场...

4488
来自专栏非著名程序员

Android开发框架之KJFrameForAndroid

KJFrameForAndroid 又叫KJLibrary,是一个android的orm 和 ioc 框架。同时封装了android中的Bitmap与Http...

17210
来自专栏前端黑板报

插件化思维

用过构建工具的同学都知道,grunt, webpack, gulp 都支持插件开发。后端框架比如 egg koa 都支持插件机制拓展,前端页面也有许多可拓展性的...

1142
来自专栏腾讯IVWEB团队的专栏

React + Redux 组件化方案

在介绍组件化方案之前,先对 react 和 redux 做一个简单介绍。理想中的组件化,第一步应该就是组件的标签化, 例如有一个 Header 组件,无需关注...

5930
来自专栏腾讯大讲堂的专栏

移动H5前端性能优化指南

移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用 2. 在Mobile侧我们提出三秒种渲染完成首屏指标 3. 基于第二点,首屏加载3秒...

4296
来自专栏前端知识分享

第136天:Web前端面试题总结(理论)

  a. 请求数量:合并脚本和样式表,CSS Sprites,拆分初始化负载,划分主域

972
来自专栏IMWeb前端团队

React + Redux 组件化方案

React + Redux 组件化方案 在介绍组件化方案之前,先对 react 和 redux 做一个简单介绍。 Why React 理想中的组件化,第一步应该...

1978
来自专栏web前端教室

实际演示,怎么搞一个demo的业务逻辑、需求分析?

今天是周日,今天晚上20:00的时候,咱们进行了每周日都会有的先行者视频直播课程,主要内容是,通过一个实例,怎么去分析它的需求、设计它的js的结构。

912

扫码关注云+社区