一、當當網
1. 保存數據
??????? 數據交給pipelines保存
items中的類名:??DemoNddwItem
class DemoNddwItem(scrapy.Item):
????????變量名 = 類名()
book = DemoNddwItem(src = src, name = name, price = price)
導入:
??????? from 項目名.items import 類名
from demo_nddw.items import NddwSpider
2. yield
??????? return一個返回值
yield book:
??????? 獲取一個book,就將book交給pipelines
3. pipelines(管道):
????????想使用管道,必須在settings中開啟管道:
如何開啟——》解除管道的注釋即可開啟管道
?管道可以有很多個
管道是有優先級的:
??????? 優先級范圍:1~1000
??????? 值越小,優先級越高
?pipelines.py
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapterclass DemoNddwPipeline:
#爬蟲文件開始前執行的方法def open_spider(self, spider)self.fp('book.json', 'w', encoding='utf-8')# items:yield后面的book對象def process_item(self, item, spider):
# #以下模式不推薦:因為每傳進一個對象,就打開一次文件,對文件的操作過于頻繁
# #2個方法
# #1)爬蟲文件開始前執行的方法
# def open_spider(self,spider)
# self.fp('book.json','w',encoding = 'utf-8')
# #2)爬蟲文件執行完成后執行的方法
# def close_spider(self,spider)
# self.fp.close()
# # 中間
# self.fp.write(str(item))#將數據保存到文件中# (1)write方法必須是一個字符串強制轉換:fp.write(item)——》fp.write(str(item))# (2)w模式會每一個對象都打開一次文件,后面打開的會覆蓋前面打開的,然后關閉:將w模式改為a(追加)模式:解決:‘w’——》‘a’#不推薦的模式# with open('book.json','a',encoding='utf-8') as fp:# fp.write(str(item))
#中間self.fp.write(str(item))return item
#爬蟲文件執行完成后執行的方法
def close_spider(self,spider)self.fp.close()
?不推薦的模式:
# #以下模式不推薦:因為每傳進一個對象,就打開一次文件,對文件的操作過于頻繁#將數據保存到文件中# (1)write方法必須是一個字符串強制轉換:fp.write(item)——》fp.write(str(item))# (2)w模式會每一個對象都打開一次文件,后面打開的會覆蓋前面打開的,然后關閉:將w模式改為a(追加)模式:解決:‘w’——》‘a’#不推薦的模式# with open('book.json','a',encoding='utf-8') as fp:# fp.write(str(item))
2個方法:
# #2個方法
# #1)爬蟲文件開始前執行的方法
# def open_spider(self,spider)
# self.fp('book.json','w',encoding = 'utf-8')
# #2)爬蟲文件執行完成后執行的方法
# def close_spider(self,spider)
# self.fp.close()
# # 中間
# self.fp.write(str(item))
????? 復制items中的類名:DemoNddwItem
導入ddw中,
from demo_nddw.items import DemoNddwItem
并在ddw中使用
book = DemoNddwItem(src = src, name = name, price = price)
ddw.py
import scrapy
from demo_nddw.items import DemoNddwItemclass NddwSpider(scrapy.Spider):name = "nddw"allowed_domains = ["category.dangdang.com"]start_urls = ["https://category.dangdang.com/cp01.07.30.00.00.00.html"]def parse(self, response):# pass# src、name、price都有共同的li標簽# 所有的selector對象,都可以再次調用xpath方法li_list = response.xpath('//ul[@id = "component_59"]/li')for li in li_list:# .extract()提取數據# 有data-original,src用data-original替代src = li.xpath('.//img/@data-original').extract_first()# 第一張圖片和其他圖片標簽不一樣,第一張圖片的src是可以使用的 其他圖片的地址是data-originalif src:src = srcelse:# 用srcsrc = li.xpath('.//img/@src').extract_first()alt = li.xpath('.//img/@alt').extract_first()price = li.xpath('.//p[@class = "price"]/span[1]/text()').extract_first()print(src, name, price)book = DemoNddwItem(src = src, name = name, price = price)# yield:return一個返回值#獲取一個book,就將book交給pipelinesyield book# pipelines(管道):想使用管道,必須在settings中開啟管道:如何開啟——》解除管道的注釋即可開啟
# ITEM_PIPELINES = {
# "demo_nddw.pipelines.DemoNddwPipeline": 300,
# }
items.py
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass DemoNddwItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# pass# 圖片# src = // ul[ @ id = "component_59"] / li // img / @ srcsrc = scrapy.Field()# 名字# alt = // ul[ @ id = "component_59"] / li // img / @ altname = scrapy.Field()# 價格# price = //ul[@id = "component_59"]/li//p[@class = "price"]/span[1]/text()price = scrapy.Field()
4. scrapy使用步驟
1)在終端中創建項目
????????scrapy startproject 項目名
2)切換到項目下的spiders目錄
??????? cd 項目名\項目名\spider
3)在spiders中創建文件
??????? scrapy genspider 文件名? 要爬取的網頁
4)運行
??????? scrapy crawl 文件名