[Scrapy教学6]解析如何在Scrapy框架中存入资料到MySQL教学

在这里插入图片描述
在利用Scrapy框架开发网页爬虫的过程中,成功取得想要搜集的资料后,下一个步骤就是资料的储存,像是存入资料库或是档案中等,这时候,就会需要使用到Scrapy框架的项目资料模型及管道资料模型管道组件(模块),来帮助开发人员建立好维护的资料处理方式。

因此本文将继续[Scrapy教学5]掌握Scrapy框架重要的XPath定位元素方法文章所建立的Scrapy网页爬虫专案,来和大家分享如何将爬取到的网页资料,存入MySQL资料库,其中的重点包含:

Scrapy spider网页爬虫
粗糙的项目资料模型
崎cra的管道资料模型管道

一,Scrapy spider网页爬虫

假设此处想要进入搜集INSIDE硬塞的网路趋势观察网站-AI新闻网页的「文章标题」,「发布日期」及「作者」,这时候可以在这三个地方点击滑鼠快捷键,选择「检查」,来检视HTML原始码,如下图:
在这里插入图片描述
开启Scrapy网页爬虫专案,在spiders / inside.py的parse()方法(Method)中,利用[Scrapy教学5]掌握Scrapy框架重要的XPath定位元素方法文章中分享的xpath()方法(Method),来爬取网页中所有的「文章标题」,「发布日期」及「作者」,如下范例:

进口沙皮 刮y的
类InsideSpider (scrapy 。蜘蛛): 
    名称= “内部” 
    allowed_domains = [ 'www.inside.com.tw' ] 
    start_urls = [ 'https://www.inside.com.tw/tag/ai' ] 
    def parse (self ,response ):
        #爬取文章标题
        post_titles =响应。xpath (
            “ // h3 [@ class ='post_title'] / a [@ class ='js-auto_break_title'] / text()”
        )。getall ()
        #爬取发布日期
        post_dates =响应。xpath (
            “ // li [@ class ='post_date'] / span / text()”
        )。getall ()
        #爬取作者
        post_authors =回应。xpath (
            “ // span [@ class ='post_author'] / a / text()”
        )。getall ()

有收看[Scrapy教学5]掌握Scrapy框架重要的XPath定位元素方法文章文章知道,getall()方法(方法)回传的是一个串列(List),所以要获得其中的资料,就需要透过回回圈来进行读取,如下范例:

进口沙皮 刮y的
类InsideSpider (scrapy 。蜘蛛): 
    名称= “内部” 
    allowed_domains = [ 'www.inside.com.tw' ] 
    start_urls = [ 'https://www.inside.com.tw/tag/ai' ] 
    def parse (self ,response ):
        #爬取文章标题
        post_titles =响应。xpath (
            “ // h3 [@ class ='post_title'] / a [@ class ='js-auto_break_title'] / text()”
        )。getall ()
        #爬取发布日期
        post_dates =响应。xpath (
            “ // li [@ class ='post_date'] / span / text()”
        )。getall ()
        #爬取作者
        post_authors =回应。xpath (
            “ // span [@ class ='post_author'] / a / text()”
        )。getall ()
    
        对于数据在拉链(post_titles ,post_dates ,post_authors ):
            NewsScraperItem = {
    
      
                “ post_title” :数据[ 0 ],
                “ post_date” :数据[ 1 ],
                “ post_author” :数据[ 2 ]
            }
            产生NewsScraperItem 

以上范例第26行,使用了zip()函数将爬取的“文章标题”,“发布日期”及“作者”串列(List)资料,打包为一个人的元组(Tuple),如下范例:

(“百万美金规模!台湾AI芯片新创耐能获得鸿海,华邦电战略投资”,“ 2021/01/20”,“克里斯”), '百万美金规模!台湾AI芯片新创耐能获得鸿海,华邦电战略投资''2021/01/20''Chris' ),   
('微软新专利:跟《黑镜》一样的模拟真人聊天AI!”,“ 2021/01/15”,“克里斯”), ('微软新专利:跟《黑镜》一样的模拟真人聊天AI!” ,“ 2021/01/15” ,“克里斯” ),   
('宏正自动科技ATEN携手CKmates,引入AWS云端迁移服务提升全球网站运作3倍效能''2021/01/21''广编企划'), ('宏正自动科技ATEN携手CKmates,引入AWS云端迁移服务提升全球网站运作3倍效能''2021/01/21''广编企划' ),   

......

而在回圈读取的过程中,就需要定义一个物件,来分别储存每一个元组(Tuple)的“文章标题”,“发布日期”及“作者”资料,盔甲能够在“资料模型管道档案(pipeline.py )”中,进行后续资料处理使用。

这时候就需要像第27行一样,利用「资料模型档案(items.py )」中的NewsScraperItem类别(Class)来装载资料,并使用「post_title」,「post_date」及「post_author」三个栏位,来分别装载元组(Tuple)中的爬取资料,然后,透过yield关键字回传到「资料模型管道档案(pipeline.py )」中进行运用。

而NewsScraperItem类别(Class)的“ post_title”,“ post_date”和“ post_author”三个属性栏位,当前尚未定义,这也就是接下来所要进行的步骤。

二,草皮物品资料模型

Scrapy框架的item资料模型,也就是在刚刚范例中所使用的NewsScraperItem类别(Class),主要就是被定义在“资料模型管道档案(pipeline.py)”中,资料处理时所会使用到的栏位。

而本文中的「资料模型管道档案(pipeline.py)」中所要进行的资料处理,就是存入MySQL资料库,其中就会使用到「post_title」,「post_date」及「post_author」三个栏位,这当时就需要在「资料模型档案( items.py )」中定义,如下范例:

进口沙皮 刮y的
类NewsScraperItem (scrapy 。项): 
    #在这里为您的商品定义字段,例如:
    #名称= scrapy.Field()
    post_title = scrapy 。栏位()
    post_date = scrapy 。栏位()
    post_author = scrapy 。栏位()

完成NewsScraperItem资料模型的定义后,接下来就可以在“资料模型管道档案(pipeline.py)”中,来访问其中所装载的资料。

三,崎cra的管道资料模型管道

在开始将Scrapy网页爬虫取得的资料写入MySQL资料库前,大家可以先参考[Python实战应用]掌握Python连结MySQL资料库的重要操作文章的第二节安装MySQL,接着,就可以建立本文需的「insideb」资料库,如下图:
在这里插入图片描述
设定完成后,点击右下角的应用按钮即可。这时候顶端栏会看到多了一个“ insideb”资料库,在下方的Tables(资料表),单击鼠标右键,选择“ Create Table(添加资料表) )」,如下图:
在这里插入图片描述
接着,输入资料表名称(posts),并在下方定义其中的栏位(Columns),包含“ post_title”,“ post_date”及“ post_author” ,如下图:

在这里插入图片描述
同样点击Apply按钮就完成了,如下图:
在这里插入图片描述
MySQL资料库建置完成,接下来,在Scrapy专案的settings.py档案中,就需要设定相关的资料库连线资讯来进行连接,如下范例:

MYSQL_HOST ='本地主机'= '本地主机' 
MYSQL_DATABASE = 'insideb' 
MYSQL_USERNAME = 'root' 
MYSQL_PASSWORD = '密码' 

另外,也需要将以下基准为注解的“资料模型管道设定”开启,如下范例:

