专栏首页微信小程序开发python抓取头条文章

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)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微信小程序开发常见问题(二)

    知晓程序员,专注微信小程序开发的程序员! 今天再给大家分享几个微信小程序开发的常见问题,顺便吐槽一下,武汉的冬天太TM冷了,没有暖气的冬天真的很难过,写文章的心...

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

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

    连胜
  • Mac好工具Spectacle推荐

    Spectacle 是一个窗口管理快捷键程序,为当前窗口居中全屏上下左右半屏四分之一屏等等设定快捷键。免费实用,相比之前用的moom,更喜欢Spectacle。...

    连胜
  • linux 最大硬盘占用

    葫芦
  • 从原理到代码,轻松深入逻辑回归模型!

    【导语】学习逻辑回归模型,今天的内容轻松带你从0到100!阿里巴巴达摩院算法专家、阿里巴巴技术发展专家、阿里巴巴数据架构师联合撰写,从技术原理、算法和工程实践3...

    AI科技大本营
  • 《统计学习方法》极简笔记P6:逻辑回归算法推导

    另:事件发生概率为p,则该事件的几率(odds)为p/(1-p),对数几率为logit(p)=log(p/1-p) 所以

    统计学家
  • 移动前端开发之viewport的深入理解

    在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta...

    前朝楚水
  • 20190709

    今天在写Springboot项目时,连接MySql时出现个错误,控制台输出::The server time zone value '�й���׼ʱ��' is...

    用户1956326
  • StatefulWidget与State

    首先来看下StatefulWidget,它是一个抽象类,当然它十分的简单。它和StatelessWidget一样它只有两个方法,都有一个createElemen...

    flyou
  • Win7 64bit安装Oracle 10g Server的报错

    今天一名新员工问在win7 64bit安装Oracle 10g Server时第一步就报错的问题。

    bisal

扫码关注云+社区

领取腾讯云代金券