基于 asyncio 的异步爬虫框架,有兴趣来看看

2018-09-10 08:49:15 +08:00
 xiaozizayang

轻量异步爬虫框架 aspider ,基于 asyncio

介绍

对于单页面,只要实现框架定义的 Item 就好:

import asyncio

from aspider import AttrField, TextField, Item


class HackerNewsItem(Item):
    target_item = TextField(css_select='tr.athing')
    title = TextField(css_select='a.storylink')
    url = AttrField(css_select='a.storylink', attr='href')

    async def clean_title(self, value):
        return value


items = asyncio.get_event_loop().run_until_complete(HackerNewsItem.get_items(url="https://news.ycombinator.com/"))
for item in items:
    print(item.title, item.url)

Notorious ‘ Hijack Factory ’ Shunned from Web https://krebsonsecurity.com/2018/07/notorious-hijack-factory-shunned-from-web/
 ......

对于多页面的网站,使用 Spider 即可:

import aiofiles

from aspider import AttrField, TextField, Item, Spider


class HackerNewsItem(Item):
    target_item = TextField(css_select='tr.athing')
    title = TextField(css_select='a.storylink')
    url = AttrField(css_select='a.storylink', attr='href')

    async def clean_title(self, value):
        return value


class HackerNewsSpider(Spider):
    start_urls = ['https://news.ycombinator.com/', 'https://news.ycombinator.com/news?p=2']

    async def parse(self, res):
        items = await HackerNewsItem.get_items(html=res.html)
        for item in items:
            async with aiofiles.open('./hacker_news.txt', 'a') as f:
                await f.write(item.title + '\n')


if __name__ == '__main__':
    HackerNewsSpider.start()
[2018-07-11 17:50:12,430]-aspider-INFO  Spider started!
[2018-07-11 17:50:12,430]-Request-INFO  <GET: https://news.ycombinator.com/>
[2018-07-11 17:50:12,456]-Request-INFO  <GET: https://news.ycombinator.com/news?p=2>
[2018-07-11 17:50:14,785]-aspider-INFO  Time usage: 0:00:02.355062
[2018-07-11 17:50:14,785]-aspider-INFO  Spider finished!

同样支持 js 加载:

request = Request("https://www.jianshu.com/", load_js=True)
response = asyncio.get_event_loop().run_until_complete(request.fetch())
print(response.body)

在 Item 以及 Spider 中要是想加载 js,同样只要带上 load_js=True 即可

项目 Github 地址:aspider

5481 次点击
所在节点    Python
32 条回复
jy02201949
2018-09-10 09:12:11 +08:00
支持 js 加载啊,看起来屌屌的
lixuda
2018-09-10 09:13:17 +08:00
收藏下哈
d0m2o08
2018-09-10 09:17:42 +08:00
已 star
xiaozizayang
2018-09-10 09:19:53 +08:00
@d0m2o08 哈哈谢谢
xiaozizayang
2018-09-10 09:20:07 +08:00
@lixuda 谢~
smh2208
2018-09-10 09:27:27 +08:00
已 star, 希望能讲下做一个这样的框架的实现思路是怎样的,想学习一下如何写框架
xiaozizayang
2018-09-10 09:29:41 +08:00
@smh2208 有兴趣可以看看源码一起开发
aneureka
2018-09-10 10:02:39 +08:00
楼主有开个讨论群吗☺
xiaozizayang
2018-09-10 10:03:50 +08:00
@aneureka 有问题可邮件或者 issue
hzm0318hzm
2018-09-10 11:28:52 +08:00
最近在学 py,有空看看先 star 了
xiaozizayang
2018-09-10 11:37:13 +08:00
@hzm0318hzm 共同学习
sugarguo
2018-09-10 15:16:43 +08:00
提个小 bug

文档里面的 spider 部分,res 没有 html,那个应该是 body,example 里面是对的
xiaozizayang
2018-09-10 15:51:40 +08:00
@sugarguo 已经改了 感谢
beforeuwait
2018-09-10 16:50:53 +08:00
能支持 js,这个屌屌哒
kuokyong
2018-09-10 17:56:06 +08:00
有兴趣可以看我的项目。https://github.com/kkyon/botflow
封装了 asyncio 细节。
Botflow is a Python Fast Data driven programming framework for Data pipeline work( Web Crawler,Machine Learning,Quantitative Trading.etc) http://docs.botflow.org/
smh2208
2018-09-10 18:06:04 +08:00
@xiaozizayang 好的
xiaozizayang
2018-09-10 18:10:42 +08:00
@kuokyong 好的大佬 我看看
zeromake
2018-09-10 20:13:45 +08:00
为啥我看代码排版是坨屎啊,不扯淡了,我工作还没找到合适的呢,你啥时候准备从那个公司溜啊。
hwywhywl
2018-09-11 22:01:13 +08:00
@xiaozizayang window 平台下报错
Traceback (most recent call last):
File "weibospider.py", line 26, in <module>
HackerNewsSpider.start()
File "C:\Users\hwywhywl\StudioProjects\weibo_splider\lib\site-packages\aspider\spider.py", line 92, in start
spider_ins.loop.add_signal_handler(_signal, lambda: asyncio.ensure_future(spider_ins.stop(_signal)))
File "C:\Users\hwywhywl\Anaconda3\lib\asyncio\events.py", line 499, in add_signal_handler
raise NotImplementedError
NotImplementedError

ioloop.add_signal_handler 在 window 下不支持,判断一下吧
xiaozizayang
2018-09-12 08:16:34 +08:00
@hwywhywl 收到 谢谢 我来修复哈

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

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

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

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

© 2021 V2EX