CrawlSpider
1.創(chuàng)建項目
scrapy startproject + 項目名稱
2.cd spider
3.scrapy genspider -t ceawl 名稱 + 域
scrapy genspider -t crawl qidian qidian.com
1).繼承的類
2).rules
RULE
linkExtroct
3).不能用parse方法
4).parse_start_url
下載中間件:處于引擎和下載起之間
反爬措施:
1.基于請求頭的反爬(合理構(gòu)建請求頭)(請求頭參數(shù)User-Agent Referer cookie,常見狀態(tài)碼史侣,常見的請求方式)
2.基于cookie的反爬(cookie池,文件存儲,數(shù)據(jù)庫存儲【需要登錄注冊信息時候时呀,需要cookie信息才會用到】)
3.基于IP的反爬(代理,代理的原理,代理怎么獲取,代理如何檢測开财,代理池)
4.基于動態(tài)加載的網(wǎng)頁(ajax,js,jq)(seleium眶拉、無頭矛洞,有頭瀏覽器春叫?selenium)
5.關(guān)于數(shù)據(jù)加密忆植?(js,app,web網(wǎng)頁)
下載中間件的方法
@classmethod
def from_crawler(cls,crawler)
def process_request(self,request,spider)
所有的request請求在交給下載器之前都會經(jīng)過這個方法
# - return None: continue processing this request
# - or return a Response object
# - or return a Request object
# - or raise IgnoreRequest: process_exception() methods of
# installed downloader middleware will be called
def process_response(self,request,response,spider)
所有的響應(yīng)結(jié)果會經(jīng)過這個方法
# - return a Response object
# - return a Request object
# - or raise IgnoreRequest
def process_exception(self,request,exception,spider)
#處理異常錯誤
中間件:
User-Agent
Cookies
IP
Selenium
激活中間件(settings.py):中間件后面的數(shù)值越小,優(yōu)先級越高
DOWNLOADER_MIDDLEWARES = {
# 'downloadmiddlerware.middlewares.DownloadmiddlerwareDownloaderMiddleware': 543,
# 'downloadmiddlerware.middlewares.UserAgentDownloadMiddlerware':543,
'downloadmiddlerware.middlewares.SeleniumDownloadMiddlerWare':543,
}
下載cookie中間件視為了 在每次發(fā)起請求是可以攜帶多個不同的用戶發(fā)起請求
setting.py
COOKIE = [
{'cookie1':'xxxxx'},
{'cookie2':'xxxxx'},
{'cookie3':'xxxxx'},
{'cookie4':'xxxxx'}
]
scrapy并不支持動態(tài)網(wǎng)頁的加載
設(shè)置selenium中間件
class SeleniumDownloadXXXXX(object):
#設(shè)置瀏覽器加載
self.drive = webdriver.Chrome(
executable_path=''
)
self.drive.set_page_load_timeout(10)
def process_request(self,request,spider)
關(guān)于爬蟲的斷電爬取:
scrapy crawl 項目名稱 -s JOBDIR=crawls/爬蟲名稱 項目路徑
request.queue:保存的請求的任務(wù)隊列
request.seen:保存的是指紋
spider.status:爬蟲運(yùn)行的狀態(tài)
scrapy settings.py設(shè)置文件(相關(guān)參數(shù))
分布式
pip3 install scrapy-redis
修改設(shè)置文件
(1)#設(shè)置去重組件,使用的是scrapy_redis的去重組件,而不再使用scrapy框架
自己的去重組件了
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
(2)#設(shè)置調(diào)度器,使用的是scrapy_redis重寫的調(diào)度器,而不再使用scrapy框架
自帶的調(diào)度器了
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
(3)#可以實現(xiàn)斷點爬绕贪铡(請求的記錄不會丟失,會存儲在redis數(shù)據(jù)庫中,
不會清除redis的任務(wù)隊列)
SCHEDULER_PERSIST = True
(4)#設(shè)置任務(wù)隊列的模式(三選一)
SpiderPriorityQueue是scrapy_redis默認(rèn)使用的隊列模式
(有自己的優(yōu)先級)
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
使用了隊列的形式,任務(wù)先進(jìn)先出
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
采用了棧的形式,任務(wù)先進(jìn)后出
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
(5)
實現(xiàn)這個管道,可以將爬蟲端獲取的item數(shù)據(jù),統(tǒng)一保存
在redis數(shù)據(jù)庫中
'scrapy_redis.pipelines.RedisPipeline': 400,
(6)
指定要存儲的redis數(shù)據(jù)庫的主機(jī)ip
REDIS_HOST = '127.0.0.1'
指定redis數(shù)據(jù)庫主機(jī)的端口
REDIS_PORT = 6379
"xcfCrawlSpider:requests":存儲的是請求的request對象
"xcfCrawlSpider:items":存儲的爬蟲端獲取的items數(shù)據(jù)
"xcfCrawlSpider:dupefilter":存儲的指紋(為了實現(xiàn)去重)
127.0.0.1:6379> type xcfCrawlSpider:requests
zset
127.0.0.1:6379> type xcfCrawlSpider:items
list
127.0.0.1:6379> type xcfCrawlSpider:dupefilter
set
第一中情況:只設(shè)置settings.py文件,并沒有實現(xiàn)分布式,知識使用了sctapy_redis的數(shù)據(jù)存儲和去重功能
第二中情況:實現(xiàn)通用爬蟲的分布式爬蟲
from scrapy_redis.spiders import RedisCrawlSpider
#繼承制:RedisCrawlSpider
class MyCrawler(RedisCrawlSpider):
"""Spider that reads urls from redis queue (myspider:start_urls)."""
name = 'mycrawler_redis'
allowed_domains = ['dmoz.org']
#缺少了start_url,多了redis_key:根據(jù)redis_key從redis
#數(shù)據(jù)庫中獲取任務(wù)
redis_key = 'mycrawler:start_urls'
啟動爬蟲:scrapy crawl 爬蟲名稱
現(xiàn)象:爬蟲處于等待狀態(tài)
需要設(shè)置起始任務(wù):
lpush mycrawler:start_urls 目標(biāo)url
第三中情況:實現(xiàn)scrpy.spider爬蟲的分布式爬蟲
from scrapy_redis.spiders import RedisSpider
#繼承制:RedisSpider
class MyCrawler(RedisSpider):
"""Spider that reads urls from redis queue (myspider:start_urls)."""
name = 'mycrawler_redis'
allowed_domains = ['dmoz.org']
#缺少了start_url,多了redis_key:根據(jù)redis_key從redis
#數(shù)據(jù)庫中獲取任務(wù)
redis_key = 'mycrawler:start_urls'
啟動爬蟲:scrapy crawl 爬蟲名稱
現(xiàn)象:爬蟲處于等待狀態(tài)
需要設(shè)置起始任務(wù):
lpush mycrawler:start_urls 目標(biāo)url
dmoz.py