python使用adbapi实现MySQL数据库的异步存储

这篇文章主要为大家详细介绍了python使用adbapi实现MysqL数据库的异步存储,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

之前一直在写有关scrapy爬虫的事情,今天我们看看使用scrapy如何把爬到的数据放在MysqL数据库中保存。

有关python操作MysqL数据库内容,网上已经有很多内容可以参考了,但都是在同步的操作MysqL数据库。在数据量不大的情况下,这种方法固然可以,但是一旦数据量增长后,MysqL就会出现崩溃的情况,因为网上爬虫的速度要远远高过往数据库中插入数据的速度。为了避免这种情况发生,我们就需要使用异步的方法来存储数据,爬虫与数据存储互不影响。

为了显示方便,我们把程序设计的简单一点,只是爬一页的数据。我们今天选择伯乐在线这个网站来爬取,只爬取第一页的数据。

首先我们还是要启动一个爬虫项目,然后自己建了一个爬虫的文件jobbole.py。我们先来看看这个文件中的代码

# -*- coding: utf-8 -*- import io import sys import scrapy import re import datetime from scrapy.http import Request from urllib import parse from ArticleSpider.items import JobboleArticleItem, ArticleItemloader from scrapy.loader import Itemloader sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8') class JobboleSpider(scrapy.Spider): """docstring for JobboleSpider""" name = "jobbole" allowed_domain = ["blog.jobbole.com"] start_urls = ['http://blog.jobbole.com/all-posts/'] def parse(self, response): """ 1.获取列表页中的文章url """ # 解析列表汇中所有文章url并交给scrapy下载器并进行解析 post_nodes = response.css("#archive .floated-thumb .post-thumb a") for post_node in post_nodes: image_url = post_node.css("img::attr(src)").extract_first("")# 这里取出每篇文章的封面图,并作为Meta传入Request post_url = post_node.css("::attr(href)").extract_first("") yield Request(url = parse.urljoin(response.url, post_url), Meta = {"front_image_url":image_url}, callback = self.parse_detail) def parse_detail(self, response): article_item = JobboleArticleItem() # 通过Itemloader加载Item # 通过add_css后的返回值都是list型,所有我们再items.py要进行处理 item_loader = ArticleItemloader(item = JobboleArticleItem(), response = response) item_loader.add_css("title", ".entry-header h1::text") item_loader.add_value("url", response.url) # item_loader.add_value("url_object_id", get_md5(response.url)) item_loader.add_value("url_object_id", response.url) item_loader.add_css("create_date", "p.entry-Meta-hide-on-mobile::text") item_loader.add_value("front_image_url", [front_image_url]) item_loader.add_css("praise_nums", ".Vote-post-up h10::text") item_loader.add_css("comment_nums", "a[href='#article-comment'] span::text") item_loader.add_css("fav_nums", ".bookmark-btn::text") item_loader.add_css("tags", "p.entry-Meta-hide-on-mobile a::text") item_loader.add_css("content", "div.entry") article_item = item_loader.load_item() print(article_item["tags"]) yield article_item pass

这里我把代码进行了简化,首先对列表页发出请求,这里只爬取一页数据,然后分析每一页的url,并且交给scrapy对每一个url进行请求,得到每篇文章的详情页,把详情页的相关内容放在MysqL数据库中。

这里使用itemloader来进行页面的解析,这样解析有个最大的好处就是可以把解析规则存放在数据库中,实现对解析规则的动态加载。但是要注意一点是使用itemloader中css方式和xpath方式得到的数据都是list型,因此还需要在items.py中再对相对应的数据进行处理。

接下来我们就来看看items.py是如何处理list数据的。

# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # https://doc.scrapy.org/en/latest/topics/items.html import datetime import re import scrapy from scrapy.loader import Itemloader from scrapy.loader.processors import MapCompose, TakeFirst,Join from ArticleSpider.utils.common import get_md5 def convert_date(value): try: create_date = datetime.datetime.strptime(create_date, "%Y/%m/%d").date() except Exception as e: create_date = datetime.datetime.Now().date() return create_date def get_nums(value): match_re = re.match(".*?(d+).*", value) if match_re: nums = int(match_re.group(1)) else: nums = 0 return nums def remove_comment_tags(value): # 去掉tags中的评论内容 if "评论" in value: # 这里做了修改,如果返回"",则在list中仍然会占位,会变成类似于["程序员",,"解锁"]这样 # return "" return None else: return value def return_value(value): return class ArticleItemloader(Itemloader): """docstring for AriticleItemloader""" # 自定义Itemloader default_output_processor = TakeFirst() class ArticlespiderItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() pass class JobboleArticleItem(scrapy.Item): """docstring for ArticlespiderItem""" title = scrapy.Field() create_date = scrapy.Field( input_processor = MapCompose(convert_date) ) url = scrapy.Field() url_object_id = scrapy.Field( output_processor = MapCompose(get_md5) ) # 这里注意front_image_url还是一个list,在进行sql语句时还需要处理 front_image_url = scrapy.Field( output_processor = MapCompose(return_value) ) front_image_path = scrapy.Field() praise_nums = scrapy.Field( input_processor = MapCompose(get_nums) ) comment_nums = scrapy.Field( input_processor = MapCompose(get_nums) ) fav_nums = scrapy.Field( input_processor = MapCompose(get_nums) ) # tags要做另行处理,因为tags我们需要的就是list tags = scrapy.Field( input_processor = MapCompose(remove_comment_tags), output_processor = Join(",") ) content = scrapy.Field()

首先我们看到定义了一个类ArticleItemloader,在这个类中只有一句话,就是对于每个items都认采用list中的第一个元素,这样我们就可以把每个items中的第一个元素取出来。但是要注意,有些items我们是必须要用list型的,比如我们给ImagePipeline的数据就要求必须是list型,这样我们就需要对front_image_url单独进行处理。这里我们做了一个小技巧,对front_image_url什么都不错,因为我们传过来的front_image_url就是list型

在items的Field中有两个参数,一个是input_processor,另一个是output_processor,这两个参数可以帮助我们对items的list中的每个元素进行处理,比如有些需要用md5进行加密,有些需要用正则表达式进行筛选或者排序等等。

在进行mys上一篇:Python脚本利用adb进行手机控制的方法下一篇:Python之使用adb shell命令启动应用的方法详解

热门搜索

数据库存储 

异步存储 

存入MysqL数据库 

使用dreamhost空间实现MysqL数据库备份方法 

异步读取数据库 

相关文章

python使用adbapi实现MysqL数据库的异步存储

2021-09-10阅读(9227)评论(0)推荐()

这篇文章主要为大家详细介绍了python使用adbapi实现MysqL数据库的异步存储,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

python异步存储数据详解

2021-10-15阅读(4246)评论(0)推荐()

这篇文章主要为大家详细介绍了python异步存储数据的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

更改MysqL数据库存储位置的具体步骤

2021-10-10阅读(5640)评论(0)推荐()

首先把MysqL的服务先停掉,更改MysqL配置文件My.ini中的数据库存储主路径,将老的数据库存储主路径中的数据库文件文件夹复制到新的存储主路径,接下来重...

Python爬虫爬取全球疫情数据并存储到MysqL数据库的步骤

2021-11-03阅读(5480)评论(0)推荐()

这篇文章主要介绍了Python爬虫爬取全球疫情数据并存储到MysqL数据库的步骤,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下

MysqL 5.7更改数据库的数据存储位置的解决方法

2021-10-08阅读(6821)评论(0)推荐()

随着MysqL数据库存储的数据逐渐变大,已经将原来的存储数据的空间占满了,导致MysqL已经链接不上了。所以要给存放的数据换个地方,下面小编给大家分享MysqL...

Python通过调用MysqL存储过程实现更新数据功能示例

2021-11-04阅读(10031)评论(0)推荐()

这篇文章主要介绍了Python通过调用MysqL存储过程实现更新数据功能,结合实例形式分析了Python调用MysqL存储过程实现更新数据的具体步骤与相关操作技...

Python异步操作MysqL示例【使用aioMysqL

2021-11-04阅读(6581)评论(0)推荐()

这篇文章主要介绍了Python异步操作MysqL,结合实例形式分析了Python安装及使用aioMysqL针对MysqL数据库异步操作相关实现技巧,需要的朋友可...

取消

有人回复邮件通知

提交评论

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...