python+SQLAlchemy+爬虫

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

"""
一个简单的豆瓣音乐前250爬虫
Author: Jar.guo email:1418229458@qq.com
Date: 2016-08-27
Language: Python2.7.10 """ import urllib2
import sys from lxml import html
from MusicORM import Music,MusicORMHelper reload(sys)
sys.setdefaultencoding('utf8')

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

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

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

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

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

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

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

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

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

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

    def start_music_spider(self):
my_page = self.Acquire_music_open()
content_items = self.select_music_Content(my_page)
self.form_music_Content(content_items)

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

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

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

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)) print item print "spider is done..."
if __name__ == '__main__':
main()

下面我发一下相关测试

from MusicORM import Music
from musicPicker import MusicPicker import unittest # 包含单元测试模块
import sys reload(sys)
sys.setdefaultencoding('utf8') class filmReptileTests(unittest.TestCase): def setUp(self): # 单元测试环境配置
self.spider= MusicPicker() def tearDown(self): # 单元测试环境清除
self.spider =None def testInit(self):
self.assertIsNotNone(self.spider)
self.assertIsNotNone(self.spider.cur_url)
self.assertEqual(self.spider.cur_url,"https://music.douban.com/chart")
self.assertEqual(self.spider.datas,[]) def testGet_page_string(self):
self.assertIsNotNone(self.spider.Acquire_music_open()) def testFind_title(self):
html_string=self.spider.Acquire_music_open()
titles=self.spider.select_music_Content(html_string)
self.assertIsNotNone(titles)
titles_length=len(titles)
model = self.spider.form_music_Content(titles)
model_length=len(model)
self.assertGreater(titles_length, 0)
self.assertEqual(titles_length,20)
self.assertIsNotNone(model)
self.assertEqual(model_length, 10) def testExportData(self):
html_string=self.spider.Acquire_music_open()
titles=self.spider.select_music_Content(html_string)
self.assertIsNotNone(titles)
titles_length=len(titles)
model = self.spider.form_music_Content(titles)
model_length=len(model)
self.assertGreater(titles_length, 0)
self.assertEqual(titles_length,20)
self.assertIsNotNone(model)
self.assertEqual(model_length, 10)
for item in model:
isSuccess=self.spider.exportData(Music(unicode( item), unicode( item)))
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的方法重写 ,多态和关键字 instanceof和final

    package cn.pen; /*final 是一个java的关键字,用于修饰局部变量.属性.方法.类,表示最终的意思. final修饰类表示最终类,无法被继承.public final class ...

  2. 关于CSRF

    CSRF介绍 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF ...

  3. Java数据类型与运算符

    Java 基本数据类型 Java 的两大数据类型: 内置数据类型 引用数据类型 内置数据类型 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. b ...

  4. 主席树——树链上第k大spoj COT

    首先要求第k大就想到用主席树来处理 但是不能直接用树链剖分的dfs序来维护,因为一条链对应的dfs下标可能是断开的几段,无法用权值线段树来维护 那么久维护每个点到根节点的全值线段树,结点u的权值线段树 ...

  5. leetcode python快乐数

    编写一个算法来判断一个数是不是“快乐数” “快乐数”的定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复该过程直到为1,也可能是无限循环但始终变不到1. 如果可以变为1,那 ...

  6. 使用wget命令下载网络资源

    wget是GNU/Linux下的一个非交互式(non-interactive)网络下载工具,支持HTTP.HTTPS与FTP协议,并能够指定HTTP代理服务器.虽然wget命令与curl命令相比支持的 ...

  7. SpringBoot的事件监听

    事件监听的流程分为三步:1.自定义事件,一般是继承ApplicationEvent抽象类.2.定义事件监听器,一般是实现ApplicationListener接口.3.a.启动的时候,需要将监听器加入 ...

  8. 《ServerSuperIO Designer IDE使用教程》-1.标准Modbus和非标准协议的使用、测试以及驱动开发。附:v4.2发布

    ServerSuperIO Designer IDE v4.2版本更新内容: 增加ServerSuperIO.Host运行程序,可以使用IDE进行测试,Host为运行环境. 针对设备驱动增加导入监测点 ...

  9. 一起学爬虫——使用selenium和pyquery爬取京东商品列表

    layout: article title: 一起学爬虫--使用selenium和pyquery爬取京东商品列表 mathjax: true --- 今天一起学起使用selenium和pyquery爬 ...

  10. pojo,javabean与entitybean

    pojo:朴实无华的实体类 javabean:遵守某些规范的可重用的实体类 entitybean:与数据库中的数据记录对应的类 这个链接说的很明白!https://blog.csdn.net/chen ...