python yellow page thread crawler

2023-10-09 22:09

本文主要是介绍python yellow page thread crawler,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

把之前的爬虫用python改写了,多线程和队列 来抓取,典型的生产者消费者模式 ,用mvc分层来写的
 
#-*- coding: utf-8 -*-'''
spider.py
Created on 2013-12-21http://www.cn360cn.com/news.aspx?pageno=2
@author: Administrator
'''
import Pager
import Queue
import sys
import time
import threadingtask_queue = Queue.Queue(10)class ProducerThread(threading.Thread):def __init__(self,threadname):threading.Thread.__init__(self)self.name = threadnamedef run(self):for page in xrange(1,50000):url = 'http://www.cn360cn.com/news.aspx?pageno=%d' % pagetask_queue.put(url)print "put %s " % urlclass ConsumerThread(threading.Thread):name = ''url = ''def __init__(self,threadname):threading.Thread.__init__(self)self.name = threadnamedef run(self):while 1:print self.namepage = Pager.Pager()url = task_queue.get()print "get %s " % urltry:page.get_html(url)except Exception as e:print "exception occurred : " , efinally:task_queue.task_done()#控制速度time.sleep(0.5)print "start crawing ...."producer = ProducerThread("crawler producer ....")
producer.setDaemon(True)
producer.start()thread_num = 60
threads = []
for num in xrange(thread_num):print "crawler consumer : %d " % numthreads.append(ConsumerThread("crawler consumer : %d " % num))for num in xrange(thread_num):threads[num].setDaemon(True)threads[num].start()#只到所有任务完成后,才退出主程序
task_queue.join()print "finished ...."
HttpClient.py
# -*- coding:utf-8 -*-import urllib,urllib2class HttpClient:user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36'proxy = ''def __init__(self):urllib2.socket.setdefaulttimeout(8) # timeoutpassdef set_ua(self,user_agent):self.user_agent = user_agentdef set_proxy(self,proxy):self.proxy = proxydef get(self,url,data = {}):headers = { 'User-Agent' : self.user_agent,'Referer': 'http://www.cn360cn.com/','Host':'www.cn360cn.com'}data = urllib.urlencode(data)req = urllib2.Request(url, data, headers)    response = urllib2.urlopen(req)    response = response.read() return responseif __name__ == '__main__':c = HttpClient()print c.get("http://blog.csdn.net/pleasecallmewhy/article/details/8923067")   pager.py
# -*_ coding: utf-8 -*-
'''
Created on 2013-12-21@author: Administrator
'''
import HttpClient
import re
import Daoclass Pager:client = ''dao = ''def __init__(self):self.client = HttpClient.HttpClient()self.dao = Dao.Mysql()passdef get_html(self,url):html = self.client.get(url)#gb2312 to unicode to utf8html = html.decode('gb2312', 'ignore').encode('utf-8')
#        print htmlself.parse_html(html)def parse_html(self,html):page_pattern = re.compile(r'<li>\s*<a.*?>(.*?)<\/a>\s*<div\s+class=tel\s*>\s*电话:(.*?)地址:(.*?)<\/div>\s*<\/li>', re.I | re.M)
#        page_pattern = re.compile(r'<li>\s*<a.*?>(.*?)<\/a>\s*<div\s+class=tel\s*>\s*(.*?)<\/div>\s*<\/li>', re.I | re.M)result =  page_pattern.findall(html)for item in result:
#            print item[0],',',item[1],',',item[2]tag, number, address = item[0],item[1],item[2]number = number.strip()number = number.replace("-", "")tag = tag.strip()address = address.strip()temp = {'tag':tag,'number':number,'address':address}result = self.dao.insert(temp)if __name__ == '__main__':page = Pager()url = 'http://www.cn360cn.com/news.aspx?pageno=2'page.get_html(url)   
Dao.py
'''
Created on 2013-7-20@author: Administrator
'''
import MySQLdb
import config;
import sysclass Mysql:table = 'cn360'conn = ''def __init__(self):self.conn = MySQLdb.connect(host=config.conf['host'], user= config.conf['user'],passwd=config.conf['pwd'],db=config.conf['db'],charset=config.conf['charset'])self.cursor = self.conn.cursor();def insert(self, data):if not data:return Falsesql = "insert ignore into " + self.table + " set "for k, v in enumerate(data):sql += v + "='" + MySQLdb.escape_string(data[v]) + "',"sql = sql.strip(',')
#        print sqlreturn self.execute(sql)def execute(self, sql):if not sql:return Falsetry:self.cursor.execute(sql)self.conn.commit()except:self.conn.rollback();return Falsereturn Truedef get_rows(self, sql):if not sql:return Falseresult = self.execute(sql)if result:return self.cursor.fetchall()return Falsedef update(self, source, filter_array = None):if not source:return Falsesql = "update " + self.table + " set "for k, v in enumerate(source):sql += v + "='" + MySQLdb.escape_string(source[v]) + "',"sql = sql.strip(',')if filter_array:where = ''for k, v in enumerate(filter_array):where += v + "='" + MySQLdb.escape_string(filter_array[v]) + "',"where = where.strip(',')if where:sql += " where " + whereprint sqlreturn self.execute(sql)def delete(self, filter_array = None):if not filter_array:return Falsesql = "delete from " + self.tableif filter_array:where = ''for k, v in enumerate(filter_array):where += v + "='" + MySQLdb.escape_string(filter_array[v]) + "',"where = where.strip(',')if where:sql += " where " + whereprint sqlreturn self.execute(sql)def destroy(self):        self.conn = Noneself.cursor = None


这篇关于python yellow page thread crawler的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/175885

相关文章

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Python从零打造高安全密码管理器

《Python从零打造高安全密码管理器》在数字化时代,每人平均需要管理近百个账号密码,本文将带大家深入剖析一个基于Python的高安全性密码管理器实现方案,感兴趣的小伙伴可以参考一下... 目录一、前言:为什么我们需要专属密码管理器二、系统架构设计2.1 安全加密体系2.2 密码强度策略三、核心功能实现详解

Python Faker库基本用法详解

《PythonFaker库基本用法详解》Faker是一个非常强大的库,适用于生成各种类型的伪随机数据,可以帮助开发者在测试、数据生成、或其他需要随机数据的场景中提高效率,本文给大家介绍PythonF... 目录安装基本用法主要功能示例代码语言和地区生成多条假数据自定义字段小结Faker 是一个 python

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建