整體結構
其中,python是整個scrapy的根目錄。items定義要爬取的數據;pipeline將爬取得數據進行保存;setting是負責整體的調控,控制是否遵守協議、啓用哪一個spider爬取、爬取pipeline的順序等。
spider文件下的爬蟲的主體文件。
創建
打開cmd,輸入scrapy startproject name(name是工程名),即可以創建一個工程文件夾,包含以上文件,在cd spider,輸入 scrapy genspider spidername website(spidername是爬蟲名字,website是爬取的網站),一個爬蟲基礎文件創建成功。
另外:
scrapy shell website可以方標調試xpath,即需要抽取的内容。
items
定義一個類,繼承scrapy.item的基類;本次爬取得什麽值得買網站上流信息内容;所以定義一個smzdmitem
class smzdmitem(scrapy.Item):
pagetitle = scrapy.Field() # 標題
price = scrapy.Field() #價格
des = scrapy.Field() #描述
spider主體文件
spider文件下是爬蟲的主要執行文件,整個目錄下可以包含很多個爬蟲,本次只寫了一個爬蟲。
import scrapy
from python.items import smzdmitem ##從python目錄下的items文件裏導入 smzdmitem類
class SmzdmSpider(scrapy.Spider):
name = 'smzdm' #爬蟲的命名
allowed_domains = ['smzdm.com']
start_urls = ['http://smzdm.com/'] #起始爬取的網頁
def parse(self, response):
sels=response.xpath('//*[@id="feed-main-list"]/li') #response是返回的所有内容,采用xpath定義路徑,方便後面進行内容分析
items=[] #生成一個列表
for sel in sels:
item=smzdmitem() #列表繼承
item['pagetitle']=sel.xpath('h5/a/text()').extract()
item['price']=sel.xpath('h5/a/span').extract()
item['des']=sel.xpath('div/div[2]/div[2]').extract()
#抽取相應的内容
items.append(item) #增加在列表中
return items
#此返回非常重要,注意縮進的位置,有此返回才能夠讓pipeline保存相應的内容
pipeline
此文夾下可以定義一個函數,process_item,表示在爬蟲運行過程中,需要產生的動作:
import time
import codecs
# 引入編碼和時間内容
class smzdmpipeline(object):#重新定義一個類,繼承object
def process_item(self,item,spider):#運行過程函數
today = time.strftime('%y-%m-%d', time.localtime())
#獲取本地時間
filename = '什麽值得買' + today + '.txt'
#保存文件名命名
with codecs.open(filename, 'a+', 'utf-8')as fp:
#創建文件
fp.write('%s \r\n %s \r\n %s \r\n'
%(item['pagetitle'],item['price'],item['des']))
#寫入文件,并保存
return item
setting
在configure item pipeline處加入一個
ITEM_PIPELINES = {
'python.pipelines.smzdmpipeline':1
} #定義pipeline的順序,後面的數字越小,越早執行(在有多個pipeline的情況下
setting文件裏可以定義多項設置