scrapy爬蟲筆記(1):提取首頁圖片下載鏈接


之前在寫爬蟲時,都是自己寫整個爬取過程,例如向目標網站發起請求、解析網站、提取數據、下載數據等,需要自己定義這些實現方法等

這個周末把之前買的一個scrapy爬蟲課程翻了出來(拉鈎教育《52講輕松搞定網絡爬蟲》,有興趣的可以去看看),初步學習了一下scrapy的使用方法,剛好把以前寫好的一個爬蟲用scrapy改造一下,加深學習印象,也好做個對比

 

本次爬取的網站仍然是圖片素材網站:https://imgbin.com/free-png/water

之前的爬蟲過程如下:https://www.cnblogs.com/hanmk/p/12747093.html

scrapy官方文檔:https://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/overview.html

 

接下來使用scrapy來爬取該網站的圖片素材,本節的目標是:提取圖片的下載url,並且只提取第一頁,暫時不做后續處理

1.網站分析

 

如上,一個圖片占用一個div標簽,定位到div下的img標簽,然后提取 data-original屬性的內容即可

因為這次只提取這一頁的圖片,所以可以先不考慮翻頁導致url的變化(后續會逐步完善)

2.新建一個scrapy項目

打開cmd命令行窗口或者打開pycharm並切換到Terminal終端,任意切換到一個目錄,然后輸入如下命令

scrapy startproject imgbin

3.新建一個spider

進入剛剛創建好的項目目錄,執行如下命令

scrapy genspider images imgbin.com

完成上述步驟后,會得到如下工程文件目錄

4.編輯items.py

import scrapy


class ImgbinItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    img_src = scrapy.Field()

因為我只需要提取圖片下載鏈接,所以這里也只定義了一個字段用來存儲提取到的圖片url

5.編寫spider文件,解析response

import scrapy
from scrapy import Request
from imgbin.items import ImgbinItem

class ImagesSpider(scrapy.Spider):
    name = 'images'
    allowed_domains = ['imgbin.com']
    start_urls = ['http://imgbin.com/']


    def start_requests(self):
        base_url = "https://imgbin.com/free-png/naruto"
        yield Request(url=base_url, callback=self.parse)

    def parse(self, response):
        images = response.xpath("//img[@class='photothumb lazy']")

        for image in images:
            item = ImgbinItem()
            item["img_src"] = image.xpath("./@data-original").extract_first()
            yield item

(1) 首先導入了 Request 模塊以及定義好的 ImgbinItem

(2) ImagesSpider類下有3個屬性

  • name: 用於區別Spider。 該名字必須是唯一的,也可以為不同的Spider設定相同的名字;

  • allowed_domains:允許爬取的域名,如果初始或后續的請求鏈接不是這個域名下的,則請求鏈接會被過濾掉;

  • start_urls: 包含了Spider在啟動時進行爬取的url列表。 如果當沒有定義 start_requests() 方法,默認會從這個列表開始抓取;

(3) 定義了 start_requests()方法

(4) 完善parse()方法

parse() 是spider的一個方法。 被調用時,每個初始URL完成下載后生成的 Response 對象將會作為唯一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據(生成item)以及生成需要進一步處理的URL的 Request 對象。

images = response.xpath("//img[@class='photothumb lazy']"),使用xpath方式提取所有class屬性為 photothumb lazy 的img標簽,並將其賦給變量images;
item["img_src"] = image.xpath("./@data-original").extract_first(),利用for循環遍歷所有images標簽,並逐個提取內部的圖片下載鏈接,並賦值給item中的"img_src"字段。注意"./@data-original",表示提取當前img標簽里面的數據;
yield item,將最后的item對象返回

這樣,第一頁的所有圖片的下載鏈接就都提取出來了

6.運行查看結果

打開cmd窗口,進入項目目錄,執行以下命令

scrapy crawl images

結果如下,打印出了一個個圖片下載鏈接

 將結果存儲到json文件中

scrapy crawl images -o img.json

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM