scrapy
scrapy startproject教程複製代碼
scrapy.cfg#Scrapy部署時的配置文件
教程#項目的模塊,須要從這裏引入
__init__.py
items.py#Items的定義,定義爬取的數據結構
middlewares.py#Middlewares的定義,定義爬取時的中間件
pipelines.py#管道的定義,定義數據管道
settings.py#配置文件
蜘蛛#放置蜘蛛的文件夾
__init__.py複製代碼
scrapy.Spider
光盤教程
scrapy genspider報價複製代碼
genspider
import scrapy
class QuotesSpider (scrapy.Spider):
name = 「quotes」
allowed_domains = [ 「quotes.toscrape.com」 ]
start_urls = [ 'http://quotes.toscrape.com/' ]
def parse (self,response):
經過複製代碼
name
allowed_domains
start_urls
parse
name
css
allowed_domains
html
start_urls
git
parse
github
start_urls
scrapy.Item
scrapy.Field
text
author
tags
import scrapy
class QuoteItem (scrapy.Item):
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()複製代碼
parse()
resposne
start_urls
parse
response
class
quote
text
author
tags
quote
quote
parse()
高清 解析(個體經營,響應):
報價= response.css( '.quote' )
的報價在報價:
文本= quote.css( ':: .text區段文本').extract_first()
做者= quote.css( 」。 author'text ').extract_first()
tags = quote.css( '.tags .tag :: text').extract()複製代碼
quotes
for
quote
quote
text
class
text
.text
::text
extract_first()
tags
extract()
quote
< div class = 「quote」 itemscope = 「」 itemtype = 「http://schema.org/CreativeWork」 >
< span class = 「text」 itemprop = 「text」 > 「咱們創造它的世界是一個過程,咱們的想法。「 </ span >
< span > by < small class = 」author「 itemprop = 」author「 >阿爾伯特愛因斯坦<
一個 HREF = 「/做者/阿爾伯特-愛因斯坦」 >(約) </ 一 >
</ 跨度 >
< DIV 類 = 「標籤」 >
標籤:
< 元 類 = 「關鍵詞」 itemprop = 「關鍵詞」 內容 = 「變化,深的思想,思惟,世界」 >
< 一 類 = 「標籤」 HREF = 「/標籤/變動/頁/ 1 /」 >變動 </ 一 >
<一個 class =「標記」 HREF = 「/標記/深想法/頁面/ 1 /」 >深思想 </ 一 >
< 一 類 = 「標籤」 HREF = 「/標籤/思惟/頁面/ 1 /」 >思 </ 一 >
< 一 類 = 「標籤」 HREF = 「/標籤/世界/頁面/ 1 /」 >世界 </ 一 >
</ DIV >
</ DIV >複製代碼
[<Selector xpath =「descendant-or-self :: * [@ class and contains(concat('',normalize-space(@class),''),'text')]」data ='<span class = 「text」itemprop =「text」>「The'>]複製代碼
[<Selector xpath =「descendant-or-self :: * [@ class and contains(concat('',normalize-space(@class),''),'text')] / text()」data =' 「咱們創造它的世界是一個公關>]複製代碼
['span class =「text」itemprop =「text」>「咱們創造它的世界是咱們思考的過程。不改變咱們的想法就沒法改變。「</ span>']複製代碼
[''咱們創造的世界是咱們思考的過程。不改變咱們的想法就沒法改變。「']複製代碼
「咱們創造它的世界是咱們思考的過程。若是不改變咱們的想法,它就不能改變。「複製代碼
text
extract_first()
tags
extract()
QuotesSpider
數據庫
進口 scrapy
從 tutorial.items 導入 QuoteItem
類 QuotesSpider (scrapy.Spider) :
名稱= 「引號」
allowed_domains = [ 「quotes.toscrape.com」 ]
start_urls = [ 'http://quotes.toscrape.com/' ]
DEF 解析(個體,響應):
報價= response.css('.quote' )
用於引用在引號:
項= QuoteItem()
項[ '文本' ] = quote.css(':: .text區段文本')。extract_first()
項目['author' ] = quote.css('.author :: text').extract_first()
item [ 'tags' ] = quote.css('.tags .tag :: text').extract()
yield item複製代碼
QuoteItem
url
callback
url
json
callback
bash
parse()
parse()
text
author
tags
parse()
parse()
next = response.css('.pager .next a :: attr(href)').extract_first()
url = response.urljoin(next)
yield scrapy.Request(url = url,callback = self.parse)複製代碼
href
::attr(href)
extract_first()
urljoin()
urljoin()
urljoin()
url
callback
callback
parse()
parse
Spider
進口 scrapy
從 tutorial.items 導入 QuoteItem
類 QuotesSpider (scrapy.Spider) :
名稱= 「引號」
allowed_domains = [ 「quotes.toscrape.com」 ]
start_urls = [ 'http://quotes.toscrape.com/' ]
DEF 解析(個體,響應):
報價= response.css('.quote' )
用於引用在引號:
項= QuoteItem()
項[ '文本' ] = quote.css(':: .text區段文本')。extract_first()
項目['author' ] = quote.css('.author :: text').extract_first()
item [ 'tags' ] = quote.css('.tags .tag :: text').extract()
yield item
next = response.css('.pager .next a :: attr(「href」)').extract_first()
url = response.urljoin(next)
yield scrapy.Request(url = url,callback = self.parse)複製代碼
scrapy抓取報價複製代碼
2017-02-19 13:37:20 [scrapy.utils.log]信息:Scrapy 1.3.0開始(bot:教程)
2017-02-19 13:37:20 [scrapy.utils.log]信息:重寫設置:{'NEWSPIDER_MODULE':'tutorial.spiders','SPIDER_MODULES':['tutorial.spiders'],'ROBOTSTXT_OBEY':True ,'BOT_NAME':'教程'}
2017-02-19 13:37:20 [scrapy.middleware]信息:啓用擴展:
[ 'scrapy.extensions.logstats.LogStats',
'scrapy.extensions.telnet.TelnetConsole',
'scrapy.extensions.corestats.CoreStats']
2017-02-19 13:37:20 [scrapy.middleware]信息:啓用下載中間件:
[ 'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
'scrapy.downloadermiddlewares.retry.RetryMiddleware',
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
'scrapy.downloadermiddlewares.stats.DownloaderStats']
2017-02-19 13:37:20 [scrapy.middleware]信息:啓用蜘蛛中間件:
[ 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
'scrapy.spidermiddlewares.referer.RefererMiddleware',
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddleware']
2017-02-19 13:37:20 [scrapy.middleware]信息:啓用項目管道:
[]
2017-02-19 13:37:20 [scrapy.core.engine]信息:蜘蛛打開
2017-02-19 13:37:20 [scrapy.extensions.logstats]信息:爬行0頁(0頁/分鐘),刮0項(0項/分鐘)
2017-02-19 13:37:20 [scrapy.extensions.telnet] DEBUG:Telnet控制檯監聽127.0.0.1:6023
2017-02-19 13:37:21 [scrapy.core.engine] DEBUG:Crawled(404)<GET http://quotes.toscrape.com/robots.txt>(referer:無)
2017-02-19 13:37:21 [scrapy.core.engine] DEBUG:Crawled(200)<GET http://quotes.toscrape.com/>(referer:無)
2017-02-19 13:37:21 [scrapy.core.scraper]調試:從<200 http://quotes.toscrape.com/刮掉>
{'做者':愛因斯坦愛因斯坦', '標籤':[u'change',u'deep-thoughts',u'thinking',u'world'], '文本':u'\ u201c咱們創造它的世界是咱們思考的過程。不改變咱們的想法就不能改變。\ u201d'} 2017-02-19 13:37:21 [scrapy.core.scraper]調試:從<200 http://quotes.toscrape.com/刮掉> {'做者':u'JK羅琳', 'tags':[u'abilities',u'choices'], '文本':你是咱們的選擇,哈利,這代表咱們真正的存在,遠遠超過咱們的能力。\ u201d'}
...
2017-02-19 13:37:27 [scrapy.core.engine]信息:關閉蜘蛛(完成)
2017-02-19 13:37:27 [scrapy.statscollectors]信息:傾銷Scrapy統計信息:
{'downloader / request_bytes':2859,
'downloader / request_count':11,
'downloader / request_method_count / GET':11,
'downloader / response_bytes':24871,
'downloader / response_count':11,
'downloader / response_status_count / 200':10,
'downloader / response_status_count / 404':1,
'dupefilter / filtered':1,
'finish_reason':'完成',
'finish_time':datetime.datetime(2017,2,19,5,37,27,227438),
'item_scraped_count':100,
'log_count / DEBUG':113,
'log_count / INFO':7,
'request_depth_max':10,
'response_received_count':11,
'調度程序/出隊':10,
'scheduler / dequeued / memory':10,
'調度程序/入隊':10,
'scheduler / enqueued / memory':10,
'start_time':datetime.datetime(2017,2,19,5,37,20,321557)}
2017-02-19 13:37:27 [scrapy.core.engine]信息:蜘蛛關閉(完成)複製代碼
scrapy抓取引號-o quotes.json複製代碼
scrapy抓取引號-o quotes.jl複製代碼
scrapy抓取引號-o引用.jsonlines複製代碼
scrapy抓取引號-o quotes.csv
scrapy抓取引號-o quotes.xml
scrapy抓取引號-o quotes.pickle
scrapy抓取引號-o引用.marshal
scrapy抓取引號-o ftp:// user:pass@ftp.example.com/path/to/quotes.csv複製代碼
process_item()
process_item()
process_item()
微信
item
spider
text
TextPipeline
from scrapy.exceptions import DropItem
class TextPipeline (object):
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'))複製代碼
process_item()
item
spide
item
text
DropItem
item
item
MongoPipeline
導入 pymongo
類 MongoPipeline (object):
def __init__ (self,mongo_uri,mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler (cls,crawler):
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,蜘蛛):
self.client.close()複製代碼
MongoPipeline
cookie
from_crawler
網絡
@classmethod
crawler
crawler
MONGO_URI
MONGO_DB
open_spider
close_spider
process_item()
TextPipeline
MongoPipeline
ITEM_PIPELINES = {
'tutorial.pipelines.TextPipeline':300,
'tutorial.pipelines.MongoPipeline':400,
}
MONGO_URI = 'localhost'MONGO_DB
= 'tutorial'複製代碼
ITEM_PIPELINES
scrapy抓取報價複製代碼
text
text
author
tags
本資源首發於崔慶才的我的博客靜覓: Python3網絡爬蟲開發實戰教程 | 靜覓
如想了解更多爬蟲資訊,請關注個人我的微信公衆號:進擊的Coder
weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)