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 相关文章推荐
python基础教程之python消息摘要算法使用示例
Feb 10 Python
Python3基础之基本数据类型概述
Aug 13 Python
详解用python实现简单的遗传算法
Jan 02 Python
Python多重继承的方法解析执行顺序实例分析
May 26 Python
Python如何发布程序的详细教程
Oct 09 Python
Python操作json的方法实例分析
Dec 06 Python
Python设计模式之建造者模式实例详解
Jan 17 Python
python实现剪切功能
Jan 23 Python
利用anaconda作为python的依赖库管理方法
Aug 13 Python
Python操作redis和mongoDB的方法
Dec 19 Python
python实现学生信息管理系统源码
Feb 22 Python
python创建字典及相关管理操作
Apr 13 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
同时提取多条新闻中的文本一例
2006/10/09 PHP
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
php定时执行任务设置详解
2015/02/06 PHP
两个DIV等高的JS的实现代码
2007/12/23 Javascript
js 目录列举函数
2008/11/06 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
2017/06/12 jQuery
angular select 默认值设置方法
2017/06/23 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
建筑工程实习自我鉴定
2013/09/19 职场文书
医药工作岗位求职信分享
2013/12/31 职场文书
十佳青年个人事迹材料
2014/01/28 职场文书
党风廉政承诺书
2014/03/27 职场文书
经验交流材料格式
2014/12/30 职场文书
行政处罚事先告知书
2015/07/01 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书
帮你提高开发效率的JavaScript20个技巧
2021/06/18 Javascript
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang
《Estab Life》4月6日播出 正式PV、主视觉图公开
2022/03/20 日漫
python中mongodb包操作数据库
2022/04/19 Python