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


Posted in Python onFebruary 20, 2014

编写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://3water.com/")

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

Python 相关文章推荐
windows下wxPython开发环境安装与配置方法
Jun 28 Python
python实现实时监控文件的方法
Aug 26 Python
Python的时间模块datetime详解
Apr 17 Python
Python中的is和==比较两个对象的两种方法
Sep 06 Python
python中lambda()的用法
Nov 16 Python
答题辅助python代码实现
Jan 16 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
Jun 11 Python
Django缓存系统实现过程解析
Aug 02 Python
通过实例解析Python RPC实现原理及方法
Jul 07 Python
Python远程方法调用实现过程解析
Jul 28 Python
利用python实现后端写网页(flask框架)
Feb 28 Python
Python如何用re模块实现简易tokenizer
May 02 Python
python使用win32com在百度空间插入html元素示例
Feb 20 #Python
python基础教程之类class定义使用方法
Feb 20 #Python
python基础教程之基本内置数据类型介绍
Feb 20 #Python
python实现dict版图遍历示例
Feb 19 #Python
使用python在校内发人人网状态(人人网看状态)
Feb 19 #Python
下载给定网页上图片的方法
Feb 18 #Python
使用python将mdb数据库文件导入postgresql数据库示例
Feb 17 #Python
You might like
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
PHP删除数组中特定元素的两种方法
2013/07/02 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
struts2 jquery 打造无限层次的树
2009/10/23 Javascript
php对mongodb的扩展(初识如故)
2012/11/11 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
python实现excel读写数据
2021/03/02 Python
python3 遍历删除特定后缀名文件的方法
2018/04/23 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
Python坐标线性插值应用实现
2019/11/13 Python
Python中求对数方法总结
2020/03/10 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
最新远光软件笔试题面试题内容
2013/11/08 面试题
毕业生求职的求职信
2013/12/05 职场文书
2014中考励志标语
2014/06/05 职场文书
2014年大学生工作总结
2014/11/20 职场文书
政协委员个人总结
2015/03/03 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android