class RandomProxiesDownloadmidderware(object):
? ? def __init__(self, proxies):
? ? ? ? self.proxies= proxies
@classmethod
? ? def from_crawler(cls, crawler):
? ? ? ? proxies= crawler.sittings['PROXIES']
? ? ? ? return cls(proxies)
? ? def process_request(self, spider, request):
? ? ? ? dict_proxy = random.choice(self.proxies)
REQUEST
url: 就是需要請求莺琳,并進行下一步處理的url
callback: 指定該請求返回的Response套媚,由那個函數(shù)來處理猜憎。
method: 請求一般不需要指定,默認GET方法季蚂,可設置為"GET", "POST", "PUT"等,且保證字符串大寫
headers: 請求時撑刺,包含的頭文件爸吮。一般不需要。內容一般如下:# 自己寫過爬蟲的肯定知道Host:media.readthedocs.orgUser-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0Accept: text/css,/;q=0.1Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateReferer:http://scrapy-chs.readthedocs.org/zh_CN/0.24/Cookie: _ga=GA1.2.1612165614.1415584110;Connection: keep-aliveIf-Modified-Since: Mon, 25 Aug 2014 21:59:35 GMTCache-Control: max-age=0
meta: 比較常用悲没,在不同的請求之間傳遞數(shù)據使用的篮迎。字典dict型
? request_with_cookies = Request(
? ? ? url="http://www.example.com",
? ? ? cookies={'currency': 'USD', 'country': 'UY'},
? ? ? meta={'dont_merge_cookies': True}
? )
encoding: 使用默認的 'utf-8' 就行。
dont_filter: 表明該請求不由調度器過濾示姿。這是當你想使用多次執(zhí)行相同的請求,忽略重復的過濾器甜橱。默認為False。
errback: 指定錯誤處理函數(shù)
RESPONSE
status: 響應碼
_set_body(body): 響應體
_set_url(url):響應url
self.request= request (request對象)
self.headers= Headers (響應頭)
scrapy框架
Scrapy Engine(引擎): 負責Spider栈戳、ItemPipeline岂傲、Downloader、Scheduler中間的通訊子檀,信號镊掖、數(shù)據傳遞等乃戈。
Scheduler(調度器): 它負責接受引擎發(fā)送過來的Request請求,并按照一定的方式進行整理排列堰乔,入隊偏化,當引擎需要時,交還給引擎镐侯。
Downloader(下載器):負責下載Scrapy Engine(引擎)發(fā)送的所有Requests請求侦讨,并將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理苟翻,
Spider(爬蟲):它負責處理所有Responses,從中分析提取數(shù)據韵卤,獲取Item字段需要的數(shù)據,并將需要跟進的URL提交給引擎崇猫,再次進入Scheduler(調度器)沈条,
Item Pipeline(管道):它負責處理Spider中獲取到的Item,并進行進行后期處理(詳細分析诅炉、過濾蜡歹、存儲等)的地方.
Downloader Middlewares(下載中間件):你可以當作是一個可以自定義擴展下載功能的組件。
Spider Middlewares(Spider中間件):你可以理解為是一個可以自定擴展和操作引擎和Spider中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)
安裝方式? sudo pip3 install scrapy
新建項目
????????? scrapy startproject 爬蟲項目名稱
???????? 進入項目涕烧,再次進入項目文件夾月而,在進入spdeers執(zhí)行以下命令
?????????????????? scrapy genspider 爬蟲文件名稱 域名
????? 使用pycharm打開,配置 虛擬環(huán)境议纯,配置需要的settings,在爬蟲文件中爬取所需要的數(shù)據父款,以及起始的url,在items中定義字段
???? yield 的作用就是把一個函數(shù)變成一個 generator(生成器)瞻凤,帶有 yield 的函數(shù)不再是一個普通函數(shù)憨攒,Python 解釋器會將其視為一個????? generator,帶有yeild的函數(shù)遇到y(tǒng)eild的時候就返回一個迭代值阀参,下次迭代時肝集,代碼從 yield 的下一條語句繼續(xù)執(zhí)行,而函數(shù)的本地變量看起來和上次中斷執(zhí)行前是完全一樣的蛛壳,于是函數(shù)繼續(xù)執(zhí)行包晰,直到再次遇到 yield。
scrapy crawl 項目名稱啟動項目
數(shù)據持久化炕吸,也就是將爬取到的數(shù)據存放到數(shù)據庫中,一般有mysql mongod redis, 想要存放數(shù)據勉痴,首先要激活管道文件赫模,在settings中items打開
# 將數(shù)據存儲在mongodb中
? ? def __init__(self,host,port,dbname,sheetname):
? ? ? ? # 創(chuàng)建MONGODB數(shù)據庫鏈接
? ? ? ? client = pymongo.MongoClient(host=host, port=port)
? ? ? ? # 指定數(shù)據庫
? ? ? ? mydb = client[dbname]
? ? ? ? # 存放數(shù)據的數(shù)據庫表名
? ? ? ? self.mysheet = mydb[sheetname]
? ? @classmethod
? ? def from_crawler(cls, crawler):
? ? ? ? host = crawler.settings["MONGODB_HOST"]
? ? ? ? port = crawler.settings["MONGODB_PORT"]
? ? ? ? dbname = crawler.settings["MONGODB_DBNAME"]
? ? ? ? sheetname = crawler.settings["MONGODB_SHEETNAME"]
? ? ? ? return cls(host,port,dbname,sheetname)
? ? def process_item(self,item,spider):
? ? ? ? data = dict(item)
? ? ? ? # mongodb數(shù)據插入語句,使用save保存數(shù)據的效率會很慢蒸矛,因為它需要循環(huán)便利瀑罗,操作費時
? ? ? ? self.mysheet.insert(data)
? ? ? ? return item
通用爬蟲
scrapy genspider -t crawl 爬蟲文件 域名
rules
CrawlSpider使用rules屬性來決定爬蟲的爬取規(guī)則胸嘴,并將匹配后的url請求提交給引擎,完成后續(xù)的爬取工作。
link_extractor:是一個Link Extractor對象斩祭,用于定義需要提取的鏈接劣像。
callback: 從link_extractor中每獲取到鏈接得到Responses時,會調用參數(shù)所指定的值作為回調函數(shù)摧玫,該回調函數(shù)接收一個response作為其一個參數(shù)耳奕。
follow:是一個布爾(boolean)值,指定了根據該規(guī)則從response提取的鏈接是否需要跟進诬像。如果callback為None屋群,follow 默認設置為True ,否則默認為False坏挠。
process_links:指定spider中哪個的函數(shù)將會被調用芍躏,從link_extractor中獲取到鏈接列表時將會調用該函數(shù)。該方法主要用來過濾降狠。
process_request:指定處理函數(shù)对竣,根據該Rule提取到的每個Request時,該函數(shù)將會被調用榜配,可以對Request進行處理否纬,該函數(shù)必須返回Request或者None
主要參數(shù):
allow:滿足括號中“正則表達式”的URL會被提取,如果為空芥牌,則全部匹配烦味。
deny:滿足括號中“正則表達式”的URL一定不提取(優(yōu)先級高于allow)壁拉。
allow_domains:會提取的鏈接的domains谬俄。
deny_domains:一定不會被提取鏈接的domains。
restrict_xpaths:使用xpath表達式弃理,和allow共同作用過濾鏈接溃论。
第一步:根據要爬取的網頁確定需要保存的字段
第二步:編寫爬蟲類
LinkExtractor實例對象
LinkExtractor方法中的常用的參數(shù)
allow : LinkExtractor對象最重要的參數(shù)之一,這是一個正則表達式痘昌,必須要匹配這個正則表達式(或正則表達式列表)的URL才會被提取钥勋,如果沒有給出(或為空), 它會匹配所有的鏈接?
deny : 用法同allow,只不過與這個正則表達式匹配的URL不會被提取)?它的優(yōu)先級高于 - allow 的參數(shù)辆苔,如果沒有給出(或None), 將不排除任何鏈接?
allow_domains:包含了spider允許爬取的域名(domain)列表(list)
deny_domains=():包含了spider不允許爬取的域名(domain)列表(list)
通用爬蟲的起始url不會獲得響應算灸,如果需要,需要重現(xiàn)def parse_start_url(self, response):方法