前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python抓取头条文章

python抓取头条文章

作者头像
连胜
发布2018-03-07 10:14:09
2.3K0
发布2018-03-07 10:14:09
举报

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

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

单说爬虫,分定向爬虫和全网爬虫。除了搜索引擎会使用全网爬虫,大部分自己写的爬虫都是定向爬虫,比如抓取豆瓣电影数据,抓取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了,如下:

代码语言:javascript
复制
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选取节点,非常实用。

代码语言:javascript
复制
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:

代码语言:javascript
复制
db.toutiao.update({"_id": id, {"$set": {"article": article, ...}})

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

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

代码语言:javascript
复制
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)

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 知晓程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档