1. 程式人生 > >路飛學成-Python爬蟲實戰密訓-第3章

路飛學成-Python爬蟲實戰密訓-第3章

請求 ref 流處理 自己 ems 需要 難點 crawl html

1,本節學習體會、心得 :

  本章的內容非常多,scrapy框架的使用。對於學過django的人來說。可能要更好理解一些把。個人感覺還是挺簡單的。所有的知識點一聽就懂,唯一不好的就是時間太緊迫了,不的不快速觀看,只能等以後拐回來再細細品味了。本章的難點再下載中間件,實際上跟django差不多,但是仍然需要認真聽才能聽懂,而且要結合自己敲代碼聯系。這樣就能夠很好掌握了。其它的應用方面就簡單多了,可以快速瀏覽,知道功能和使用方法,聯系的時候可以隨時翻筆記完成。對與時間緊迫的小夥伴們來說,還是挑重點學習更好

2,本節的知識點總結:    

總結:
1. 安裝scrapy

linux安裝
  pip3 install scrapy
windows安裝
    pip3 install wheel
 下載twisted  http://www.lfb.uci.edu/~gohlke/pythonlibs/#twisted
    pip3 install Twisted-18.4.0-cp36-cp36m-win_amd64.whl
安裝scrapy 
    Pip3 install scrapy 
安裝pywin32 
Pip3 install pywin32 

2. scarpy 的基本使用

創建project
        scrapy startproject day710    #創建一個項目
        d day 710   #
進入項目目錄 scrapy genspider example example.com 創建要爬取的網站的文件 scrapy crawl chouti --nolog # 運行起來 設置初始url(默認設置好的)
   response.text 就是爬取到的內容 然後進行解析
from scrapy.selector import HtmlXPathSelector #導入內部解析器
解析:
	標簽對象:xpath(‘/html/body/url/li/a/@href‘)
	列表:          xpathe(‘/html/body/url/li/a/@href‘).extract()
值:            xpathe(‘/html/body/url/li/a/@href‘).extract_first()

3. 爬蟲的的架構

技術分享圖片

Scrapy主要包括了以下組件:

  • 引擎(Scrapy)
    用來處理整個系統的數據流處理, 觸發事務(框架核心)
  • 調度器(Scheduler)
    用來接受引擎發過來的請求, 壓入隊列中, 並在引擎再次請求的時候返回. 可以想像成一個URL(抓取網頁的網址或者說是鏈接)的優先隊列, 由它來決定下一個要抓取的網址是什麽, 同時去除重復的網址
  • 下載器(Downloader)
    用於下載網頁內容, 並將網頁內容返回給蜘蛛(Scrapy下載器是建立在twisted這個高效的異步模型上的)
  • 爬蟲(Spiders)
    爬蟲是主要幹活的, 用於從特定的網頁中提取自己需要的信息, 即所謂的實體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續抓取下一個頁面
  • 項目管道(Pipeline)
    負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的信息。當頁面被爬蟲解析後,將被發送到項目管道,並經過幾個特定的次序處理數據。
  • 下載器中間件(Downloader Middlewares)
    位於Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
  • 爬蟲中間件(Spider Middlewares)
    介於Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求輸出。
  • 調度中間件(Scheduler Middewares)
    介於Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應。

Scrapy運行流程大概如下:

    1. 引擎從調度器中取出一個鏈接(URL)用於接下來的抓取
    2. 引擎把URL封裝成一個請求(Request)傳給下載器
    3. 下載器把資源下載下來,並封裝成應答包(Response)
    4. 爬蟲解析Response
    5. 解析出實體(Item),則交給實體管道進行進一步的處理
    6. 解析出的是鏈接(URL),則把URL交給調度器等待抓取
4.post/請求頭/cookie  去重  中間件
	post/請求頭/cookie
		自動登陸抽屜
			先訪問一個頁面 拿到cookie
			原始的cookie
			print(response.headers.getlist(‘Set-Cookie‘))
			
			解析的cookie
			Cookie = cookieJar()
			cookie.extract_cookies(response,response.request)
			cookie_dic={}
			fork,vincookie._cookies.items():
			fori,jinv.items():
			form,ninj.items():
			self.cookie_dic[m]=n.value
			print(self.cookie_dic)
			
			req=Request(
				url=‘http://dig.chouti.com/login‘,
				method=‘POST‘,
				headers={‘Content-Type‘:‘application/x-www-form-urlencoded;charset=UTF-8‘},
				body=‘phone=8613503851931&password=abc1234&oneMonth=1‘,
				cookies=self.cookie_dic,
				callback=self.parse_check,
			)
			yieldreq
			
	利用meta={‘cookiejar‘:True} 自動操作cookie
		defstart_requests(self):
		forurlinself.start_urls:
		yieldRequest(url=url,callback=self.parse_index,meta={‘cookiejar‘:True})
		
		
		req=Request(
			url=‘http://dig.chouti.com/login‘,
			method=‘POST‘,
			headers={‘Content-Type‘:‘application/x-www-form-urlencoded;charset=UTF-8‘},
			body=‘phone=8613503851931&password=abc1234&oneMonth=1‘,
			meta={‘cookiejar‘:True},
			callback=self.parse_check,
		)
		Yield req
	開啟關閉cookie 配置文件裏
	
		#COOKIES_ENABLED=False
		
		
避免重復訪問
	scrapy默認使用 scrapy.dupefilter.RFPDupeFilter 進行去重,相關配置有:
	1	DUPEFILTER_CLASS = ‘scrapy.dupefilter.RFPDupeFilter‘
	2	DUPEFILTER_DEBUG = False
	3	JOBDIR = "保存範文記錄的日誌路徑,如:/root/"  # 最終路徑為 /root/requests.seen
	
	來自 <http://www.cnblogs.com/wupeiqi/articles/6229292.html> 
	
中間件
	對所有請求在請求的時候自動添加請求頭
	
	配置
	DOWNLOADER_MIDDLEWARES={
	‘day710.middlewares.Day710DownloaderMiddleware‘:543,
	}

  先寫這麽多 待更新

路飛學成-Python爬蟲實戰密訓-第3章