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 条评论
登录 后参与评论

相关文章

来自专栏老付的网络博客

AMD的规范演化

对于web项目来说,打交道的不仅仅有后台,前台页面也是少不了的,而前台的页面js也常常是我们后台程序员必须要使用的语言, 今天说下项目中的js的组织方式。

1625
来自专栏*坤的Blog

高效搜索

2644
来自专栏Ryan Miao

如何优化coding

如何优化coding 前言 最近一直在做修改bug工作,修改bug花费时间最多的不是如何解决问题而是怎样快速读懂代码。如果代码写的好的,不用debug就可以一眼...

4177
来自专栏JackieZheng

Dubbo源码-从HelloWorld开始

Dubbo简介 Dubbo,相信做后端的同学应该都用过,或者有所耳闻。没错,我就是那个有所耳闻中的一员。 公司在好几年前实现了一套自己的RPC框架,所以也就没有...

3338
来自专栏陈树义

JVM技术周报第2期

JVM技术周报分享JVM技术交流群的讨论内容,由群内成员整理归纳而成。如果你有兴趣入群讨论,请关注「Java技术精选」公众号,通过右下角菜单「入群交流」加我好友...

1012
来自专栏云飞学编程

Python爬虫,用第三方库解决下载网页中文本的问题

还在辛辛苦苦的查找网页规律,写正则或者其他方式去匹配文本内容吗?还在纠结怎么去除小说网站的其他字符吗?

1223
来自专栏zingpLiu

Linux时间命令

Linux一般有系统时间和硬件时间之分,date命令是显示和操作系统时间;hwclock用来操作硬件时间(日期)。日期和时间很重要,比如错误的日期和时间会导致你...

2222
来自专栏PPV课数据科学社区

如何使用Python对Instagram进行数据分析?

我写此文的目的在于展示以编程的方式使用Instagram的基本方法。我的方法可用于数据分析、计算机视觉以及任何你所能想到的酷炫项目中。 Instagram是最大...

2887
来自专栏Golang语言社区

高效网游服务器实现探讨 - jack-wang - C++博客

高效网游服务器实现探讨 随着多核处理器的普及,如何充分利用多核并行工作就成为高性能程序设计的一个重点。本系列文章将围绕高性能网游服务器的实现,探讨这方面的技术。...

38511
来自专栏Golang语言社区

nodejs php go语言了解

1、Nodejs 1) 简单的说 Node.js 就是运行在服务端的 JavaScript。 2) Node.js 是一个基于Chrome JavaScript...

54811

扫码关注云+社区

领取腾讯云代金券