Python3爬蟲(十七) Scrapy框架(一)


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 = '項目名'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM