Scrapy框架的學習(2.scrapy入門,簡單爬取頁面,並使用管道(pipelines)儲存資料)
上個部落格寫了: Scrapy的概念以及Scrapy的詳細工作流程 https://blog.csdn.net/wei18791957243/article/details/86154068
1.scrapy的安裝 pip install scrapy
2.建立Scarpy專案:
在cmd中進入到想要建立Scrapy專案的路徑下(最好在已經建立好的pycharm的工程路徑下,就不用匯入Python編譯器等): 輸入命令建立:scrapy startproject scrapy的專案名稱
建立之後,可以在pycharm中檢視已經建立了什麼,一個
items.py 可以預先定義好爬取那些欄位
middlewares.py : 中間鍵
pipelines.py: 管道 , 進行資料的處理以及儲存
settings.py : 整個專案的設定
spiders資料夾; 建立好的爬蟲,建立好是空的
3.生成一個爬蟲
首先cd 建立的scrapy的專案名
然後 scrapy genspider 爬蟲名 域名(即爬取的範圍)
然後進入到pycharm中檢視生成的東西:
4.然後就可以寫爬蟲了, 這是一個專門測試scrapy的爬蟲網站 :http://quotes.toscrape.com/ 裡面是一些名言名句
在剛才建立好的爬蟲名字的py檔案裡面寫。
# -*- coding: utf-8 -*- import scrapy class ScrapetestSpider(scrapy.Spider): name = 'scrapeTest' # 爬蟲名 '''允許爬取的範圍''' allowed_domains = ['quotes.toscrape.com'] '''最開始請求的url地址''' start_urls = ['http://quotes.toscrape.com/'] def parse(self, response): """處理start_url地址對應的響應""" # 爬取頁面上的名言 ret1 = response.xpath("//span[@class='text']//text()") print(ret1)
然後打印出這個名言,
5. 啟動爬蟲的框架:
首先cmd中進入到你剛才建立的專案路徑下。
輸入命令: scrapy crawl 爬蟲名
(1)會打印出很多的東西,包括日誌等等,
(2)看著有點亂,我們可以在settings.py加入下面設定
LOG_LEVEL = "WARNING"
然後在執行命令就可以了 : scrapy crawl 爬蟲名
可以看到爬取的資料都在一個列表當中,列表當中的每個元素是一個Selector物件,
(3). 直接取出當中的資料 extract()方法,可以在程式碼中這樣寫
ret1 = response.xpath("//span[@class='text']//text()").extract()
然後在執行啟動框架,執行命令,可以看到資料就取出來了
有關取值:
當使用extrat_first()的時候,如果xpath寫錯的話,取值的會是一個空值,None
6. pipelines管道的使用,
首先要在pipelines裡面開啟 ,在settings.py裡面把這個註釋去掉就行
是一個字典, 鍵代表位置,值代表距離引擎的遠近,即權重
對值的解釋: 我們可以定義多個pipeline,資料會先進行一個pipeline再進行一個pipeline,進入的pipeline的先後順序就可以通過值來指定。值越小會先執行
爬蟲名字.py:
# -*- coding: utf-8 -*- import scrapy class ScrapetestSpider(scrapy.Spider): name = 'scrapeTest' # 爬蟲名 '''允許爬取的範圍''' allowed_domains = ['quotes.toscrape.com'] '''最開始請求的url地址''' start_urls = ['http://quotes.toscrape.com/'] def parse(self, response): """處理start_url地址對應的響應""" # 爬取頁面上的名言 text = response.xpath("//span[@class='text']//text()").extract() # 爬取頁面上的作者 aut = response.xpath("//small[@class='author']//text()").extract() for li in range(len(text)): item = {} item["author"] = aut[li] item["text"] = text[li] yield item
pipelines.py:# -*- coding: utf-8 -*- # 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 import json class MyspiderPipeline(object): def process_item(self, item, spider): with open("text.txt",'a') as f: f.write(json.dumps(item,ensure_ascii=False)+"\n") return item print("儲存資料成功")
然後開啟框架,檢視儲存的資料text.txt