1. 程式人生 > 其它 >Scrapy框架爬取豆瓣

Scrapy框架爬取豆瓣

Scrapy框架爬取豆瓣

參考連結:https://blog.csdn.net/qq_38588845/article/details/98256172

下載Scrapy

  • 下載命令
    conda install scrapy(使用這個命令必須安裝Anaconda)
  • 驗證是否安裝成功
    在cmd視窗輸入【scrapy】,回車,出現使用方法表示安裝成功

使用Scrapy框架爬取豆瓣

  • 新建專案
    在預備建立專案的路徑下開啟cmd視窗,輸入命令scrapy startproject project01,建立一個名為project01的專案,專案的目錄結構如下。

  • 編輯爬蟲

    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的命令
    

Scrapy呼叫分析

參考連結:https://blog.csdn.net/qq_38486203/article/details/80349491

  • Scrapy流程圖

  • 執行步驟
    先明確對應關係
    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,}''',新的請求則放入排程器的佇列中。