爬虫基础09B—scrapy爬虫

目录

 scrapy爬虫:

    1)创建scrapy项目

     2)创建爬虫代码

   3) 爬虫:

1. scrapy-环境搭建

2. scrapy-爬网页-转存文件到本地

3. scrapy原理

4. Scrapy shell

4.1 Scrapy作业-Scrapy shell

    2)练习:

5. scrapy命令行工具

6.Spider文件夹 

7. pycharm操作数据库 

8. scrapy爬豆瓣 

 8.1 scrapy startproject doubanmovie

 8.2 编辑保存数据的容器文件:items.py

8.3 切换terminal目录:cd doubanmovie

 8.4 settings.py文件

 8.5 配置pipelines.py文件(以实现持久化存储)

    8.6 爬:scrapy crawl doubanspider



 scrapy爬虫:


    1)创建scrapy项目


        terminal下输入:scrapy startproject tutorial   
        切换目录: cd tutorial  
        
        执行上述命令后,自动的创建了scrapy项目
        生成了项目目录-tutorial
        scrapy.cfg      部署的配置文件
        tutorial/
            __init__.py     初始化文件,暂不操作
            items.py        项目定义文件
            middlewares.py  中间件文件
            pipelines.py    项目管道文件
            settings.py     项目配置文件
            spiders/        爬虫目录

爬虫基础09B—scrapy爬虫_第1张图片

 爬虫基础09B—scrapy爬虫_第2张图片

 爬虫基础09B—scrapy爬虫_第3张图片

 爬虫基础09B—scrapy爬虫_第4张图片

     2)创建爬虫代码


        创建\spiders\quotes_spider.py文件(在爬虫目录spiders下创建爬虫文件quotes_spider.py)
        写入如下内容:

  import scrapy
        
        class QuotesSpider(scrapy.Spider):# 必须继承scarpy.Spider类
            name = 'quotes' #爬虫项目唯一标识
        
            # 创建爬虫方法
            def start_requests(self):
                urls = [
                    'http://quotes.toscrape.com/page/1/',
                    'http://quotes.toscrape.com/page/2/',
                ]
                for url in urls:
                    yield scrapy.Request(url=url, callback=self.parse)
            def parse(self, response):
                page = response.url.split('/')[-2]
                filename = 'quotes-%s.html'%page
                with open(filename, 'wb') as f:
                    f.write(response.body)
                self.log('Saved file %s'%filename)


   3) 爬虫:

 
        terminal下:
            scrapy crawl quotes

--------------------------------------------------------------------------------------------------------------------------------

(综合如上的内容) 

1. scrapy-环境搭建
 

2. scrapy-爬网页-转存文件到本地


    1) terminal下:创建scrapy项目-tutorial
        scrapy startproject tutorial    

        再cd到tutorial

   
        爬取数据的网页是:
            http://quotes.toscrape.com/page/1/
            http://quotes.toscrape.com/page/2/


    2) 在项目目录:
        tutorial/
           tutorial/
            spiders文件夹下创建爬虫代码文件:quotes_spider.py            书写未知的爬虫代码
               

 import scrapy

                class QuotesSpider(scrapy.Spider): #定义类并继承scrapy.Spider
                    name = 'quotes'
                    def start_requests(self):
                        urls = [
                            'http://quotes.toscrape.com/page/1/',
                            'http://quotes.toscrape.com/page/2/'
                        ]
                        for url in urls:
                            yield scrapy.Request(url=url, callback=self.parse)
                    def parse(self, response):
                        page = response.url.split('/')[-2]
                        filename = 'quotes-%s.html'%page
                        with open(filename,'wb') as f:
                            f.write(response.body)
                        self.log('Saved file %s'%filename)

爬虫基础09B—scrapy爬虫_第5张图片

爬虫基础09B—scrapy爬虫_第6张图片


            执行爬虫:
                terminal:scrapy crawl quotes

3. scrapy原理

爬虫基础09B—scrapy爬虫_第7张图片

 爬虫基础09B—scrapy爬虫_第8张图片

 
    1)Scrapy Engine引擎
        负责控制数据流在系统组件的流动,当特定动作发生时触发事件
    2)Scheduler调度器
        从引擎中接收request并且将他们入队
    3)Downloader下载器
        负责获取页面数据并且提供给引擎,之后提供给spider
    4)Spiders爬虫
        它是Scrapy用户编写用于分析response并且获取item或者额外的数据
    5)ItemPiPeline管道
        负责将Spider爬虫提取出来的数据进行持久化保存
    6)Downloader Middleware下载器中间件
        是引擎和下载器之间特定组件,拥有㔘Downloader传递给引擎response
    7)Spider Middleware Spider中间件
        处理spider输入response与输出items和requests

4. Scrapy shell


    http://quotes.toscrape.com/page/1/

    terminal下输入:
        scrapy shell "http://quotes.toscrape.com/page/1/"

        提取标题
        response.css('title')

        提取标题文本
        response.css('title').extract()

        提取标题文本,返回文本内容列表
        response.css('title::text').extract()

        字符串格式的文本内容
        response.css('title::text').extract_first()
        或者
        response.css('title::text')[0].extract()

