一个简单而异步的剪贴库

fodio的Python项目详细描述


什么是fodio?

Fodio是一个网页抓取工具,用于轻松浏览网站和收集数据一些钥匙 fodio的概念是建立在简单性和异步性之上的(不,我不认为这是一个真正的词)。灵感来自 已经不活跃的Demiurge图书馆,福迪奥是来拯救这一天的!

为什么我不使用scrapy?

好问题有一些关键的区别也很重要。

  1. scrapy使用c扩展,这取决于环境,可能会很痛苦!
  2. scrapy不是异步的!
  3. 我想,这更简单。

另外,如果你在linux上,你可以使用uvloop,这将有助于加快速度

安装

要使用pypi安装,只需使用pip install fodio

若要手动安装,请下载并解压缩或克隆此存储库。然后,在当地的根上 存储库,执行python setup.py install

我不擅长这部纪录片,所以让我们马上开始吧。

快速启动

太开始刮,检查元素会是你的朋友。您将在元素中复制css选择器 你希望收获。在本例中,我们将浏览一个github示例,您也可以在演示文件中找到它, 在Fodio github页面上

首先,我们需要做一个项目。然后“项目”将代表页面的一部分。

这也很好,注意,这个例子中没有items作为itemattrs,但是您可以这样做。我真的建议你看看 在demos文件中,因为其中包含了很多关于该做什么的好例子。

classGithubPage(Item):...classMeta:...

注意“meta”类。这也用于保存选择器和根URL信息。在这里,我们想 github用户的真实姓名+描述首先,使用“.h-card”选择器缩小配置文件卡的范围那么, 我们将提供根url“https://github.com

classGithubPage(Item):...classMeta:selector=".h-card"root_url="https://github.com"

没那么糟吧?现在我们有了配置文件卡,我们需要设置一些itemAttributes来提取信息。 我们将使用textatt对象从实名节点提取文本,另一个textatt用于描述

classGithubPage(Item):name=TextAttr(".p-name")desc=TextAttr(".p-note > div:nth-child(1)",raise_not_found=False)classMeta:selector=".h-card"root_url="https://github.com"

注意

注意raise_not_foundkwarg。一些github配置文件没有描述,我们也不希望它太高 如果它们不正确,则对于实名,如果它们有实名,则元素将存在。 不,所以我们得手动检查。

现在时间也到了!为此,我们将创建一个名为runner的异步函数。GithubPage有一个名为 搜索将添加路径的根URL,并获取它。所以让我们这么做吧

accounts=['Zwork101','bukson','torvalds','User1m','random-robbie']asyncdefrunner():result=awaitGithubPage.search(account)print("{account_name}'s real name is {real_name}".format(account_name=account,real_name=result['name']ifresult['name']else"not known"))print('{description}\n'.format(description=('"'+result['desc']+'"')ifresult['desc']else"No Description"))

我们完了添加Asyncio后,也运行它,这是我们的最终产品:

importasynciofromfodioimportItem,TextAttrclassGithubPage(Item):name=TextAttr(".p-name")desc=TextAttr(".p-note > div:nth-child(1)",raise_not_found=False)classMeta:selector=".h-card"root_url="https://github.com"accounts=['Zwork101','bukson','torvalds','User1m','random-robbie']asyncdefrunner():result=awaitGithubPage.search(account)print("{account_name}'s real name is {real_name}".format(account_name=account,real_name=result['name']ifresult['name']else"not known"))print('{description}\n'.format(description=('"'+result['desc']+'"')ifresult['desc']else"No Description"))loop=asyncio.get_event_loop()loop.run_until_complete(runner())

现在还没那么糟吧有关更多示例,请参见demo文件夹。否则,刮吧

wait,但为什么它被称为“fodio”

显然,开发人员喜欢用拉丁语或其他没人用的语言命名他们的项目Fodio(至少 这就是一些网站所说的)可以是“delve”的意思,对所有非英语专业的学生/非魔术的学生来说,delve是一个英语单词:the 聚集玩家。探究意味着研究和挖掘,这个图书馆做的两件事!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
安卓在java中加入字符串组以创建复合字符串   java系统甚至不点击“下一步”或“上一步”按钮就将我返回到上一页,而不是进入下一页   java如何在arrayList中获取特定列的不同值   CXF GZIP REST JAVA   Java:使用大量半恒定标志检查优化循环中的循环?   java如何在两个应用程序之间进行会话管理?   java SVG文件使用蜡染(但没有轴线)转换为PNG   使用协议缓冲区和内部数据模型的java   java如何在logtag 安卓中打印和查看字符串的值   javascript如何在NodeJs中应用Java/Spring的分层架构?   java Spring URL在JSP中编码不正确   模式对话框后面的java工具提示   java WSRPC生成日历对象而不是日期   在对象外部无法识别类变量   java将图像从文件读/写到BuffereImage的最快方法?   JavaSpring数据存储库对具有不同Id的子类使用抽象超类   安全在Java 5.0上运行web应用程序服务器有危险吗?