Toapi - 让任何一个网站提供 API 接口.

2017-12-03 23:22:35 +08:00
 prasanta

Github: https://github.com/gaojiuli/toapi

Toapi

这个项目的意义在于让一个没有提供 API 的网站拥有 API 接口。

安装

使用

from pprint import pprint

from toapi import XPath, Item, Api

api = Api('https://news.ycombinator.com/')

class Post(Item):
    url = XPath('//a[@class="storylink"][1]/@href')
    title = XPath('//a[@class="storylink"][1]/text()')

    class Meta:
        source = XPath('//tr[@class="athing"]')
        route = '/'

api.register(Post)

pprint(api.parse('/'))

api.serve()

然后你就让一个网站提供了 api 服务。 那些没有 api 的网站,就让我们自己给他们弄上 api 接口!

Github: https://github.com/gaojiuli/toapi

11146 次点击
所在节点    Python
44 条回复
580a388da131
2017-12-03 23:27:35 +08:00
很好玩 一只只的小爬虫么
q8515620
2017-12-03 23:31:50 +08:00
想法不错,赞
prasanta
2017-12-03 23:35:51 +08:00
@580a388da131 和爬虫有点像,只不过不爬数据,做中间转发的感觉
wzw
2017-12-03 23:39:03 +08:00
有点意思, 任何网站?
Zzzzzzzzz
2017-12-03 23:40:12 +08:00
yahoo 有个 yql.....
prasanta
2017-12-03 23:46:15 +08:00
@wzw 浏览器能访问的网站就行,原理就是把 html 按照一定规则转为 json。
prasanta
2017-12-03 23:49:28 +08:00
@Zzzzzzzzz 酷,我就打算做这种感觉的东西。又孤陋寡闻了。Yahoo 这个能在本地部署不
mlyy
2017-12-03 23:53:08 +08:00
idea 点赞!快速看了下代码,这个玩意如何处理 ajax 请求得到的数据?还有,requests 的请求头,user-agent 要怎么写也是个蛋疼的问题。。。。。。
LeungJZ
2017-12-04 00:08:18 +08:00
有木有其他版本?
prasanta
2017-12-04 00:17:59 +08:00
@mlyy ajax 用 selenium 处理,这个已经在本地分支写好了。头部这些都能自定义。
prasanta
2017-12-04 00:18:20 +08:00
@LeungJZ 你指的是?
kingcos
2017-12-04 00:18:33 +08:00
酷! Star,有机会研究下
fy
2017-12-04 00:22:14 +08:00
羡慕有想法又有行动力的大佬
xiaozizayang
2017-12-04 07:59:17 +08:00
我也有这个想法 但随后又想 这就是一个小爬虫框架啊 就没弄 支持楼主 想去贡献下😍😍
renyijiu
2017-12-04 09:06:31 +08:00
Star,想法挺有意思的
prasanta
2017-12-04 09:40:20 +08:00
@xiaozizayang 有一个问题没有解决,就是 XPath 选择出来的结果是一个 list, 但是期望的是一个字符串.
virusdefender
2017-12-04 09:43:05 +08:00
这种写法不错
widewing
2017-12-04 09:56:03 +08:00
api 格式可以自定义吗?
xiaozizayang
2017-12-04 10:20:40 +08:00
@prasanta 抱歉 ,刚看到,我没用 xpath 不过我发现 cssselector 也有这个问题 我已经解决了并提交 pr,我还提交了一些参数的优化 比如 requests 的 get 支持 headers,flask 的一些 options 参数传递问题,新增加了一个用 css 提取写的豆瓣 demo
![]( http://oe7yjec8x.bkt.clouddn.com/howie/2017-12-04-00.png-blog.howie)
xiaozizayang
2017-12-04 10:24:42 +08:00
关于 xpath 的解决方式,我另一个项目和你这个项目的目标值提取方式很像,我当时的解决方式是让使用者自己定义一个函数在 Item 的继承类里面,比如
``` python
from talonspider import Item, TextField, AttrField
from pprint import pprint

try:
bool(type(unicode))
except NameError:
unicode = str


class DoubanItem(Item):
target_item = TextField(css_select='div.item')
title = TextField(css_select='span.title')
cover = AttrField(css_select='div.pic>a>img', attr='src')
abstract = TextField(css_select='span.inq')

def tal_title(self, title):
# 这里当返回是 list,让使用者在自己定义的这个函数里解决
if isinstance(title, unicode):
return title
else:
return ''.join([i.text.strip().replace(u'\xa0', '') for i in title])
```
项目地址 https://github.com/howie6879/talonspider

如果你觉得可以 我们可以改成这样子去解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/411668

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX