俗话说的好,人靠衣装,马靠鞍,手里有个趁手的家伙什让我们干什么都可以达到事半功倍的效果。框架的出现可以说为广大的程序猿带来了福音,如果把做一个项目比喻成建房子,我们作为建筑师,房子的地基和框架都给我们搭完了
剩下的我们只要把房子内部装饰成我们喜欢的风格,一座属于自己喜欢的房子就诞生了!因此挑选好趁手的“武器”与合适的框架可以在编程时给我们带来方便
scrapy框架是python爬虫近几年里面的主流框架它有一堆的好处,具体的也就不一一列举了有兴趣的小伙伴可以参考百度百科上的介绍: Scrapy的百度百科
在控制台输入scrapy startproject lizi就会创建一个名叫lizi的scrapy工程文件,同时scrapy会默认帮我们创建几个必要的文件,对于初学scrapy框架的来说spiders文件夹,items,pipelines,settings只要了解这几个文件来说就行了
这个文件夹内,放置的都是我们所编写爬虫爬取目标网站内我们所需要的数据,类似于一座工厂,外面把所有原料运进来了,我们只需要对这些原料进行加工,我们就可以得到我们想要的东西
这个文件就是对spiders内爬虫爬取的数据进行约束
item['name']=i.xpath('.//div[@class="info"]/a/text()').extract()[0]
item['coin']=i.xpath('.//i[@class="b-icon play"]/../text()').extract()[0]
比如说,上面这段代码是某个爬虫对某网站进行xpath解析,获取了一个name,coin两个我们所需要的数据但item里面规定了我们这个工程文件只要拿到name就行了,不需要去拿coin,因此我们编写的爬虫多拿一个item里面没叫我们拿的数据,如果程序运行则会报错,因此,item的存在就是为了对我们的爬虫爬取的数据来的数据进行约束。
item文件就好比如一个工厂质检员,工厂在把商品拿到市场上去卖之前,需要质检员进行最后的质检,但质检员发现,诶,你这工厂做的都是啥,把别项产品的功能加到这个产品上去,牛头不对马嘴,马上给我返工!
pipelines,是对爬虫爬取出来的数据进行处理,比如存入到数据库,对数据进行二次加工等等等等,你想对数据进行操作就是在这个地方,
从英文名字就可以看出来这是一个设置,这是对当前整个scrapy框架进行设置,当我们初始化一个项目之后
一个是robot协议,一个是启动pipelines这两个一定要开启
middlewares是scrapy里的下载中间件,可以比喻成工厂在开工前的大货车,将外面的原料送到工厂进行加工
说了这么多,是骡子是马总要拉出来溜溜才知道,小白博主举个栗子说不定可以让大伙看的更明白点!
我们以爬取b站全站榜为例,我们爬取上榜每个视频的标题,播放量,弹幕数量,up主名字和综合得分这5个数据
首先在控制台输入两条语句,创建好我们的工程
创建了一个叫bili的spiders
这就是创建好的所有工程文件
工程文件创建好后,我们打开setting,对这个工厂进行初始化,启动pipelines管道,修改robot协议
然后打开items对spiders内爬取的数据进行约束,想pipelines输入我们真正想要处理的数据而不是啥都往里丢
接下来就是我们的重中之重,对spiders进行编写,我们先看已经编写好的代码
可能这时候会有人问,你这都没有进行对目标网页进行请求,你就xpath开始解析了,你是不是在骗人!
我们仔细看看,上面是不是有个start_url,我们将它替换成b站全站榜的超链接地址,虽然start_url并不是这样给我们用的具体为什么呢?,以后有空我们再慢慢道来,在这里我们换就vans了
scrapy的框架编写spider时,我们只需要编写好url给scrapy框架它就会自动请求并返回一个response,因此我们不需要再去写请求目标网站的代码了,在这里我们已经给scrapy一个初始的url(即start_url)了因此它也已经帮我们做完请求的那一步了。接下来我们再通过xpath解析并将它们存入到item中去,再通过yield关键字丢到pipelines中去
import scrapy
from bilibili.items import BilibiliItem
class BiliSpider(scrapy.Spider):
name = 'bili'
allowed_domains = ['bilibili.com']
start_urls = ['https://www.bilibili.com/ranking/all/0/0/1']
def parse(self, response):
result=response.xpath('//div[@class="rank-list-wrap"]/ul/li')
for i in result:
item=BilibiliItem()
item['name']=i.xpath('.//div[@class="info"]/a/text()').extract()[0]
item['coin']=i.xpath('.//i[@class="b-icon play"]/../text()').extract()[0]
item['view']=i.xpath('.//i[@class="b-icon view"]/../text()').extract()[0]
item['author']=i.xpath('.//span[@class="data-box"]/text()').extract()[0]
item['score']=i.xpath('.//div[@class="pts"]/div/text()').extract()[0]
yield item
在pipelines中我们与mysql数据库进行连接,再将从spiders中传来的数据再传入到数据库中,到这里我们就算大功告成了!,下面是源码:
import pymysql
class BilibiliPipeline(object):
def __init__(self):
# 连接数据库
self.conn=pymysql.connect(
user='root',
password='root123456',
host='localhost',
port=3306,
database='data',
)
self.cur=self.conn.cursor()
def process_item(self, item, spider):
try:
sql="insert into bilibili(名字,硬币,播放量,作者,综合得分) values ('%s','%s','%s','%s','%s')"%(item['name'], item['coin'],item['view'],item['author'],item['score'])
# 执行数据库语句
self.cur.execute(sql)
# 插入数据
self.conn.commit()
except Exception as e:
print(e)
return item
def close_spider(self):
print('爬虫工作完成,自动关闭')
self.conn.close()
self.close_spider()
最后附一张数据库的图片,我们可以看到数据都已经成功添加到数据库当中去了
博主也是一个刚刚接触python爬虫的小白,写博客的目的完全是出于为了将自己看到的,学到的分享到网络上供大家参考学习和交流,写这篇文章我只是出于自己对python中的scrapy框架的了解并通过自己的话语简述其大致流程并分享出来,让刚刚接触这个框架的其他人能更方便深入了解这个框架的大致工作流程
如果文章有什么写的不对的地方还请各位dalao多多指正,同时如果我的文章能给刚认识这个框架的你,带来什么启发那我也会感到十分高兴!