Infi-chu:
http://www.cnblogs.com/Infi-chu/
1.框架架構圖:

2.各文件功能
scrapy.cfg 項目的配置文件
items.py 定義了Item數據結構,所有Item的定義都可以放在這里
pipelines.py 定義了Item Pipeline的實現
settings.py 定義了項目的全局配置
middlewares.py 定義了spider 中間件和downloader中間件
spiders 每一個爬蟲的實現,每一個爬蟲對應一個文件
3.創建項目
scrapy startproject 項目名
4.創建爬蟲
cd 項目名稱 scrapy genspider spider名稱 網站域名
創建后會生成一個包含文件名的spider類,其中有三個屬性和一個方法
三個屬性:
name 每個項目唯一的名字
allow_domains 允許爬取的域名
start_urls 在啟動時爬取的URL列表
一個方法:
parse() 默認情況下,被調用start_urls里面的鏈接 構成的請求完成下載執行后,返回的響應就會作為唯一的參數傳遞給這個函數。這個方法是負責解析返回的響應、提取數據或進一步生成要處理的請求
5.創建Item
Item是保存爬蟲的容器,他的使用方法和字典比較類似。
Item需要繼承scrapy.Item類且定義類型是scrapy.Field字段。
能獲取到的內容有比如有text、author、tags
import scrapy
class spider名Item(scrapy.Item):
text=scrapy.Field()
author=scrapy.Field()
tags=scrapy.Field()
6.解析response
在scrapy.Item類中可以直接對response變量包含的內容進行解析
divclass名.css('.text') 帶有此標簽的節點
divclass名.css('.text::text') 獲取正文內容
divclass名.css('.text').extract() 獲取整個列表
divclass名.css('.text::text').extract() 獲取整個列表的內容
divclass名.css('.text::text').extract_first() 獲取第一個
7.使用Item
對新創建的spider進行改寫
import scrapy
from 項目名.item import spider名Item
class spider名Spider(scrapy.Spider):
name = '爬蟲名'
allow_domains = ["quotes.toscrape.com"]
start_urls = ["http://quotes.toscrape.com"]
def parse(self,response):
r = response.css('.quote')
for i in r:
item = spider名Item()
item['text']=i.css['.text::text'].extract_first()
item['author']=i.css['.author::text'].extract_first()
item['tags']=i.css('.tags .tag::text').extract_first()
yield item
8.后續request
前面講了初始頁面的抓取,現在講解之后的頁面怎么抓取
class spider名Spider(scrapy.Spider):
name = '爬蟲名'
allow_domains = ["quotes.toscrape.com"]
start_urls = ["http://quotes.toscrape.com"]
def parse(self,response):
r = response.css('.quote')
for i in r:
item = spider名Item()
item['text']=i.css['.text::text'].extract_first()
item['author']=i.css['.author::text'].extract_first()
item['tags']=i.css('.tags .tag::text').extract_first()
yield item
next_page=response.css('.pager .next a::attr("href")').extract_first()
url=response.urljoin(next_page)
yield scrapy.Request(url=url,callback=self.parse) # url是請求鏈接,callback是回調函數,當指定了回調函數的請求完成之后,獲取到響應,引擎將把這個響應作為參數傳遞給這個回調函數,回調函數將進行解析或生成下一個請求。
9.運行
scrapy crawl spider名
10.保存
#保存到JSON文件 scrapy crawl spider名 -o spider名.json # 輸入 # 輸出 scrapy crawl spider名 -o spider名.jl scrapy crawl spider名 -o spider名.jsonlines scrapy crawl spider名 -o spider名.csv scrapy crawl spider名 -o spider名.pickle scrapy crawl spider名 -o spider名.xml scrapy crawl spider名 -o spider名.marshal scrapy crawl spider名 -o ftp://username:password@.../spider名.xml
11.使用Item Pipeline
如果想存入到數據庫或篩選有用的Item,此時需要用到我們自己定義的Item Pipeline
我們一般使用Item Pipeline做如下操作
清理HTML數據
驗證爬取數據,檢查爬取字段
查重並丟棄重復內容
將爬取結果保存到數據庫
在pipelines.py文件中編寫
import pymongo
from scrapy.exceptions import DropItem
class TextPipeline(obj):
def __init__(self):
self.limit=50
def process_item(self,item,spider):
if item['text']:
if len(item['text']) > self.limit:
item['text'] = item['text'][0:self.limit].rstrip()+'...'
return item
else:
return DropItem('Missing Text')
class MongoPipeline(obj):
def __init__(self,mongo_uri,mongo_db):
self.mongo_uri=mongo_uri
self.mongo_db=mongo_db
@classmethod
def from_crawler(cls,crawl):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DB')
)
def open_spider(self,spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def process_item(self,item,spider):
name = item.__class__.__name__
self.db[name].insert(dict(item))
return item
def close_spider(self,spider):
self.client.close()
在settings.py中編寫
ITEM_PIPELINES = {
'項目名.pipelines.TextPipeline':300,
'項目名.pipelines.MongoPipeline':400,
}
MONGO_URI = 'localhost'
MONGO_DB = '項目名'
