设为首页 收藏本站
查看: 1121|回复: 0

[经验分享] Python 简易抓取界面

[复制链接]

尚未签到

发表于 2017-4-27 12:25:47 | 显示全部楼层 |阅读模式
初学Python,参考相关资料做了个简易抓取网页界面,主要为了增加对python的熟识度。主要是通过urllib2获取预先指定的地址的页面,通过BeautifulSoup来解析界面元素,找到href标签,并将相关的数据存入数据库,以方便后面取出继续抓取。整个抓取和解析也是基于多线程与队列来控制的。做的比较简单与粗糙,后续深入可以改进。


import DBHelper
import CodeHelper
import urllib2
from bs4 import BeautifulSoup
import threading as thread
import Queue
import time
class Resource:
def __init__(self, url, text, content, status):
self._url = url
self._text = text
self._content = content
self._status = status
def insert(self):
dbHelper = DBHelper.DBHelper()
sql = 'select * from resource where url=%s'
data = dbHelper.read(sql, [self._url])
if data is not None :
return
sql = 'insert into resource(url,text,content,status) values(%s,%s,%s,%s)'
print 'url: %s content: %s status: %s' %(self._url, self._text, self._content, self._status)
dbHelper.execute(sql, [self._url, self._text, self._content, self._status]);
dbHelper.commint()
dbHelper.close()
def updateStatus(self):
dbHelper = DBHelper.DBHelper()
sql = 'update resource set status=%s where url=%s'
dbHelper.execute(sql, [self._status, self._url]);
dbHelper.commint()
dbHelper.close()
def updateContentAndStatus(self):
dbHelper = DBHelper.DBHelper()
sql = 'update resource set content=%s,status=%s where url=%s'
dbHelper.execute(sql, [self._content, self._status, self._url]);
dbHelper.commint()
dbHelper.close()
def readListByStatus(self):
dbHelper = DBHelper.DBHelper()
sql = 'select * from resource where status=%s'
return dbHelper.readList(sql, [self._status]);
def readList(self):
dbHelper = DBHelper.DBHelper()
return dbHelper.readList('select * from resource');
class ResourceThread(thread.Thread):
def __init__(self, task_queue):
thread.Thread.__init__(self)
self._task_queue = task_queue
self.setDaemon(True)
self.start()
def run(self):
print 'current thread name %s' %thread.currentThread().name
while True :
try :
func, args = self._task_queue.get(block = False)
func(args)
self._task_queue.task_done()
except Exception,e :
print str(e)
break
class ResourceManager:
def __init__(self, taskNum = 10, threadNum = 2) :
self._task_queue = Queue.Queue()
self._threads = []
self.__init__task_queue__(taskNum)
self.__init__thread_pool(threadNum)
def __init__task_queue__(self, taskNum) :
for i in range(taskNum) :
print 'this is %s task' %i
self.add_task(do_task, i)
def __init__thread_pool(self, threadNum) :
for i in range(threadNum) :
print 'threadNum %s' %i
resourceThread = ResourceThread(self._task_queue)
self._threads.append(resourceThread)
def add_task(self, func, *args) :
self._task_queue.put((func, args))
def check_queue(self):
return self._task_queue.qsize()
def wait_for_complete(self) :
for thread_item in self._threads :
if thread_item.isAlive() :
thread_item.join()
def do_task(args):
print 'this task args %s' %args
resource = Resource(None, None, None, 0)
data = resource.readListByStatus()
print 'read status 0 data is %s' %data
if data is None :
return
for item in data :
url = item[1]
if url is None or url.find('http://') == -1 :
continue
content = urllib2.urlopen(url).read()
html = BeautifulSoup(content)
fetch_resource = Resource(url, None, str(html.find('body'))[0:9999], 1)
fetch_resource.updateContentAndStatus()
aLinks = html.find_all('a')
print 'aLinks %s' %aLinks
for aLink in aLinks :
href = aLink.get('href')
a_text = CodeHelper.encodeContent(aLink.get_text())
print 'href %s text %s' %(href, a_text)
subResource = Resource(href, a_text, '', 0)
subResource.insert()
def execute():
urls = ['http://www.kuwo.cn', 'http://www.1ting.com/', 'http://www.kugou.com/', 'http://y.qq.com/']
for url in urls :
resource = Resource(url, None, 0)
resource.insert()
start = time.time()
resource_manager =  ResourceManager(20, 4)
resource_manager.wait_for_complete()
end = time.time()
print "cost all time: %s" % (end-start)
if __name__ == '__main__':
execute()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370006-1-1.html 上篇帖子: MMSEG的python实现 下篇帖子: Python基础笔记二
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表