python實戰|用scrapy爬取噹噹網數據

  • 2019 年 10 月 4 日
  • 筆記

1

說在前面的話

在上一篇文章中我們介紹了scrapy的一些指令和框架的體系,今天咱們就來實戰一下,用scrapy爬取噹噹網(網站其實大家可以隨意找,原理都是一樣)的數據。廢話不多說,看下面↓

2

思路分析

噹噹網:

上圖就是所謂的噹噹網,一個電商網站,我們隨意找一個類別來進行爬取吧

就拿手機的介面來說事!

我們來抓取下圖中紅框的數據:

其實就三個數據,一個手機的名稱以及相關的鏈接和評論的數量

大家可以從上圖中可以看到這幾個數據的標籤位置,我們就可以直接通過xpath來進行簡單的提取,xpath很簡單,不會的朋友百度一下就明白了。

我們爬取完這些數據後就把這些數據存儲到資料庫當中。

3

正式操作啦

首先,因為我們要抓取網頁中的標題、鏈接和評論數,所以我們首先得寫items.py(具體的作用,我上篇文章有講,大家可以去看一下):

# -*- coding: utf-8 -*-    # Define here the models for your scraped items  #  # See documentation in:  # https://doc.scrapy.org/en/latest/topics/items.html    import scrapy      class DangdangItem(scrapy.Item):      # define the fields for your item here like:      # name = scrapy.Field()      title = scrapy.Field()      link = scrapy.Field()      comment = scrapy.Field()

我們需要抓取什麼數據就調用scrapy.Field()這個方法在上面的注釋中官方有給出。

我們在這裡添加完我們需要爬取的哪些數據後,我們在轉向我們的爬蟲文件,我們通過 scrapy genspider dd dangdang.com 創建了一個爬蟲文件dd.py:

# -*- coding: utf-8 -*-  import scrapy  # 我們需要導入這個項目里的items.py中的類  from dangdang.items import DangdangItem  # 導入scrapy中的Request  from scrapy.http import Request  '''  爬取噹噹網上的鏈接等資訊  '''  class DdSpider(scrapy.Spider):      # 這裡是爬蟲的名稱      name = 'dd'      # 這裡是域名      allowed_domains = ['dangdang.com']      # 這裡是我們要爬取的介面      start_urls = ['http://category.dangdang.com/pg1-cid4004279.html']        def parse(self, response):          # 實例化對象          item = DangdangItem()          # 通過分析標籤,我們可以依次得到相關的數據,並將它們賦值給item類中          item["title"] = response.xpath("//a[@name='itemlist-title']/@title").extract()          item["link"] = response.xpath("//a[@name='itemlist-title']/@href").extract()          item["comment"] = response.xpath("//a[@name='itemlist-review']/text()").extract()          # 提交數據,把數據傳送給item類          yield item

我把每一句話的解釋都寫在註解里了,其實這個爬蟲文件才是真正的進行了爬取工作,它把爬取的數據全部傳送給我們之前寫的item.py里的類中,然後我們最後如果需要對數據進行處理,我們就需要進入pipelines.py進行數據的處理(比如添加到資料庫或者寫入txt中等等操作),接下來我們需要把我們所需要的數據存放至資料庫。

在這之前我們需要進行兩個操作!首先進入settings.py中,我們知道這裡是我們整個項目的管理文件,我們找到如下程式碼:

# ITEM_PIPELINES = {      # 'dangdang.pipelines.DangdangPipeline': 300,  # }

我們要把這裡的注釋給去掉,因為我們要去使用pipelines文件進行數據的處理,去掉之後:

ITEM_PIPELINES = {      'dangdang.pipelines.DangdangPipeline': 300,  }

第二個也是在settings.py文件中:

ROBOTSTXT_OBEY = True

我們需要把它修改成False,因為大部分網站都是存在robots文件的,如果為true代表著我們遵循robots規則,這樣會導致我們很多頁面無法爬取,所以需要把它設置成False。

上面這兩步處理之後,我們就可以正式寫pipelines.py文件了(也就是可以正式操作數據了)

# -*- coding: utf-8 -*-  # 導入 pymysql庫,這是python用於連接mysql資料庫的專用庫  import pymysql  # Define your item pipelines here  #  # Don't forget to add your pipeline to the ITEM_PIPELINES setting  # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html      class DangdangPipeline(object):      def process_item(self, item, spider):          #連接資料庫操作          conn = pymysql.connect("localhost", "root", "LS985548459", "dangdang", charset='utf8')          # 循環          for i in range(0, len(item["title"])):              # 獲取每個標題              title = item["title"][i]              # 獲取每個鏈接              link = item["link"][i]              # 獲取每個評論              comment = item["comment"][i]              # 使用mysql語句進行插入數據表              sql = "insert into goods(title,link,comment) values ('"+title+"','"+link+"','"+comment+"');"              try:                 #執行sql語句                 conn.query(sql)                 #提交語句,這句話必須寫,否則無法成功!                 conn.commit()              except Exception as e:                  print(e)          # 關閉連接          conn.close()          return item

同樣我把每一行的解釋都寫在了注釋裡面,如仍有疑問的,可以私聊我~

最後我們通過 scrapy crawl dd –nolog 運行一下我們的爬蟲,運行完後,打開我們的資料庫,發現已經完成添加了!

4

結尾

其實整個項目下來,我們會發現我們的思路很清晰,因為scrapy框架它把每一個步驟分解到不同的文件中解決,這樣更有利於我們去寫好整個項目,所以這裡也要為scrapy框架的開發人員致謝!

由於最近確實很忙,文章可能寫的有點急,如果文章中有錯誤,請私聊我指出,萬分感謝!