python+SQLAlchemy+爬虫

前面分享了SQLAlchemy的知识,这次我共享一下学习用python开发爬虫再把爬出来的数据放到用SQLAlchemy的数据库上面的知识,当然我这个是带测试,后面我和附带用TDD写的测试。

  1. """
  2. 一个简单的豆瓣音乐前250爬虫
  3. Author: Jar.guo email:1418229458@qq.com
  4. Date: 2016-08-27
  5. Language: Python2.7.10
  6.  
  7. """
  8.  
  9. import urllib2
  10. import sys
  11.  
  12. from lxml import html
  13. from MusicORM import Music,MusicORMHelper
  14.  
  15. reload(sys)
  16. sys.setdefaultencoding('utf8')

类的简要说明
    本类主要用于抓取豆瓣图书Top前250的书籍的名称

Attributes:
        cur_url: 用于表示当前争取抓取页面的url
        datas: 存储处理好的抓取到的图书名称

  1. class MusicPicker(object):
  2. def __init__(self):
  3. self.cur_url = "https://music.douban.com/chart"
  4. self.datas = []
    # 储存的数据库
  5. self.db=MusicORMHelper("flaskr.db")
  6. self.db.create_db()
  7.  
  8. print "豆瓣音乐爬虫准备就绪, 准备爬取数据..."

Returns:
            返回抓取到整个页面的HTML(unicode编码)
        Raises:
            URLError:url引发的异常

  1. def Acquire_music_open(self):
  2. try:
  3. html_string = urllib2.urlopen(self.cur_url).read().decode("utf-8")
  4.  
  5. except urllib2.URLError, e:
  6. if hasattr(e, "code"):
  7. print "The server couldn't fulfill the request."
  8. print "Error code: %s" % e.code
  9. elif hasattr(e, "reason"):
  10. print "We failed to reach a server. Please check your url and read the Reason"
  11. print "Reason: %s" % e.reason
  12. return html_string

通过返回的整个网页HTML, 正则匹配前250的书籍名称
        Args:
            content_items: 传入页面的HTML文本进行匹配,这里用的不是正则

  1. def select_music_Content(self, html_string):
  2. tree = html.fromstring(html_string)
  3. content_items = tree.xpath('//a[@href="javascript:;"]/text()')
  4. return content_items

下面是简单的内容处理的问题

  1. def form_music_Content(self, content_items):
  2. top_num = 1
  3. temp_data = []
  4. for index, item in enumerate(content_items):
  5. if (item.find("&nbsp") == -1 and top_num<=10):
  6. temp_data.append("第" + str(top_num) + "名 " + item)
  7. top_num += 1
  8. self.datas.extend(temp_data)
  9. return self.datas

爬虫入口, 并控制爬虫抓取页面的范围

  1. def start_music_spider(self):
  2. my_page = self.Acquire_music_open()
  3. content_items = self.select_music_Content(my_page)
  4. self.form_music_Content(content_items)

这里我们来写一个插入数据库的方法

  1. def exportData(self, music):
  2. return self.db.addmusic(music)

最后我们对前面的进行一下处理

  1. def main():
    print """
    ###############################
    一个简单的豆瓣音乐前250爬虫
    Jar.guo email:1418229458@qq.com
    Date: 2016-08-27
    ###############################
    """
    my_spider = MusicPicker()
    my_spider.start_music_spider()
    # 在这里对爬出来的内容进行迭代并且插入数据库,并且在这里我们把结果打印出来,方便检查爬虫爬出来的内容是不是自己想要的
    for item in my_spider.datas:
    item_unicode = unicode(item)
    my_spider.exportData(Music(item_unicode,item_unicode))
  2.  
  3. print item
  4.  
  5. print "spider is done..."
  1. if __name__ == '__main__':
    main()
  1.  

下面我发一下相关测试

  1. from MusicORM import Music
  2. from musicPicker import MusicPicker
  3.  
  4. import unittest # 包含单元测试模块
  5. import sys
  6.  
  7. reload(sys)
  8. sys.setdefaultencoding('utf8')
  9.  
  10. class filmReptileTests(unittest.TestCase):
  11.  
  12. def setUp(self): # 单元测试环境配置
  13. self.spider= MusicPicker()
  14.  
  15. def tearDown(self): # 单元测试环境清除
  16. self.spider =None
  17.  
  18. def testInit(self):
  19. self.assertIsNotNone(self.spider)
  20. self.assertIsNotNone(self.spider.cur_url)
  21. self.assertEqual(self.spider.cur_url,"https://music.douban.com/chart")
  22. self.assertEqual(self.spider.datas,[])
  23.  
  24. def testGet_page_string(self):
  25. self.assertIsNotNone(self.spider.Acquire_music_open())
  26.  
  27. def testFind_title(self):
  28. html_string=self.spider.Acquire_music_open()
  29. titles=self.spider.select_music_Content(html_string)
  30. self.assertIsNotNone(titles)
  31. titles_length=len(titles)
  32. model = self.spider.form_music_Content(titles)
  33. model_length=len(model)
  34. self.assertGreater(titles_length, 0)
  35. self.assertEqual(titles_length,20)
  36. self.assertIsNotNone(model)
  37. self.assertEqual(model_length, 10)
  38.  
  39. def testExportData(self):
  40. html_string=self.spider.Acquire_music_open()
  41. titles=self.spider.select_music_Content(html_string)
  42. self.assertIsNotNone(titles)
  43. titles_length=len(titles)
  44. model = self.spider.form_music_Content(titles)
  45. model_length=len(model)
  46. self.assertGreater(titles_length, 0)
  47. self.assertEqual(titles_length,20)
  48. self.assertIsNotNone(model)
  49. self.assertEqual(model_length, 10)
  50. for item in model:
  51. isSuccess=self.spider.exportData(Music(unicode( item), unicode( item)))
  52. self.assertTrue(isSuccess)

python+SQLAlchemy+爬虫的更多相关文章

  1. 第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中 前面我们讲到的elasticsearch( ...

  2. 第三百四十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP

    第三百四十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP 设置代理ip只需要,自定义一个中间件,重写process_request方法, request ...

  3. 第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存

    第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存 注意:数据保存的操作都是在pipelines.py文件里操作的 将数据保存为json文件 spider是一个信号检测 ...

  4. Python 3爬虫、数据清洗与可视化实战PDF高清完整版免费下载|百度云盘

    百度云盘:Python 3爬虫.数据清洗与可视化实战PDF高清完整版免费下载 提取码: 内容简介 <Python 3爬虫.数据清洗与可视化实战>是一本通过实战教初学者学习采集数据.清洗和组 ...

  5. Python简单爬虫入门三

    我们继续研究BeautifulSoup分类打印输出 Python简单爬虫入门一 Python简单爬虫入门二 前两部主要讲述我们如何用BeautifulSoup怎去抓取网页信息以及获取相应的图片标题等信 ...

  6. Ubuntu下配置python完成爬虫任务(笔记一)

    Ubuntu下配置python完成爬虫任务(笔记一) 目标: 作为一个.NET汪,是时候去学习一下Linux下的操作了.为此选择了python来边学习Linux,边学python,熟能生巧嘛. 前期目 ...

  7. Python简单爬虫入门二

    接着上一次爬虫我们继续研究BeautifulSoup Python简单爬虫入门一 上一次我们爬虫我们已经成功的爬下了网页的源代码,那么这一次我们将继续来写怎么抓去具体想要的元素 首先回顾以下我们Bea ...

  8. python SQLAlchemy

    这里我们记录几个python SQLAlchemy的使用例子: 如何对一个字段进行自增操作 user = session.query(User).with_lockmode('update').get ...

  9. [Python] 网络爬虫和正则表达式学习总结

    以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset.beachmark等等.但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的.最近在国内一家互联网公司实习, ...

随机推荐

  1. Java编程思想(后)

    Java编程思想(后) 持有对象 如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序. Java中的库基本类型: List, Set, Queue和Map --- 称为集 ...

  2. Discuz x 转码要记

    Discuz 开源项目仅保留了 UTF8 编码版本,要从GBK版本升级,须进行编码转换. 转换主要执行以下步骤: 关闭网站,做好源文件备份: 导出数据库,在MySQL中生成Self-Contained ...

  3. 一篇文章搞懂Android组件化

    网上组件化的文章很多,我本人学习组建化的过程也借鉴了网上先辈们的文章.但大多数文章都从底层的细枝末节开始讲述,由下而上给人一种这门技术“博大精深”望而生畏的感觉.而我写这篇文章的初衷就是由上而下,希望 ...

  4. cadcam

    Email:kefu007@vip.qq.com 13D TIMON 2007 英語版2007 23DVIA Composer V6R2013 中文版2013 3ABQUS V6.11 6.11 4A ...

  5. windows下安装Python虚拟环境virtualenvwrapper-win

      1 前言 由于Python的版本众多,还有Python2和Python3的争论,因此有些软件包或第三方库就容易出现版本不兼容的问题. 通过 virtualenv 这个工具,就可以构建一系列 虚拟的 ...

  6. C# 通过 Quartz .NET 实现 schedule job 的处理

    在实际项目的开发过程中,会有这样的功能需求:要求创建一些Job定时触发运行,比如进行一些数据的同步. 那么在 .Net Framework 中如何实现这个Timer Job的功能呢? 这里所讲的是借助 ...

  7. 重新拾取:TFS2017钉钉机器人源代码签入通知

    http://www.cnblogs.com/79039535/p/9316791.html 现在很多公司办公都使用钉钉打卡签到,于是鉴于公司也使用钉钉就打算用钉钉来做一个源代码签入通知. 首先先去打 ...

  8. Amazon新一代云端关系数据库Aurora

    在2017年5月芝加哥举办的世界顶级数据库会议SIGMOD/PODS上,作为全球最大的公有云服务提供商,Amazon首次系统的总结了新一代云端关系数据库Aurora的设计实现.Aurora是Amazo ...

  9. Windows phone 8.1之数据绑定(Data Binding)

    学习Winphone8.1的时候经常需要对Slider进行数据绑定后使之视觉化,方便调节Slider的值. 数据绑定分为源(Source)和目标(Target),Source一般分为两种,其他控件的数 ...

  10. 网络对抗技术 20165220 Exp3 免杀原理与实践

    实验任务 1 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧: 2 通过组合应用各种技术实现恶意代码免杀(1 ...