Scrapy框架爬取豆瓣

Scrapy框架爬取豆瓣

参考链接:https://blog.csdn.net/qq_38588845/article/details/98256172

下载Scrapy

  • 下载命令
    conda install scrapy(使用这个命令必须安装Anaconda)
  • 验证是否安装成功
    在cmd窗口输入【scrapy】,回车,出现使用方法表示安装成功

使用Scrapy框架爬取豆瓣

  • 新建项目
    在预备创建项目的路径下打开cmd窗口,输入命令scrapy startproject project01,创建一个名为project01的项目,项目的目录结构如下。
    create scrapy project
    contents structure

  • 编辑爬虫

    1. 在spider下新建一个top250.py文件

      top250.py
      
      import scrapy
      import bs4
      from ..items import Project01Item
      
      
      class DoubanSpider(scrapy.Spider):
          # 定义一个爬虫类DoubanSpider
          name = 'book_douban'
          # name是定义爬虫的名字,这个名字是爬虫的唯一标识。
          # name = 'book_douban'意思是定义爬虫的名字为book_douban。
          # 等会我们启动爬虫的时候,要用到这个名字。
      
          allowed_domains = ['book.douban.com']
          # allowed_domains是定义允许爬虫爬取的网址域名(不需要加https://)。
          # 如果网址的域名不在这个列表里,就会被过滤掉。
      
          start_urls = ['https://book.douban.com/top250?start=0']
          # start_urls是定义起始网址,就是爬虫从哪个网址开始抓取。
          # 并且allowed_domains的设定对start_urls里的网址不会有影响。
      
          # for x in range(3):
          #     url = f'https://book.douban.com/top250?start={x * 25}'
          #     start_urls.append(url)
      
          def parse(self, response):
              # parse是默认处理response的方法
      
              bs = bs4.BeautifulSoup(response.text, 'html.parser')
      
              # 用BeautifulSoup解析response
      
              datas = bs.find_all('tr', class_="item")
      
              # 用find_all提取<tr class="item">元素,这个元素里含有书籍信息
              for data in datas:
      
                  # 遍历data
      
                  item = Project01Item()
      
                  # 实例化DoubanItem这个类
      
                  item['title'] = data.find_all('a')[1]['title']
      
                  # 提取出书名,并把这个数据放回DoubanItem类的title属性里
      
                  item['publish'] = data.find('p', class_='pl').text
      
                  # 提取出出版信息,并把这个数据放回DoubanItem类的publish里
      
                  item['score'] = data.find('span', class_='rating_nums').text
      
                  # 提取出评分,并把这个数据放回DoubanItem类的score属性里。
      
                  print(item['title'])
      
                  # 打印书名
      
                  yield item
      
                  # yield item是把获得的item传递给引擎
      
    2. 编辑item.py文件

      item.py
      import scrapy
      
      
      class Project01Item(scrapy.Item):
          # define the fields for your item here like:
          # name = scrapy.Field()
          # 定义书名的数据属性
          title = scrapy.Field()
          # 定义出版信息的数据属性
          publish = scrapy.Field()
          # 定义评分的数据属性
          score = scrapy.Field()
          pass
      
    3. 更新部分setting.py设置

      setting.py
      # Crawl responsibly by identifying yourself (and your website) on the user-agent
      USER_AGENT = 'project01 (+http://www.yourdomain.com)'
      
      # Obey robots.txt rules
      ROBOTSTXT_OBEY = True  # 遵循robots协议
      LOG_LEVEL = 'WARNING'  # 设置log打印等级,筛选打印信息
      
  • 运行爬虫
    根目录下新建一个main.py运行程式即可输出打印信息

    main.py
    from scrapy import cmdline
    
    #导入cmdline模块,可以实现控制终端命令行
    
    cmdline.execute(['scrapy','crawl','book_douban'])
    
    #用execute()方法,输入运行scrapy的命令
    
    New contents structure results

Scrapy调用分析

参考链接:https://blog.csdn.net/qq_38486203/article/details/80349491

  • Scrapy流程图
    flow chart

  • 执行步骤
    先明确对应关系
    SPIDERS -- spiders\top250.py
    ITEM PIPLINES -- item.py & piplines.py
    MIDDLEWARE -- middlewares.py

  1. spiders向爬虫引擎发出初始请求'''https://book.douban.com/top250?start=0'''
  2. 爬虫引擎将请求'''https://book.douban.com/top250?start=0'''放入调度器队列
  3. 调度器返回请求URL'''https://book.douban.com/top250?start=0'''给爬虫引擎
  4. 爬虫引擎请求下载'''https://book.douban.com/top250?start=0'''
  5. 下载器将从INTERNET中下载的数据(此处为HTML)返回给爬虫引擎
  6. 爬虫引擎将下载的数据通过中间件交给spiders处理(通过bs4获取item的属性title,publish, score)
  7. 爬虫通过中间件返回处理后的items,以及新的请求给引擎。
  8. items的值就存放在ITEM PIPLINES中,可以在piplines.py中print(items)得到相应结果。出现打印信息的前提是在setting.py中打开item_piplines。'''ITEM_PIPELINES = {'project01.pipelines.Project01Pipeline': 300,}''',新的请求则放入调度器的队列中。
posted @ 2022-05-26 10:58  o云淡风轻o  阅读(271)  评论(0编辑  收藏  举报