之前在寫爬蟲時,都是自己寫整個爬取過程,例如向目標網站發起請求、解析網站、提取數據、下載數據等,需要自己定義這些實現方法等
這個周末把之前買的一個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