在利用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网页爬虫有兴趣的朋友,有任何的问题或想法,可以在底下留言和我分享。