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)
scrapy的項目的步驟
-
1.scrapy startproject 爬蟲項目名稱
-
2.(編寫items.py):明確你想要抓取的目標
items.py文件:自定義字段摩骨,確定要爬取的目標網站數(shù)據
import scrapy
class DoubanItem(scrapy.Item):
# 標題
title = scrapy.Field()
# 是否可播放的狀態(tài)
playable = scrapy.Field()
# 簡介
content = scrapy.Field()
# 評分
star = scrapy.Field()
# 評論數(shù)量
commentnum = scrapy.Field()
# 主題
inq = scrapy.Field()
spiders/douban.py 文件: 爬蟲文件,在這里編寫爬蟲代碼通贞,解析數(shù)據,獲取新的url
name:是項目的名字
allowed_domains:是允許爬取的域名仿吞,比如一些網站有相關鏈接滑频,域名就和本網站不同,這些就會忽略唤冈。
settings.py文件: 設置文件峡迷,在這里設置User-Agent,激活管道文件等...
pipelines.py管道:這里進行數(shù)據的清洗和持久化
-
3.scrapy genspider 爬蟲文件名稱 域名:制作爬蟲開始爬取網頁
-
4. 存儲內容
(pipelines.py):設計管道存儲爬取內容
通過pip安裝scrapy
pip3 install Scrapy
scrapy通用爬蟲
scrapy genspider -t crawl 爬蟲文件 域名
它是Spider的派生類,Spider類的設計原則是只爬取start_url列表中的網頁你虹,而CrawlSpider類定義了一些規(guī)則Rule來提供跟進鏈接的方便的機制绘搞,從爬取的網頁結果中獲取鏈接并繼續(xù)爬取的工作.
CrawlSpider使用rules屬性來決定爬蟲的爬取規(guī)則,并將匹配后的url請求提交給引擎,完成后續(xù)的爬取工作傅物。
在rules中包含一個或多個Rule對象夯辖,每個Rule對爬取網站的動作定義了某種特定操作,比如提取當前相應內容里的特定鏈接董饰,是否對提取的鏈接跟進爬取蒿褂,對提交的請求設置回調函數(shù)等圆米。如果多個rule匹配了相同的鏈接,則根據規(guī)則在本集合中被定義的順序啄栓,第一個會被使用娄帖。
Link Extractors 的目的很簡單: 提取鏈接?
每個LinkExtractor有唯一的公共方法是 extract_links(),它接收一個 Response 對象昙楚,并返回一個 scrapy.link.Link 對象近速。
Link Extractors要實例化一次,并且 extract_links 方法會根據不同的 response 調用多次提取鏈接?
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
爬取規(guī)則(Crawling rules
第一步:根據要爬取的網頁確定需要保存的字段
第二步:編寫爬蟲類 ,LinkExtractor實例對象
request請求和response響應
url: 就是需要請求,并進行下一步處理的url
callback: 指定該請求返回的Response无蜂,由那個函數(shù)來處理伺糠。
method: 請求一般不需要指定,默認GET方法斥季,可設置為"GET", "POST", "PUT"等训桶,且保證字符串大寫
headers: 請求時,包含的頭文件酣倾。一般不需要舵揭。內容一般如下: # 自己寫過爬蟲的肯定知道 Host: [media.readthedocs.org](http://media.readthedocs.org/)User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 Accept: text/css,*/*;q=0.1 Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Referer: [http://scrapy-chs.readthedocs.org/zh_CN/0.24/](http://scrapy-chs.readthedocs.org/zh_CN/0.24/) Cookie: _ga=GA1.2.1612165614.1415584110; Connection: keep-alive If-Modified-Since: Mon, 25 Aug 2014 21:59:35 GMT Cache-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 (響應頭)
如何使用shell
Scrapy Shell根據下載的頁面會自動創(chuàng)建一些方便使用的對象蜡坊,例如 Response 對象,以及 Selector 對象 (對HTML及XML內容)耕漱。
######運行shell:scrapy shell "http://hr.tencent.com/position.php?&start=0#a"
scrapy shell -s USER_AGENT="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36" "http://hr.tencent.com/position.php?&start=0#a"
Selectors選擇器 Scrapy Selectors 內置 XPath 和 CSS Selector 表達式機制 Selector有四個基本的方法算色,最常用的還是xpath:
xpath(): 傳入xpath表達式,返回該表達式所對應的所有節(jié)點的selector list列表
extract(): 序列化該節(jié)點為字符串并返回list
css(): 傳入CSS表達式螟够,返回該表達式所對應的所有節(jié)點的selector list列表,語法同 BeautifulSoup4
re(): 根據傳入的正則表達式對數(shù)據進行提取峡钓,返回字符串list列表
數(shù)據庫永久化保持
items.py文件:自定義字段妓笙,確定要爬取的目標網站數(shù)據
spiders/douban.py 文件: 爬蟲文件,在這里編寫爬蟲代碼,解析數(shù)據能岩,獲取新的url
init() : 初始化爬蟲名字和start_urls列表
start_requests() 調用
make_requests_from url():生成Requests對象交給Scrapy下載并返回response
parse():
解析response寞宫,并返回Item或Requests(需指定回調函數(shù))。
Item傳給Item pipline持久化 拉鹃, 而Requests交由Scrapy下載辈赋,并由指定的回調函數(shù)處理(默認parse())昆码,一直進行循環(huán)儒飒,直到處理完所有的數(shù)據為止贮喧。
settings.py文件: 設置文件膏执,在這里設置User-Agent,激活管道文件等...
pipelines.py管道:這里進行數(shù)據的清洗和持久化