python使用rabbitmq实现网络爬虫示例

 更新时间:2014年02月20日 09:47:31   作者:  
这篇文章主要介绍了python使用RabbitMQ实现网络爬虫的示例,需要的朋友可以参考下

编写tasks.py

复制代码 代码如下:

from celery import Celery
from tornado.httpclient import HTTPClient
app = Celery('tasks')
app.config_from_object('celeryconfig')
@app.task
def get_html(url):
    http_client = HTTPClient()
    try:
        response = http_client.fetch(url,follow_redirects=True)
        return response.body
    except httpclient.HTTPError as e:
        return None
    http_client.close()

编写celeryconfig.py

复制代码 代码如下:

CELERY_IMPORTS = ('tasks',)
BROKER_URL = 'amqp://guest@localhost:5672//'
CELERY_RESULT_BACKEND = 'amqp://'

编写spider.py

复制代码 代码如下:

from tasks import get_html
from queue import Queue
from bs4 import BeautifulSoup
from urllib.parse import urlparse,urljoin
import threading
class spider(object):
    def __init__(self):
        self.visited={}
        self.queue=Queue()
    def process_html(self, html):
        pass
        #print(html)
    def _add_links_to_queue(self,url_base,html):
        soup = BeautifulSoup(html)
        links=soup.find_all('a')
        for link in links:
            try:
                url=link['href']
            except:
                pass
            else:
                url_com=urlparse(url)
                if not url_com.netloc:
                    self.queue.put(urljoin(url_base,url))
                else:
                    self.queue.put(url_com.geturl())
    def start(self,url):
        self.queue.put(url)
        for i in range(20):
            t = threading.Thread(target=self._worker)
            t.daemon = True
            t.start()
        self.queue.join()
    def _worker(self):
        while 1:
            url=self.queue.get()
            if url in self.visited:
                continue
            else:
                result=get_html.delay(url)
                try:
                    html=result.get(timeout=5)
                except Exception as e:
                    print(url)
                    print(e)
                self.process_html(html)
                self._add_links_to_queue(url,html)

                self.visited[url]=True
                self.queue.task_done()
s=spider()
s.start("https://www.jb51.net/")

由于html中某些特殊情况的存在,程序还有待完善。

相关文章

  • django中path和url函数的具体使用

    django中path和url函数的具体使用

    本文主要介绍了django中path和url函数的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Python处理日期方法详细大全(30种方法)

    Python处理日期方法详细大全(30种方法)

    这篇文章主要给大家介绍了关于Python处理日期方法详细大全,文中共介绍了30种方法,Python程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能,Python提供了一个time和calendar模块可以用于格式化日期和时间,需要的朋友可以参考下
    2023-12-12
  • python如何构建mock接口服务

    python如何构建mock接口服务

    这篇文章主要介绍了python如何构建mock接口服务,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-01-01
  • Python从入门到精通之环境搭建教程图解

    Python从入门到精通之环境搭建教程图解

    这篇文章主要介绍了Python从入门到精通之环境搭建,需要的朋友可以参考下
    2019-09-09
  • 基于PyQt5制作一个动态指针时钟

    基于PyQt5制作一个动态指针时钟

    这篇文章主要和大家分享如何利用Python中的PyQt5制作一个动态指针时钟来显示实时时间,文中的示例代码讲解详细,需要的可以参考一下
    2022-02-02
  • Python线程之认识线程安全 

    Python线程之认识线程安全 

    这篇文章主要介绍了Python线程之认识线程安全,线程安全,名字就非常直接,在多线程情况下是安全的,多线程操作上的安全,下面学习线程安全的文章详细内容,需要的小伙伴可以参考一下
    2022-02-02
  • python socket网络编程之粘包问题详解

    python socket网络编程之粘包问题详解

    这篇文章主要介绍了python socket网络编程之粘包问题详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Pytest使用logging模块写日志的实例详解

    Pytest使用logging模块写日志的实例详解

    logging是python语言中的一个日志模块,专门用来写日志的,日志级别通常分为debug、info、warning、error、critical几个级别,一般情况下,默认的日志级别为warning,在调试或者测试阶段,下面就快速体验一下logging模块写日志的用法,感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • python常用数据结构字典梳理

    python常用数据结构字典梳理

    这篇文章主要介绍了python常用数据结构字典梳理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Django的用户模块与权限系统的示例代码

    Django的用户模块与权限系统的示例代码

    这篇文章主要介绍了Django的用户模块与权限系统的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论