资讯专栏INFORMATION COLUMN

Python爬虫之使用celery加速爬虫

baihe / 3397人阅读

摘要:是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。本文将介绍如何使用来加速爬虫。本文爬虫的例子来自文章爬虫的种姿势。虽然没有这个爬虫框架和异步框架来的快,但这也可以作为一种爬虫的思路。

  celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。关于celery的更多介绍及例子,笔者可以参考文章Python之celery的简介与使用。
  本文将介绍如何使用celery来加速爬虫。
  本文爬虫的例子来自文章:Python爬虫的N种姿势。这里不再过多介绍,我们的项目结构如下:

其中,app_test.py为主程序,其代码如下:

from celery import Celery

app = Celery("proj", include=["proj.tasks"])
app.config_from_object("proj.celeryconfig")

if __name__ == "__main__":
    app.start()

tasks.py为任务函数,代码如下:

import re
import requests
from celery import group
from proj.app_test import app

@app.task(trail=True)
# 并行调用任务
def get_content(urls):
    return group(C.s(url) for url in urls)()

@app.task(trail=True)
def C(url):
    return parser.delay(url)

@app.task(trail=True)
# 获取每个网页的name和description
def parser(url):
    req = requests.get(url)
    html = req.text
    try:
        name = re.findall(r"(.+?)", html)[0]
        desc = re.findall(r"(.+?)", html)[0]
        if name is not None and desc is not None:
            return name, desc
    except Exception as  err:
        return "", ""

celeryconfig.py为celery的配置文件,代码如下:

BROKER_URL = "redis://localhost" # 使用Redis作为消息代理

CELERY_RESULT_BACKEND = "redis://localhost:6379/0" # 把任务结果存在了Redis

CELERY_TASK_SERIALIZER = "msgpack" # 任务序列化和反序列化使用msgpack方案

CELERY_RESULT_SERIALIZER = "json" # 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON

CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 任务过期时间

CELERY_ACCEPT_CONTENT = ["json", "msgpack"] # 指定接受的内容类型

最后是我们的爬虫文件,scrapy.py,代码如下:

import time
import requests
from bs4 import BeautifulSoup
from proj.tasks import get_content

t1 = time.time()

url = "http://www.wikidata.org/w/index.php?title=Special:WhatLinksHere/Q5&limit=500&from=0"
# 请求头部
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, 
            like Gecko) Chrome/67.0.3396.87 Safari/537.36"}
# 发送HTTP请求
req = requests.get(url, headers=headers)
# 解析网页
soup = BeautifulSoup(req.text, "lxml")
# 找到name和Description所在的记录
human_list = soup.find(id="mw-whatlinkshere-list")("li")

urls = []
# 获取网址
for human in human_list:
    url = human.find("a")["href"]
    urls.append("https://www.wikidata.org"+url)

#print(urls)

# 调用get_content函数,并获取爬虫结果
result = get_content.delay(urls)

res = [v for v in result.collect()]

for r in res:
    if isinstance(r[1], list) and isinstance(r[1][0], str):
        print(r[1])


t2 = time.time() # 结束时间
print("耗时:%s" % (t2 - t1))

  在后台启动redis,并切换至proj项目所在目录,运行命令:

celery -A proj.app_test worker -l info

输出结果如下(只显示最后几行的输出):

......
["Antoine de Saint-Exupery", "French writer and aviator"]
["", ""]
["Sir John Barrow, 1st Baronet", "English statesman"]
["Amy Johnson", "pioneering English aviator"]
["Mike Oldfield", "English musician, multi-instrumentalist"]
["Willoughby Newton", "politician from Virginia, USA"]
["Mack Wilberg", "American conductor"]
耗时:80.05160284042358

在rdm中查看数据,如下:

  在文章Python爬虫的N种姿势中,我们已经知道,如果用一般的方法来实现这个爬虫,耗时大约为725秒,而我们使用celery,一共耗时约80秒,大概相当于一般方法的九分之一。虽然没有scrapy这个爬虫框架和异步框架aiohttp, asyncio来的快,但这也可以作为一种爬虫的思路。
  本次分享到此结束,感谢阅读~
注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43138.html

相关文章

  • 基于Celery的分布式爬虫管理平台: Crawlab

    摘要:基于的爬虫分布式爬虫管理平台,支持多种编程语言以及多种爬虫框架。后台程序会自动发现这些爬虫项目并储存到数据库中。每一个节点需要启动应用来支持爬虫部署。任务将以环境变量的形式存在于爬虫任务运行的进程中,并以此来关联抓取数据。 Crawlab 基于Celery的爬虫分布式爬虫管理平台,支持多种编程语言以及多种爬虫框架。 Github: https://github.com/tikazyq/...

    legendaryedu 评论0 收藏0
  • 手把手教你如何用Crawlab构建技术文章聚合平台(一)

    摘要:本文将介绍如何使用和抓取主流的技术博客文章,然后用搭建一个小型的技术文章聚合平台。是谷歌开源的基于和的自动化测试工具,可以很方便的让程序模拟用户的操作,对浏览器进行程序化控制。相对于,是新的开源项目,而且是谷歌开发,可以使用很多新的特性。 背景 说到爬虫,大多数程序员想到的是scrapy这样受人欢迎的框架。scrapy的确不错,而且有很强大的生态圈,有gerapy等优秀的可视化界面。但...

    LinkedME2016 评论0 收藏0
  • 手把手教你如何用Crawlab构建技术文章聚合平台(一)

    摘要:本文将介绍如何使用和抓取主流的技术博客文章,然后用搭建一个小型的技术文章聚合平台。是谷歌开源的基于和的自动化测试工具,可以很方便的让程序模拟用户的操作,对浏览器进行程序化控制。相对于,是新的开源项目,而且是谷歌开发,可以使用很多新的特性。 背景 说到爬虫,大多数程序员想到的是scrapy这样受人欢迎的框架。scrapy的确不错,而且有很强大的生态圈,有gerapy等优秀的可视化界面。但...

    Jeffrrey 评论0 收藏0
  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • 如何构建一个分布式爬虫:基础篇

    摘要:继上篇我们谈论了的基本知识后,本篇继续讲解如何一步步使用构建分布式爬虫。到此,我们就实现了一个很基础的分布式网络爬虫,但是它还不具有很好的扩展性,而且貌似太简单了下一篇我将以微博数据采集为例来演示如何构建一个稳健的分布式网络爬虫。 继上篇我们谈论了Celery的基本知识后,本篇继续讲解如何一步步使用Celery构建分布式爬虫。这次我们抓取的对象定为celery官方文档。 首先,我们新建...

    ssshooter 评论0 收藏0

发表评论

0条评论

baihe

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<