【scrapy】爬虫框架从了解到运行

Scrapy简介

Scrapy 是用 Python编写而成用以爬取网站数据、提取结构性数据而编写的应用框架。通过使用Scrapy框架,我们能够简单的爬取指定网站的内容或图片。

Scrapy运行机制

  1. 引擎从调度器中取出一个URL,用于接下来的抓取。

  2. 引擎把URL封装成请求(Request)传给下载器,下载器把资源下载后封装后封装成应答包(Response)。

  3. 爬虫解析Response。

  4. 若解析出实体(Item),则交给实体管道进行进一步的处理。

  5. 若解析出的是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!!!

课程目标 《从零开始学Scrapy网络爬虫》从零开始,循序渐进地介绍了目前流行的网络爬虫框架Scrapy。即使你没有任何编程基础,学习起来也不会有压力,因为我们有针对性地介绍了Python编程技术。另外,《从零开始学Scrapy网络爬虫》在讲解过程中以案例为导向,通过对案例的不断迭代、优化,让读者加深对知识的理解,并通过14个项目案例,提高学习者解决实际问题的能力。 适合对象 爬虫初学者、爬虫爱好者、高校相关专业的学生、数据爬虫工程师。 课程介绍 《从零开始学Scrapy网络爬虫》共13章。其中,第1~4章为基础篇,介绍了Python基础、网络爬虫基础、Scrapy框架及基本的爬虫功能。第5~10章为进阶篇,介绍了如何将爬虫数据存储于MySQL、MongoDB和Redis数据库中;如何实现异步AJAX数据的爬取;如何使用Selenium和Splash实现动态网站的爬取;如何实现模拟登录功能;如何突破反爬虫技术,以及如何实现文件和图片的下载。第11~13章为高级篇,介绍了使用Scrapy-Redis实现分布式爬虫;使用Scrapyd和Docker部署分布式爬虫;使用Gerapy管理分布式爬虫,并实现了一个抢票软件的综合项目。       由于目标网站可能会对页面进行改版或者升级反爬虫措施,如果发现视频中的方法无法成功爬取数据,敬请按照页面实际情况修改XPath的路径表达式。视频教程主要提供理论、方法支撑。我们也会在第一时间更新源代码,谢谢! 课程特色
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页