ITEM_PIPELINES = {
    
    = {
    
     
    'news_scraper.pipelines.NewsScraperPipeline'300}

设定完成后,开启「资料模型管道档案(pipeline.py)」,就可以来开发网页爬虫后续资料处理的动作,这里则以存入MySQL资料库为例,所以需要约会设定及pymysql模组(Module ),如下范例:

从itemadapter导入ItemAdapteritemadapter导入ItemAdapter 
来自news_scraper导入设置
导入pymysql

接着,在NewsScraperPipeline类别(Class)中,再添加一个重构式(Constructor),来初始化MySQL的资料库连线,如下范例:

从itemadapter导入ItemAdapteritemadapter导入ItemAdapter 
来自news_scraper导入设置
导入pymysql
类NewsScraperPipeline : 
    def __init__ (self ):
        自我。连接= pymysql 。连接(
            主机=设置。MYSQL_HOST ,
            db =设置。MYSQL_DATABASE ,
            用户=设置。MYSQL_USERNAME ,
            passwd =设置。MYSQL_PASSWORD ,
            字符集= 'utf8'
        )
        自我。cursor = self 。连接。游标() 

以上范例,使用pymysql模组(Module)的connect()方法(方法),重新发布在settings.py档案中所设定的MySQL资料库连线资讯,来建立连线物件,以及利用cursor()方法(方法)建立光标物件,盔甲能够对资料库进行操作。

接下来,在process_item()方法(Method)中,就可以来开发Scrapy网页爬虫存入资料到MySQL资料库的逻辑,如下范例:

从itemadapter导入ItemAdapteritemadapter导入ItemAdapter 
来自news_scraper导入设置
导入pymysql
类NewsScraperPipeline : 
    def __init__ (self ):
        自我。连接= pymysql 。连接(
            主机=设置。MYSQL_HOST ,
            db =设置。MYSQL_DATABASE ,
            用户=设置。MYSQL_USERNAME ,
            passwd =设置。MYSQL_PASSWORD ,
            字符集= 'utf8'
        )
        自我。cursor = self 。连接。游标() 
    def process_item (self ,item ,spider ):
        sql = 'INSERT INTO posts(post_title,post_date,post_author)VALUES(%s,%s,%s)' 
        数据= (项目[ 'post_title' ],项目[ 'post_date' ],项目[ 'post_author' ]) 
        自我。游标。执行(sql ,data )
        退货项目

首先,第22行定义编写的SQL指令,然后,第24行利用item资料模型来访问爬到的网页资料,并打包为一个元组(Tuple),第26行将其中插入执行。 )方法(Method)执行。

由于有多笔资料的写入,所以最后一定有一个确定(commit)的动作,确保所有资料都正确写入,这时候就可以再增加一个Scrapy框架的close_spider()内建方法(Method),在网页爬虫执行结束时,进行确定(commit)的动作及关闭资料库的连线,如下范例:

从itemadapter导入ItemAdapteritemadapter导入ItemAdapter 
来自news_scraper导入设置
导入pymysql
类NewsScraperPipeline : 
    def __init__ (self ):
        自我。连接= pymysql 。连接(
            主机=设置。MYSQL_HOST ,
            db =设置。MYSQL_DATABASE ,
            用户=设置。MYSQL_USERNAME ,
            passwd =设置。MYSQL_PASSWORD ,
            字符集= 'utf8'
        )
        自我。cursor = self 。连接。游标() 
    def process_item (self ,item ,spider ):
        sql = 'INSERT INTO posts(post_title,post_date,post_author)VALUES(%s,%s,%s)' 
        数据= (项目[ 'post_title' ],项目[ 'post_date' ],项目[ 'post_author' ]) 
        自我。游标。执行(sql ,data )
        退货项目
    def close_spider (self ,spider ):
        自我。连接。提交()
        自我。连接。关闭()

最后,利用以下的指令来执行Scrapy框架的内部网页爬虫,如下:

$ scrapy爬进里面

开启MySQL资料库,就可以看到Scrapy网页爬虫成功将爬取的资料写入资料库中,如下图:

在这里插入图片描述
四,小结
想要在Scrapy网页爬虫框架中,将爬取的资料存入外部资料库(如:MySQL),就会需要使用到Scrapy框架的item及pipeline两个模组(模块)功能,而各自主要负责的任务如下:

item.py:定义在pipeline.py档案中所会使用到的资料处理栏位。
pipeline.py:开发网页爬虫后续的资料处理动作。
也就是因为Scrapy框架有这样的分工架构,所以对于大型的网页爬虫专案,能够有一定的维护性。希望本文的实作能够帮助到大家,欢迎分享给身边对Python网页爬虫有兴趣的朋友,有任何的问题或想法,可以在底下留言和我分享。

猜你喜欢

转载自blog.csdn.net/wlcs_6305/article/details/114476790