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

相关文章

来自专栏葡萄城控件技术团队

你不可不知的HTML优化技巧

如何提升Web页面的性能,很多开发人员从多个方面来下手如JavaScript、图像优化、服务器配置,文件压缩或是调整CSS。 很显然HTML 已经达到了一个瓶颈...

1886
来自专栏北京马哥教育

数据工程师常用的 Shell 命令

Linux以其强大的命令行称霸江湖,Shell命令是数据极客的必修兵器。探索性数据分析,在需求和数据都不太明确的环境下,使用各种命令进行一次探索与挖掘。从基础的...

2826
来自专栏小樱的经验随笔

XOR算法的原理和实现

XOR算法的原理和实现 XOR算法这种方法的原理 当一个数A和另一个数B进行异或运算会生成另一个数C,如果再将C和B进行异或运算则C又会还原为A。 相对于其他的...

3367
来自专栏微信小程序开发

小程序的登录逻辑能否放在app.js中实现?

前言:做小程序开发的同学,可能都会考虑一个问题,用户登录这个方法是公用的,我们应该把这个方法放在哪里最合适呢? 看到上面的问题后,很大一部分刚入门同学都会直接...

5137
来自专栏信安之路

这些hash你了解吗?

hash大家都不陌生,不同的hash又不一样的特征,今天的主要内容就是带大家一起来学习了解一下不同的hash。

720
来自专栏达观数据

达观数据基于RequireJS的前端模块化设计

伴随着互联网的飞速发展,web中对于前端的要求越来越高,前端的代码的代码量、复杂度与日俱增,带来了诸如前端代码复用率低,难维护等问题。针对这些现有问题,达观科技...

2405
来自专栏WindCoder

当nz-checkbox-group多选框组遇上必选校验

今天表单中用到ng-zorro-antd组件的多选框nz-checkbox-group,最开始用的是响应式表单的验证+响应式表单的验证,结果总是无法达到预期效果...

412
来自专栏日常学python

利用python爬取网易云音乐,并把数据存入mysql

这是我的第四篇原创文章 在简单学习了python爬虫后,又想继续折腾,进而找到了这个网易云音乐,因为本人平时就是用它听的歌,也喜欢看歌里的评论,所以就爬网易云...

95912
来自专栏编程

如何提升Web页面的性能,HTML和css代码优化!

怎么进步Web页面的功用,许多开发人员从多个方面来下手如JavaScript、图画优化、服务器配置,文件压缩或是调整CSS。 很显然HTML 已经达到了一个瓶颈...

2045
来自专栏哲学驱动设计

OEA中的AutoUI重构(1) - Command自动生成

    OEA框架的核心之一是AutoUI,其职责是面向领域模型及UI元模型进行生成统一的界面。     在本次的迭代开发中,需要对命令按钮的生成方式进行一些定...

1708

扫描关注云+社区