5. 作业:terminal下的输入和输出内容发送到邮箱[email protected]
    使用scrapy shell 爬取页面信息
    scrapy shell ‘http://quotes.toscrape.com’
    1)找css内容:div标签,属性值是quote
    2)第一段名人名言的内容输出
    3)第一段名人名言的作者输出

4.1 Scrapy作业-Scrapy shell

  1)terminal下:
        scrapy shell "http://quotes.toscrape.com/"

        response:请求后的应答信息
            获取页面内容:
                .css
                .xpath
            返回页面信息:
                extract()
                extract_first()

        获取页面标题
            response.xpath('//title/text()').extract_first()
        第一段
            quote = response.css('div.quote')[0]
        第一段中解析-名言
            title = quote.css('span.text::text').extract_first()
        第一段中解析-作者
            author = quote.css('small.author::text').extract_first()
        第一段中解析-标签
            tags = quote.css('div.tags a.tag::text').extract()

爬虫基础09B—scrapy爬虫_第9张图片

 爬虫基础09B—scrapy爬虫_第10张图片

  遍历整个页面:
            依次输出每段信息
            In [13]: for quote in response.css('div.quote'):
                ...:     text = quote.css('span.text::text').extract_first()
                ...:     author = quote.css('small.author::text').extract_first()
                ...:     tags = quote.css('div.tags a.tag::text').extract()
                ...:     print(dict(text=text,author=author,tags=tags))

        退出交互模式:
            exit


    2)练习:


        1. 创建scrapy项目
            改善爬虫代码:
                下在页面转为打印页面信息
                    text/author/tags
       爬虫基础09B—scrapy爬虫_第11张图片

 爬虫基础09B—scrapy爬虫_第12张图片

爬虫基础09B—scrapy爬虫_第13张图片  

 代码:

    import scrapy

            class QuotesSpider(scrapy.Spider):
                name = 'quote'
                start_urls = [
                    'http://quotes.toscrape.com/page/1',
                    'http://quotes.toscrape.com/page/2'
                ]
                def parse(self, response):  #解析页面
                    for quote in response.css('div.quote'):
                        yield {
                            'text':quote.css('span.text::text').extract_first(),
                            'author':quote.css('small.author::text').extract_first(),
                            'tags':quote.css('a.tag::text').extract()
                        }


2. 写python代码完成数据库创建

    import pymysql
    
    con = pymysql.connect(
        host = 'localhost',
        user = 'root',
        passwd = '123456',
        charset = 'utf8'
    )
    cur = con.cursor()
    cur.execute('CREATE DATABASE doubanmovie CHARACTER set utf8')
    cur.execute('USE doubanmovie')
    cur.execute("""
    CREATE TABLE doubantop250(
    ID INT (3) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    title VARCHAR (100),
    movieinfo VARCHAR (1000),
    star FLOAT (3,1) NOT NULL ,
    quote VARCHAR (300) NOT NULL 
    )
    CHARACTER SET utf8;
    """)
    con.commit()
    cur.close()
    con.close()

scrapy 官方文档:
    https://www.osgeo.cn/scrapy/topics/downloader-middleware.html

5. scrapy命令行工具

2. scrapy命令行工具

    Available commands:
      bench         Run quick benchmark test
      fetch         Fetch a URL using the Scrapy downloader
      genspider     Generate new spider using pre-defined templates
      runspider     Run a self-contained spider (without creating a project)
      settings      Get settings values
      shell         Interactive scraping console
      startproject  Create new project
      version       Print Scrapy version
      view          Open URL in browser, as seen by Scrapy
    ------------------------------------------------------------
    1)scrapy startproject project_name
        在scrapy项目目录下 创建project_name工程
    
    2)scrapy genspider name domain
        在当前的文件夹下创建爬虫,其中name是爬虫的名称
        domain用于生成爬虫文件属性的allowd_domain以及start_urls
        
        scrapy genspider -l
            调用爬虫模板
            Available templates:
              basic
              crawl
              csvfeed
              xmlfeed
              
            scrapy genspider example example.com
            Created spider 'example' using template 'basic' in module:
              myProject.spiders.example
        
    3)scrapy crawl spider_name
        开始爬虫
    
    4)scrapy check
        检查错误
    
    5)scrapy list
        列出当前项目中可用的爬虫代码,按行
    
    6) scrapy edit spider_name
        编辑或调试爬虫代码
        
    7)scrapy fetch url
        使用scrapy下载器对给定的url进行内容输出
    
    8)scrapy view url
        在浏览器中打开给定的url
    
    9)scrapy parse url
        页面解析,解析结果通过callback选项传递
    
    10)scrapy runspider spider_file.py
        运行爬虫文件
    
    11)scrapy version
        查看版本号
    
    12)scrapy bench
        运行快速基准测试

6.Spider文件夹 

