Scrapy简介
Scrapy 是用 Python编写而成用以爬取网站数据、提取结构性数据而编写的应用框架。通过使用Scrapy框架,我们能够简单的爬取指定网站的内容或图片。
Scrapy运行机制
-
引擎从调度器中取出一个URL,用于接下来的抓取。
-
引擎把URL封装成请求(Request)传给下载器,下载器把资源下载后封装后封装成应答包(Response)。
-
爬虫解析Response。
-
若解析出实体(Item),则交给实体管道进行进一步的处理。
-
若解析出的是URL,则把URL交给Scheduler等待抓取。
Scrapy框架文件结构
首先我们创建一个Scrapy项目,目录结构如下所示。
cnblog/
scrapy.cfg # 项目的配置文件
cnblog/
__init__.py
items.py # 定义你所要抓取的字段
pipelines.py # 管道文件,当spider抓取到内容(item)以后,会被送到这里,这些信息(item)在这里会被清洗,去重,保存到文件或者数据库。
middlewares.py # 中间件,主要是对功能的拓展,你可以添加一些自定义的功能,比如添加随机user-agent, 添加proxy。
settings.py # 设置文件,用来设置爬虫的默认信息,相关功能开启与否,比如是否遵循robots协议,设置默认的headers,设置文件的路径,中间件的执行顺序等等。
spiders/ # 在这个文件夹下编写自己的spider
__init__.py
Scrapy爬取博客园
1.进入项目文件夹,创建自己的爬虫文件,如下的命令在终端运行。
cd cnblog
scrapy genspider cnblog_spider cnblogs.com
2.进入我们刚才创建的爬虫文件cnblog_spider,发现框架已经自动生成了爬虫主要代码,只要补充自己想要爬取的项目即可,我希望爬取博客园的文章链接以及题目,所以我补充了如下代码,顺便进行输出,可以直观的看到项目是否运行成功。
title = response.xpath('//a[@class="post-item-title"]/text()').extract()
url = response.xpath('//a[@class="post-item-title"]/@href').extract()
print(title)
print(url)
3.在终端运行爬虫项目。
scrapy crawl cnblog_spider
得到如下运行结果,至此一个简单的爬虫项目就运行成功了。
Scrapy实现文件存储
如果希望存储我们爬取的信息,则需要在items.py文件中定义它们,item是保存爬取到的数据的容器,其使用方法和dict字典类似,对于items中定义信息,只需要根据提示补充代码即可。
class CnblogItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
url = scrapy.Field()
接下来需要在爬虫文件中导入我们刚才在items中定义的CnblogItem类,使用字典的方法就可以给items进行赋值。最后yield生成器,将items传递给管道pipeline进行后续操作。
def parse(self, response):
items = CnblogItem()
# extract()使得使提取内容转换为Unicode字符串,返回数据类型为list
items['title'] = response.xpath('//a[@class="post-item-title"]/text()').extract()
items['url'] = response.xpath('//a[@class="post-item-title"]/@href').extract()
yield items # 生成器相当于用后销毁,节省内存。
修改管道pipelines.py文件,这里本来有一个自定义的CnblogPipeline类,为了更好的介绍Scrapy框架的使用,我这里又定义了一个PrintPipeline类。管道pipelines.py文件的作用就是实现数据的输出处理,也可以完成存储的工作。
class CnblogPipeline:
def process_item(self, item, spider):
with open('cnblogs.txt','a',encoding='utf8') as f:
title = item['title']
url = item['url']
# print(title)
# print(url)
for i,j in zip(title,url):
f.write(i+':'+j+'\n')
return item
class PrintPipeline:
def process_item(self, item, spider):
print('Printitem::'+item['title'])
return item
最后需要在Seeting.py文件中打开ITEM_PIPELINES,同时添加在管道中新定义类PrintPipeline,并且标注优先级。
ITEM_PIPELINES = {
'cnblog.pipelines.CnblogPipeline': 300, # 数字代表优先级
'cnblog.pipelines.PrintPipeline': 500
}
至此,就可以运行Scrapy框架了!
运行完成!!!恭喜你,程序无Bug!!!