美文网首页
Python爬虫之Scrapy框架入门1

Python爬虫之Scrapy框架入门1

作者: lexyhp | 来源:发表于2017-04-14 17:59 被阅读0次

    环境搭建

    在开始搭建scrapy爬虫的开发环境之前,建议已经安装Anaconda这个python发行版本,这个可以让以后的开发过程中,安装其他的模块环境不至于出现一堆的错误。

    假定你安装好了Anaconda,也配置好了相应的环境变量,这是你可以用以下的命令安装scrapy框架:

    1. 在终端执行下面这条命令

    conda install Scrapy

    下面是安装过程的截图,是不是很简单

    安装scrapy

    2.通过python的包安装和管理工具pip来安装

    pip install Scrapy

    这样,scrapy就安装完成了, 不管通过哪种方式,是不是都很简单!当然此处推荐使用第一种安装方式,什么??你就要用第二种,ok,ok,你用好了,体验一把安装python模块库错综复杂,藕断丝连,欲罢不能,让人蛋疼依赖关系(有多疼??疼到你怀疑你有一颗假的蛋,没错,一颗),也是一种人生的历练!!

    环境安装好了以后,下面就可以开始我们想入非非,性奋不已的scrapy基础之路了。
    作为流程,下面请允许我从scrapy的官网借(程序员的事情不叫偷的)一些话来凑个字数

    项目创建

    在开始爬取之前,您必须创建一个新的Scrapy项目(废话,请忽略)
    怎么创建项目??对,没错,就是这样,打开终端:

    scrapy新建项目

    注意注意 项目取名字的时候,不要像我的这个取得这么见名知意,万一你的领导或同事没有八年开发经验和汉语八级,你可能会被打的

    见名知意

    项目创建完成,可以看到下面的项目目录

    项目结构

    下面该写爬虫了??no!!在开始写爬虫之前还是来了解一下scrapy的工作流程!

    scrapy工作流程图

    没错我又从网上偷来的这张图

    ??图看不太懂?我艹,我就知道有人跟我一样,没关系,来来来,看看别人通俗形象的解释:

    引擎:Hi!Spider, 你要处理哪一个网站?

    Spiders:我要处理xxoo.com

    引擎:你把第一个需要的处理的URL给我吧。

    Spiders:给你第一个URL是XXXXXXX.com

    引擎:Hi!调度器,我这有request你帮我排序入队一下。

    调度器:好的,正在处理你等一下。

    引擎:Hi!调度器,把你处理好的request给我,

    调度器:给你,这是我处理好的request

    引擎:Hi!下载器,你按照下载中间件的设置帮我下载一下这个request

    下载器:好的!给你,这是下载好的东西。(如果失败:不好意思,这个request下载失败,然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载。)

    引擎:Hi!Spiders,这是下载好的东西,并且已经按照Spider中间件处理过了,你处理一下(注意!这儿responses默认是交给def parse这个函数处理的)

    Spiders:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,这是我需要跟进的URL,将它的responses交给函数 def xxxx(self, responses)处理。还有这是我获取到的Item。

    引擎:Hi !Item Pipeline 我这儿有个item你帮我处理一下!调度器!这是我需要的URL你帮我处理下。然后从第四步开始循环,直到获取到你需要的信息,

    注意!只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy会重新下载。)

    以上就是Scrapy整个流程了。

    注: 以上引用自博客http://cuiqingcai.com/3472.html

    以上完成了对scrapy的工作流程的理解,下面开始进入正题,开始我们的小爬虫,用于scrapy官网给出的例子中的domz网站已经永久关闭,所以下面的例子,我们以http://quotes.toscrape.com/tag/humor/这个网站为例。

    Item编写

    观察网页的结构后,确定一下需要爬取的页面和想要爬取的内容字段,比如,你要要爬取番号,封面,还是种子呢?别激动,我们在这里只爬取上面的网站每个条目的标题链接作者标签四个字段,

    确定要爬取的字段以后,就可以开始爬虫的编写,在==items.py==文件中加入我们要爬取的字段,如下图所示:

    item定义

    爬虫文件编写

    确定以及定义好了我们需要提取的字段,下面就该开始爬虫的编写了,在spiders文件夹下新建自己的爬虫文件:

    新建spider文件

    对于这个文件里的几行代码,这里只简单的解释一下,详细的介绍以后再说,毕竟这里只是入门嘛!

    开始我们导入scrapy模块(这行还看不懂的话)。。。。

    我还能说什么

    除了这个模块,我们还需要导入之前编写的item文件。之后是定义了一个spider类,该类继承自scrapy.Spider,下面的name = 'PachongSpider'是爬虫的名字,这个名字是唯一的,因为在完成代码后运行爬虫要用到这个名字,start_urls 列表里存放要爬取的链接地址,scrapy会自动从这个列表取出地址进行爬取,并将返回的response作为参数传递给self.parse,在self.parse里就可以从response解析出需要的数据字段(即item里定义的字段)。

    关于数据的解析,scrapy提供了多种方式,xpath,css,re,都是可以的,这里先来试试xpath,如果对xpath不是很熟悉,可以先看一下http://www.w3school.com.cn/xpath/index.asp,看了,还不会用???多试几遍就会了,或者也可以借助强大的chrome浏览器

    提取xpath

    爬虫的编写如下:

    #coding:utf-8
    
    import scrapy
    from pachong.items import PachongItem
    
    class QuotesSpider(scrapy.Spider):
        name =  'pachong'
        start_urls = [
            'http://quotes.toscrape.com/tag/humor/',
        ]
    
        def parse(self, response):
            base_url = 'http://quotes.toscrape.com'
            item = PachongItem()
            divs = response.xpath('//div[@class="quote"]')
            for div in divs:
                item['name'] = div.xpath('span[@class="text"]/text()').extract()[0]
                item['url'] = base_url+div.xpath('span/a/@href').extract()[0]
                item['tags'] = div.xpath('div[@class="tags"]/a/text()').extract()
                item['author'] = div.xpath('span/small[@class="author"]/text()').extract()[0]
                print(item)
                yield item
    

    数据持久化

    最后我们将爬取的数据持久化到本地,可以存储在文件中,csv,json,当然也可以是数据库,这里采用mongodb来存储(关于python使用mongodb,请自行百度),如同文章开始介绍的,数据持久化需要在pipelines.py文件中进行,
    一下开始编写pipelines.py文件

    import pymongo
    
    class PachongPipeline(object):
        def __init__(self):
            self.client = pymongo.MongoClient('localhost', 27017)
            self.pchdb = self.client['pchdb']
            self.pchtab = self.pchdb['pchtab']
    
        def process_item(self, item, spider):
            self.pchtab.insert_one(dict(item))
            return item
    

    首先导入mongodb的python依赖模块,在pipelines.py初始化方法中,连接到mongodb数据库,在process_item方法中向数据库插入数据。这个文件编写完成,需要在settings.py文件中配置该管道

    ITEM_PIPELINES = {
       'pachong.pipelines.PachongPipeline': 1,
    }
    

    如果运行了程序,数据库没有数据,可能是没有在settings里配置ITEM_PIPELINES。

    下面就是运行脚本了,打开终端,进入到爬虫的根目录(到达根目录,scrapy list命令查看爬虫的列表就是前面所说的spider里面的name对应的值),然后输入scrapy crawl pachong,脚本运行完成可以在数据库看到爬取到的数据了

    爬取到的数据

    最后说一下,每次都要打开终端输入命令来运行脚本多少有些不便,可以在项目的根目录下新建一个python文件输入下面的代码:

    from scrapy.cmdline import execute
    execute(['scrapy', 'crawl', 'pachong'])
    

    execute方法的的参数list中的三个元素是不是很熟悉,没错,就是前面在终端输入过的命令,第三个元素是根据你爬虫的“name”来定的

    至此一个简单的爬虫就完成了,至于怎么爬取有分页的网页,怎么设置代理,应对反爬,以及怎么爬取js动态加载的页面,将会在后面的博客中讲到。
    最后是代码地址:https://github.com/lexyhp/pachong

    相关文章

      网友评论

          本文标题:Python爬虫之Scrapy框架入门1

          本文链接:https://www.haomeiwen.com/subject/xqvwattx.html