2. Spider文件夹:
    爬虫部分完成的操作有哪些?
        抓取网页信息
        提取格式化数据
        
    框架中需要做哪些事情?
        1)生成御用抓取的url然后指定请求方式下下在相应的回调函数
            start_requests():指定了url,callback参数指定parse方法
            parse():获取页面数据
        2)回调函数解析网页,返回带有提取数据的Item对象, Request请求对象,然后执行scrapy下载
        
        3)回调函数中使用parse方法解析
        
        4)从返回数据的item项目中进行持久化  

7. pycharm操作数据库 

 pycharm可以操作数据库
    DataBase->'+'->Data Source->MySQL->
    参数配置:
        HOST
        Database
        User
        Password

爬虫基础09B—scrapy爬虫_第14张图片

 爬虫基础09B—scrapy爬虫_第15张图片

8. scrapy爬豆瓣 

 8.1 scrapy startproject doubanmovie

        切换terminal目录:cd doubanmovie 

爬虫基础09B—scrapy爬虫_第16张图片

 8.2 编辑保存数据的容器文件:items.py

 import scrapy


        class DoubanmovieItem(scrapy.Item):
            # define the fields for your item here like:
            # name = scrapy.Field()
            title = scrapy.Field() # 电影名称
            movieinfo = scrapy.Field() # 电影描述信息
            star = scrapy.Field() # 电影评分
            quote = scrapy.Field() # 电影经典台词
            pass

8.3 切换terminal目录:cd doubanmovie


      创建爬虫文件(terminal下运行)
        scrapy genspider doubanspider douban.com(域名)

      编辑爬虫文件:doubanspider.py

        import scrapy
        from scrapy.http import Request # 发送请求的模块
        from scrapy.selector import Selector # 解析响应的模块方法-选择器
        from doubanmovie.items import DoubanmovieItem # 导入容器
        from urllib.parse import urljoin # url补全功能
       
        #要爬取的对象
        class DoubanspiderSpider(scrapy.Spider):
            name = 'doubanspider'
            allowed_domains = ['douban.com']
            start_urls = ['https://movie.douban.com/top250']

            def parse(self, response):
               
                item = DoubanmovieItem()  # 创建容器
                selector = Selector(response)  # 创建选择器 #解析
                Movies = selector.xpath('')  # 页面中整体电影所在区域(''中是大盒子的xpath)
                # 循环中获取每一项电影信息
                for eachMovie in Movies:
                    # 解析每部电影采集的四条信息
                    title = eachMovie.xpath('').extract()
                    movieinfo = eachMovie.xpath('').extract()
                    star = eachMovie.xpath('').extract()
                    quote = eachMovie.xpath('').extract()
                    if quote:
                        quote = quote[0]
                    else:
                        quote = ''

                    # 解析内容保存至容器
                    item['title'] = title
                    item['movieinfo'] = movieinfo
                    item['star'] = star
                    item['quote'] = quote
                    yield  item

                # 解析多页
                nextLink = selector.xpath('').extract()
                if nextLink:
                    nextLink = nextLink[0]
                    yield Request(urljoin(response.url, nextLink), callback=self.parse)

 8.4 settings.py文件


        加入浏览器代理配置、数据库配置、数据传输配置
            USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'

数据库配置: 

            MYSQL_HOST = 'localhost'
            MYSQL_DBNAME = 'doubanmovie'
            MYSQL_USER = 'root'
            MYSQL_PASSWD = '123456'

管道文件配置: 

            ITEM_PIPELINES = {
               'doubanmovie.pipelines.DoubanmoviePipeline': 300,
            }
爬虫基础09B—scrapy爬虫_第17张图片

 爬虫基础09B—scrapy爬虫_第18张图片

 爬虫基础09B—scrapy爬虫_第19张图片

 爬虫基础09B—scrapy爬虫_第20张图片

 8.5 配置pipelines.py文件(以实现持久化存储)

 # 连接数据库,导入settings.py中数据库配置
        import pymysql
        from doubanmovie import settings

        class DoubanmoviePipeline(object):
            def __init__(self):
                # 创建连接对象属性,读取参数来自于settings.py
                self.connect = pymysql.connect(
                    host = settings.MYSQL_HOST,
                    db = settings.MYSQL_DBNAME,
                    user = settings.MYSQL_USER,
                    passwd = settings.MYSQL_PASSWD,
                    charset = 'utf8',
                    use_unicode = True # unicode编码
                )
                self.cursor = self.connect.cursor() #创建游标
             
            #持久化存储的配置
            def process_item(self, item, spider):
                try:
                    self.cursor.execute("""
                    insert into doubantop250(title, movieinfo, star, quote)
                    value (%s,%s,%s,%s)
                    """,(
                        item['title'],item['movieinfo'],item['star'],item['quote']
                    ))
                    self.connect.commit()
                except Exception as e:
                    print(e)
                return item

    8.6 爬:scrapy crawl doubanspider

你可能感兴趣的:(爬虫基础,爬虫,python,开发语言)