對象是對類的具體表達,類是對象的抽象表達。css
類只是爲全部的對象定義了抽象的屬性與行爲。前端
———————————————————————————————————————————python
●re.search 函數返回的結果是 一個Match對象mysql
●re.findall 函數返回的結果是一個列表linux
———————————————————————————————————————————nginx
●設計模式:六大原則git
單一職責 (一個方法實現一個功能)程序員
里氏替換原則github
依賴倒置原則web
接口隔離原則
開閉原則(對擴展開放修改關閉)
迪米特原則(下降模塊間耦合)
———————————————————————————————————————————
面向對象就是將程序模塊化,對象化,把具體的事物特性和經過這些屬性來實現一些動做的具體方法放到類裏面,就是封裝。
繼承:就是父類的屬性子類能夠重複使用
多態:重寫父類方法並覆蓋父類裏相同的方法
———————————————————————————————————————————
數值類型 int
浮點型 float
日期和時間 date datetime
字符串類型 char
———————————————————————————————————————————
———————————————————————————————————————————
通常網站從三個方面反爬蟲:
1用戶請求的headers(大部分網站都會檢測請求頭,部分網站的防盜鏈是對referer檢測)
措施:模仿瀏覽器設置請求頭
2用戶行爲
措施:1模仿用戶行爲,設置休眠時間
2使用代理ip (每請求幾回更換一次ip)
3網站目錄和數據加載方式
措施:Selenium+PhantomJS 無界面瀏覽器採集數據
———————————————————————————————————————————
跳轉第三方24小時人工在線手動解決
———————————————————————————————————————————
●五個核心模塊
爬蟲模塊,引擎模塊,調度模塊,下載模塊,管道模塊
●Scrapy去重原理
scrapy自己自帶一個去重中間件
scrapy源碼中能夠找到一個dupefilters.py去重器
將返回值放到集合set中,實現去重
●scrapy中間件有幾種類
爬蟲中間件:主要功能是在爬蟲運行過程當中進行一些處理
下載中間件:主要功能在請求到網頁後,頁面被下載時進行一些處理
●scrapy中間件再哪裏起的做用
下載中間件
- process_request request經過下載中間件時,該方法被調用
- process_response 下載結果通過中間件時被此方法處理
- process_exception 下載過程當中出現異常時被調用
●爲何會用到代理
p可有效避免ip被禁的問題
●代理失效怎麼處理
???
———————————————————————————————————————————
●分佈式原理
Scrapy-Redis則是一個基於Redis的Scrapy分佈式組件。它利用Redis對用於爬取的請求(Requests)進行存儲和調度(Schedule),並對爬取產生的項目(items)存儲以供後續處理使用。scrapy-redi重寫了scrapy一些比較關鍵的代碼,將scrapy變成一個能夠在多個主機上同時運行的分佈式爬蟲
●分佈式去重原理
redis的set實現url去重
———————————————————————————————————————————
關係型數據庫:Mysql ,Oracle,SQLSERVER
非關係型數據庫:Redis,Mangodb
關係型數據庫
●優勢:
能夠進行Join等複雜查詢
其中可以保持數據的一致性是關係型數據庫的最大優點
●不足:
不擅長處理大量數據
不擅長字段不固定時應用
———————————————————————————————————————————
●迭代器
能夠用在 for 語句進行循環的對象就是可迭代對象
迭代器的實質是實現了next()方法的對象,常見的元組、列表、字典都是迭代器
●生成器
生成器是包含yield關鍵字的函數
●裝飾器
拓展原來函數功能的一種函數
好處就是在不用更改原函數的代碼前提下給函數增長新的功能
———————————————————————————————————————————
Number(數字) 包括int,long,float,complex
String(字符串) 例如:hello,"hello",hello
List(列表) 例如:[1,2,3],[1,2,3,[1,2,3],4]
Dictionary(字典) 例如:{1:"nihao",2:"hello"}
Tuple(元組) 例如:(1,2,3,abc)
Bool(布爾) 包括True、False
———————————————————————————————————————————
●http協議,請求由什麼組成,每一個字段分別有什麼用,https和http有什麼差距?
組成:
一、請求方法 和 URI及使用的協議
GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE
二、請求頭
服務端的有用信息,如服務器的類型、內容類型和長度
三、請求正文
響應正文
●二者區別:
https須要獲得ca申請證書,通常免費證書較少,於是須要必定的費用。
http是超文本傳輸協議,信息是明文傳輸的,https則是具備安全性的ssl加密傳輸協議
http(80)和https(443)使用的徹底不一樣的鏈接方式,用的端口號也不同。
http的鏈接簡單是無狀態的;https協議是有ssl+http協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議更安全。
———————————————————————————————————————————
●一、TCP面向鏈接(如打電話要先撥號創建鏈接);UDP是無鏈接的,即發送數據以前不須要創建鏈接
●二、TCP提供可靠的服務。也就是說,經過TCP鏈接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
Tcp經過校驗和,重傳控制,序號標識,滑動窗口、確認應答實現可靠傳輸。如丟包時的重發控制,還能夠對次序亂掉的分包進行順序控制。
●三、UDP具備較好的實時性,工做效率比TCP高,適用於對高速傳輸和實時性有較高的通訊或廣播通訊。
●4.每一條TCP鏈接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通訊
●五、TCP對系統資源要求較多,UDP對系統資源要求較少。
———————————————————————————————————————————
套接字之間的鏈接過程分爲三個步驟:服務器監聽,客戶端請求,鏈接確認
———————————————————————————————————————————
HTTP鏈接顯著的特色是客戶端發送的每次請求都須要服務器回送響應,在請求結束後會主動釋放鏈接。從創建鏈接到關閉鏈接的過程稱爲「一次鏈接」,HTTP鏈接是一種「短鏈接」
HTTP協議是創建在TCP協議之上的一種應用
●TCP鏈接
創建起一個TCP鏈接須要通過「三次握手」:
第一次握手:客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
———————————————————————————————————————————
(1) TCP客戶端發送一個FIN,用來關閉客戶到服務器的數據傳送。
(2) 服務器收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。和SYN同樣,一個FIN將佔用一個序號。
(3) 服務器關閉客戶端的鏈接,發送一個FIN給客戶端。
(4) 客戶端發回ACK報文確認,並將確認序號設置爲收到序號加1。
———————————————————————————————————————————
chmod命令是很是重要的,用於改變文件或目錄的訪問權限。用戶用它控制文件或目錄的訪問權限
———————————————————————————————————————————
●單例模式
經過單例模式能夠保證系統中,應用該模式的類一個類只有一個實例。
即一個類只有一個對象實例。
●門面模式
門面模式,是指提供一個統一的接口去訪問多個子系統的多個不一樣的接口,它爲子系統中的一組接口提供一個統一的高層接口。使得子系統更容易使用。
缺點:
不符合開閉原則。所謂的開閉原則是軟件工程裏面一個最基本的原則:對擴展開放,對修改關閉
●簡單工廠模式是屬於建立型模式
簡單工廠模式是由一個工廠對象決定建立出哪種產品類的實例
———————————————————————————————————————————
前端即網站前臺部分,運行在PC端,移動端等瀏覽器上展示給用戶瀏覽的網頁。
後端是封裝在後臺,
———————————————————————————————————————————
確保requests爬蟲出現錯誤繼續爬蟲?
———————————————————————————————————————————
●urllib2是python2內置模塊操做較爲底層,步驟繁瑣,主要用於瞭解爬蟲工做機制。
requests是第三方模塊,封裝大量爬蟲底層函數,對python2,3有友好支持。
●requests提供的函數請求get,post,等其餘請求
●經過urllib.urlencode()編碼參數的方式,是在urllib2底層操做中使用的
●
———————————————————————————————————————————
較爲高端的反爬蟲操做:字段屬性加密
客戶提交數據必需附帶服務端加密數據,若是沒有加密數據或加密數據不一致,不返回數據
解決措施:參數加密處理,瞭解加密的流程,對方加密的步驟和操做,還原加密的過程,得到加密的數據,採集目標數據。
全部可能出現驗證碼的狀況的通常都爲post請求,提交會改變數據。
人工打碼(24小時)啦啦打碼,打碼兔
———————————————————————————————————————————
Python提供對Xpath的友好支持引入第三方模塊 lxml
XML路徑語言,它是一種用來肯定XML(標準通用標記語言的子集)文檔中某部分位置的語言
———————————————————————————————————————————
中文分詞:jieba
數據渲染:
將詞語按雲圖形式處理:wordcloud
數據展現:matplotlib
中文處理:虛擬環境》lib》修改site.py
reload(sys)
Sys.setdedaultencoding(‘GBK’)
———————————————————————————————————————————
DDL、DML 數據庫定義語言,數據庫操做語言
Mysql數據庫,pymysql模塊
pymysql,mysqldb區別?
都是mysql數據庫使用的第三方模塊
Mysqldb是python操做的mysql數據模塊(官方)舊版本使用
Pymysql是第三方模塊新版本使用
———————————————————————————————————————————
CRUD操做:
增刪改:insert,delete,update [execute|executeMany]
查:select[execute|fetchone|fetchMany|fetchAll]
把pymysql操做數據庫,封裝成工具模塊,提供給其餘模塊引用使用,操做數據模塊[db_utils]
———————————————————————————————————————————
數據分爲:結構化的數據 非結構化的數據
正則表達 效率很是高
Xpath、Jsonpath 效率高
BeautifulSoup4(可結合正則,xpath)效率較高
結構化數據:Xpath、Jsonpath、BS四、正則
非結構化數據:正則
pip install beautifulsoup4
BS 對象:能夠直接操做網頁中的文檔數
Findall :ret=soup.findall()
主要:css select
# 1. CSS 標籤選擇器:根據標籤名稱查詢標籤對象
res1 = soup.select("span")
print(res1)
# 2. CSS ID選擇器:根據ID查詢標籤對象
res2 = soup.select("#gender")
print(res2)
# 3. CSS 類選擇器:根據class屬性查詢標籤對象
res3 = soup.select(".intro")
print(res3)
———————————————————————————————————————————
環境配置:
Windows 安裝可執行的安裝包
Python中安裝一個交互模塊 pypiwin32
建立scrapy項目:
Scrapy startproject 項目名 或者 進入到目錄裏scrapy genspider baidu(‘爬蟲項目’) baidu.com(網站域名)直接建立好
Item封裝採集數據類型
2.item中設置封裝採集數據
———————————————————————————————————————————
安裝 buildwith模塊 經過 buildwith.parse(url) 查看網頁實現技術
安裝 python-whois 模塊查看目標網站的所屬組織
———————————————————————————————————————————
.extract() 將取出的文本轉換爲unicode編碼
#yield 協程 相似於多線程
yield response.follow(next_page[0], callback=self.parse)
有下一頁連接,加到相應隊列,yield將請求對象交給scrapy引擎模塊,引擎模塊交給調度模塊進行排隊下載完 callback 交給 self.parse
———————————————————————————————————————————
ITEM_PIPELINES = {
'zhilianspider.pipelines.ZhilianspiderPipeline': 300,
}
300 是優先級 越小越先執行
———————————————————————————————————————————
Import scrapy
建立一個爬蟲項目 【scrapy startproject 項目名】
Cd 項目 在spiders目錄下建立爬蟲程序
自定義一個爬蟲程序繼承 scrapy.Spider
設置 名字 容許域名 目標採集地址
定義parse函數 篩選對應信息
判斷下一頁 ,yeild response.follow(next_page[0],callback=self.parse) 交給自身繼續採集
缺點:只適合簡單爬取,若是採集信息深度再加深,函數功能太複雜,不符合模塊開發面向對象的開發原則,
單一,高內聚,低耦合
●深度爬蟲: CrawlSpider
Scrapy 自動採集數據,咱們只負責定義Rule和指定的處理函數scrapy會根據指定的規則自動分類篩選數據,
將篩選的數據直接交給咱們指定好的函數進行處理
定義篩選連接的方式: scrapy.linkextractors.LinkExtractor
定義篩選規則:scrapy.spider.Rule
1.建立一個爬蟲項目 【scrapy startproject 項目名】
2.Cd 項目 在spiders目錄下建立爬蟲程序
須要引入模塊:
爬蟲模塊: from scrapy.spider import CrawlSpider
連接提取模塊:from scrapy.linkextractors import LinkExtractor
規則模塊: from scrapy.spider import rule
3自定義一個爬蟲程序繼承 CrawlSpider
4 設置 名字 容許域名 目標採集地址
5 定義提取連接
Link1= LinkExtractor(restrict_xpaths=(""))
定義提取下一頁
Link2= LinkExtractor(restrict_xpaths=(""))
6定義提取規則和指定函數
rules = [
# 第一個提取方式,第二個處理函數,follow跟進
Rule(link_job, callback="parse_job"),
Rule(link_page, follow=True),
]
———————————————————————————————————————————
Selenium+PhantomJS
引入測試模塊
from selenium.webdriver import PhantomJS
建立無界面瀏覽器對象
browser=PhantomJS(「./phantomjs-2.1.1-windows/bin/phantomjs」)
訪問網頁
brower.get(「http://www.baidu.com」)
輸入文本
input=brower.find_element_by_id(‘kw’)
Input.send_keys(‘lvfei’)
保存訪問到的網頁
brower.save_screenshot(「baidu1.png」)
點擊百度一下
btn=brower.find_element_by_id(‘su’)
tn.click()
退出瀏覽器
brower.quit()
———————————————————————————————————————————
Redis數據庫【內存數據庫】:專門用於在內存中處理程序中的數據操做的數據庫軟件
Key-value存儲系統
Redis爲了提高數據操做效率,將和程序交互的數據臨時在內存中交互【內存中的交互要比在硬盤中的交互方式快速太多】,同時檢測了內存中數據的讀寫次數,若是當一個數據長時間沒有進行數據讀寫時,直接同步到硬盤中,佔榮的內存空間釋放其它資源使用。
Redis特色:
支持數據的持久化,能夠將內存中的數據存在磁盤中,重啓的時候再次加載進行使用
不只僅支持簡單的key-value類型的數據,還提供list set hash等數據結構的存儲
Redis 性能極高 讀110000次/s 寫81000次/s
Redis 官方只支持linux unix系統安裝 windows下 github上面下載
Python內部使用引用計數,來保持追蹤內存中的對象,python內部記錄了對象有多少個引用,即引用計數,
當對象被建立時就建立了一個引用計數,當這個對象的引用計數爲0時,它被垃圾回收。
———————————————————————————————————————————
———————————————————————————————————————————
Lambda函數是一個能夠接收任意多個參數而且返回單個表達式值的函數。
好處:比較輕便,很適合完成一項功能,只在此處應用
匿名函數通常用來給filter,map這樣的函數編程服務
做爲回調函數傳遞給某些應用,好比消息傳遞
———————————————————————————————————————————
單例模式是經常使用的軟件設計模式,核心結構只包含一個被稱爲單例類的特殊類,單例模式保證一個類只有一個實例並且
該實例易於外界訪問,從而方便對實例個數控制並節約資源。
———————————————————————————————————————————
概念:協程是一種用戶狀態的輕量級線程
理解:線程是系統級別的,有操做系統調度,協程是程序級別的,由程序員根據須要本身調度,一個線程的一個函數
叫作子程序,子程序在執行過程當中能夠中斷去執行別的子程序,別的子程序也能夠中斷回來繼續執行以前的子程序。
優勢:避免了無心義的調度,提升了性能,方便切換,適合高併發
缺點:協程的本質就是單線程,沒法利用多核資源,若進行阻塞會阻塞掉整個程序
———————————————————————————————————————————
閉包:外部函數定義的內部函數就是閉包
閉包的做用及好處:
閉包給訪問外部函數定義的內部函數變量創造了條件,將關於函數的一切封閉到了函數內部,減小了全局變量
何時使用閉包?
當每次調用函數A時都要改變全局變量B,且B只與A有關。能夠將B定義爲A的內部變量,同時A內定義閉包C,並將C當值返回
———————————————————————————————————————————
|
Cookie |
Session |
儲存位置 |
客戶端 |
服務器端 |
目的 |
跟蹤會話,也能夠保存用戶偏好設置或者保存用戶名密碼等 |
跟蹤會話 |
安全性 |
不安全 |
安全 |
———————————————————————————————————————————
Svn/ Git
———————————————————————————————————————————
Uwsgi+nginx
———————————————————————————————————————————
(1)直接賦值是一個完徹底全的引用,對新變量的任何改動都會影響到原對象。
(2)淺拷貝建立了新的對象,可是隻拷貝了序列的元素,對於元素也是一個序列的狀況(即子對象),只複製了對這個序列的引用!
(3)深拷貝是完徹底全的拷貝,把原對象完整地拷貝到了新對象中。
淺拷貝只是增長了一個指針指向已經存在的內存,而深拷貝就是增長一個指針而且申請一個新的內存,使這個增長的指針指向新的內存
正則匹配
import re
str='hello'
p=re.compile(r'l')
p2=p.sub('o',str)
print p2 p2=heooo
find()方法能夠在一個較長的字符串中查找子串,返回子串坐在位置的最左端索引
# str='012hello456'
# str1=str.find('l')
# print str1
找第一個l位置索引
str='012hello456'
str1=str.rfind('l')
print str1
找最後一個l位置索引
replace()方法返回某字符串的全部匹配項均被替換以後獲得的字符串
str='everyone'
str1=str.replace('e','a')
print str1
列表能夠修改,而元組不能夠修改,若是元組中僅有一個元素,則要在元素後加上逗號。
元組和列表的查詢方式同樣。
元組只可讀不可修改
●編碼:python2 ascii 編碼 源代碼文件都不支持中文源代碼代碼中第一行的位置,添加支持中文的註釋
python3 unicode編碼
●爬蟲工做主流版本:2.x
[都是從網絡上採集數據,採集的數據文本數據、二進制數據,爲了方便而且統一的進行採集數據的處理,使用python2操做更加靈活]
Python2在爬蟲方向支持的第三方模塊更多
●python2 print 被 python3 print() 取代
●字符串類型
版本 |
python2 |
python3 |
字節字符串 |
str |
bytes |
文本字符串 |
Unicode |
str |
●python2中/的結果是整型,python3中是浮點類型
單雙引號若是字符串要換行要用\ 三引號則不用
32. redis 數據庫端口號 6379 mysql(關係型數據庫的明星) 端口號 3306 mongodb (文檔型數據庫的翹楚)端口號50107
Redis 啓動默認狀況下啓動16個數據庫,分別使用0-15個整數進行編號
存儲數據 以key value 存儲
Mongodb文檔型數據庫:提供可擴展的高性能數據存儲
基於分佈式的文件存儲,高負載狀況下添加更多的節點,保證服務器的性能,將數據存儲爲一個文檔
Mongodb對數據間的事物關係支持比較弱
Mongodb優點:
●適合對數據庫具體數據格式不明確或者數據庫數據格式常常發生變化的需求模型,對開發者友好。
●自帶分佈式文件系統,很方便的部署到服務器集羣上
●自帶map-reduce運算框架的支持,方便進行數據的統計
傳統數據庫由:數據庫 表 記錄 組成
Mongodb由:數據庫 集合 文檔對象 組成
數字,字符串,布爾值,元組(其餘都是可變的)
不可變類型傳遞後,一方進行了修改,不影響另外一方
可變類型傳遞後,一方修改了,影響另外一方
在Python中,這種一邊循環一邊計算的機制,稱爲生成器:generator。
能夠被next()函數調用並不斷返回下一個值的對象稱爲迭代器:Iterator。
*args 用來將參數打包成tuple給函數體調用
**kwargs 打包關鍵字參數成dict給函數體調用
順序問題 必須是 arg, *args,**kwargs 否則程序會報錯
裝飾器是一個很著名的設計模式,常常被用於有切面需求的場景,較爲經典的有插入日誌、性能測試、事務處理等。
裝飾器是解決這類問題的絕佳設計,有了裝飾器,咱們就能夠抽離出大量函數中與函數功能自己無關的雷同代碼並繼續重用。
歸納的講,裝飾器的做用就是爲已經存在的對象添加額外的功能。
函數重載主要是爲了解決兩個問題。
做爲python的模塊是自然的單例模式
線程全局鎖(Global Interpreter Lock),即Python爲了保證線程安全而採起的獨立線程運行的限制,說白了就是一個核只能在同一時間運行一個線程.
簡單點說協程是進程和線程的升級版,進程和線程都面臨着內核態和用戶態的切換問題而耗費許多切換時間,而協程就是用戶本身控制切換的時機,再也不須要陷入系統的內核態.
閉包(closure)是函數式編程的重要的語法結構。閉包也是一種組織代碼的結構,它一樣提升了代碼的可重複使用性。
Python GC主要使用引用計數(reference counting)來跟蹤和回收垃圾。在引用計數的基礎上,經過「標記-清除」(mark and sweep)解決容器對象可能產生的循環引用問題,經過「分代回收」(generation collection)以空間換時間的方法提升垃圾回收效率。
PyObject是每一個對象必有的內容,其中ob_refcnt就是作爲引用計數。當一個對象有新的引用時,它的ob_refcnt就會增長,當引用它的對象被刪除,它的ob_refcnt就會減小.引用計數爲0時,該對象生命就結束了。
優勢:簡單、實時性
缺點:維護引用計數消耗資源、循環引用
tuple能夠說是不可變的list,訪問方式也是經過下表索引
is是對比地址,==是對比值
Python:Python是一種解釋型語言,Python代碼在運行以前不須要編譯
Python是動態類型語言,指的是你在聲明變量時,不須要說明變量的類型
Python很是適合面向對象的編程(OOP),由於它支持經過組合(composition)與繼承(inheritance)的方式定義類(class)
Python代碼編寫快,可是運行速度比編譯語言一般要慢
Python讓困難的事情變得容易,所以程序員能夠專一於算法和數據結構的設計,而不用處理底層的細節
緣由:1競爭資源程 2序推動順序不當
必要條件:互斥條件、請求和保持條件、不剝奪條件、環路等待條件
處理死鎖基本方法:預防死鎖(摒棄除1之外的條件)、避免死鎖(銀行家算法)、檢測死鎖(資源分配圖)、解除死鎖(剝奪資源、撤銷進程)
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。
索引分爲聚簇索引和非聚簇索引兩種,聚簇索引 是按照數據存放的物理位置爲順序的,而非聚簇索引就不同了;聚簇索引能提升多行檢索的速度,而非聚簇索引對於單行的檢索很快。
悲觀鎖:假定會發生併發衝突,屏蔽一切可能違反數據完整性的操做
樂觀鎖:假設不會發生併發衝突,只在提交操做時檢查是否違反數據完整性。
Post不能被緩存,get能夠被緩存
列表去重
用字典
1 2 3 |
l1 = ['b','c','d','b','c','a','a'] l2 = {}.fromkeys(l1).keys() print l2 |
用字典並保持順序
1 2 3 4 |
l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) l2.sort(key=l1.index) print l2 |
Tornado是可擴展非阻塞型web服務器速度至關快
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用
403 Forbidden //服務器收到請求,可是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
1.數據庫視圖隱藏了數據的複雜性。
2.數據庫視圖有利於控制用戶對錶中某些列的訪問。
3.數據庫視圖使用戶查詢變得簡單。
requests、urllib、urllib2
BeautifulSoup、pyquery、Xpath、lxml
tmp_list=[1,2,3,4]
def fun(number):
return number+1
print map(fun,tmp_list)
[2,3,4,5]
print filter(fun,tmp_list)
[1,2,3,4]
a=[1,2,3,4,5]
#取前兩個
print a[:2] 【1,2】
#取依次隔兩位取
print a[::2] 【1,3,5】
#爲空
print a[-10:-8] 【】爲空
print a[-8:] 【1,2,3,4,5】
#從前日後取
print a[-4:] 【2,3,4,5】
python map(fun,[arg]+)函數最少有兩個參數,第一參數爲一個函數名,第二個參數是對應的這個函數的參數(通常爲一個或多個list)
>>>def fun(x):
... return x+1 ...
>>>list(map(fun,[1,2,3]))
>>>[2,3,4]
# a=[1,2,3,4]
# b=[]
# for x in a:
# b.append(x*x)
#
# print b
A=[(lambda x:x*x) (x) for x in range(1,5)]
print A
多進程和多線程均可以執行多個任務,線程是進程的一部分。線程的特色是線程之間能夠共享內存和變量,
資源消耗少(不過在Unix環境中,多進程和多線程資源調度消耗差距不明顯,Unix調度較快),缺點是線
程之間的同步和加鎖比較麻煩
模塊分爲:自定義模塊,內置模塊,開源模塊
內置模塊: time模塊 datetime模塊
sys模塊、os模塊、hashlib模塊,random模塊、json模塊、
re模塊:compile 、 match 、search、findall、group
match:只在第一個字符串開始找,若是沒有匹配,則再也不繼續找,若是第一個字符串中有,則只輸出第一個
searh: 在全部內容裏找,直到找到爲止,但只輸出找到的第一個
findall:把全部找到的匹配的內容,都經過列表的形式打印出來
compile: 編譯以後再去匹配,這樣能夠加快匹配的速度
group: 把他匹配的內容輸出出來
對象是對類的具體表達,類是對象的抽象表達。
類只是爲全部的對象定義了抽象的屬性與行爲。
———————————————————————————————————————————
●re.search 函數返回的結果是 一個Match對象
●re.findall 函數返回的結果是一個列表
———————————————————————————————————————————
●設計模式:六大原則
單一職責 (一個方法實現一個功能)
里氏替換原則
依賴倒置原則
接口隔離原則
開閉原則(對擴展開放修改關閉)
迪米特原則(下降模塊間耦合)
———————————————————————————————————————————
面向對象就是將程序模塊化,對象化,把具體的事物特性和經過這些屬性來實現一些動做的具體方法放到類裏面,就是封裝。
繼承:就是父類的屬性子類能夠重複使用
多態:重寫父類方法並覆蓋父類裏相同的方法
———————————————————————————————————————————
數值類型 int
浮點型 float
日期和時間 date datetime
字符串類型 char
———————————————————————————————————————————
———————————————————————————————————————————
通常網站從三個方面反爬蟲:
1用戶請求的headers(大部分網站都會檢測請求頭,部分網站的防盜鏈是對referer檢測)
措施:模仿瀏覽器設置請求頭
2用戶行爲
措施:1模仿用戶行爲,設置休眠時間
2使用代理ip (每請求幾回更換一次ip)
3網站目錄和數據加載方式
措施:Selenium+PhantomJS 無界面瀏覽器採集數據
———————————————————————————————————————————
跳轉第三方24小時人工在線手動解決
———————————————————————————————————————————
●五個核心模塊
爬蟲模塊,引擎模塊,調度模塊,下載模塊,管道模塊
●Scrapy去重原理
scrapy自己自帶一個去重中間件
scrapy源碼中能夠找到一個dupefilters.py去重器
將返回值放到集合set中,實現去重
●scrapy中間件有幾種類
爬蟲中間件:主要功能是在爬蟲運行過程當中進行一些處理
下載中間件:主要功能在請求到網頁後,頁面被下載時進行一些處理
●scrapy中間件再哪裏起的做用
下載中間件
- process_request request經過下載中間件時,該方法被調用
- process_response 下載結果通過中間件時被此方法處理
- process_exception 下載過程當中出現異常時被調用
●爲何會用到代理
p可有效避免ip被禁的問題
●代理失效怎麼處理
???
———————————————————————————————————————————
●分佈式原理
Scrapy-Redis則是一個基於Redis的Scrapy分佈式組件。它利用Redis對用於爬取的請求(Requests)進行存儲和調度(Schedule),並對爬取產生的項目(items)存儲以供後續處理使用。scrapy-redi重寫了scrapy一些比較關鍵的代碼,將scrapy變成一個能夠在多個主機上同時運行的分佈式爬蟲
●分佈式去重原理
redis的set實現url去重
———————————————————————————————————————————
關係型數據庫:Mysql ,Oracle,SQLSERVER
非關係型數據庫:Redis,Mangodb
關係型數據庫
●優勢:
能夠進行Join等複雜查詢
其中可以保持數據的一致性是關係型數據庫的最大優點
●不足:
不擅長處理大量數據
不擅長字段不固定時應用
———————————————————————————————————————————
●迭代器
能夠用在 for 語句進行循環的對象就是可迭代對象
迭代器的實質是實現了next()方法的對象,常見的元組、列表、字典都是迭代器
●生成器
生成器是包含yield關鍵字的函數
●裝飾器
拓展原來函數功能的一種函數
好處就是在不用更改原函數的代碼前提下給函數增長新的功能
———————————————————————————————————————————
Number(數字) 包括int,long,float,complex
String(字符串) 例如:hello,"hello",hello
List(列表) 例如:[1,2,3],[1,2,3,[1,2,3],4]
Dictionary(字典) 例如:{1:"nihao",2:"hello"}
Tuple(元組) 例如:(1,2,3,abc)
Bool(布爾) 包括True、False
———————————————————————————————————————————
●http協議,請求由什麼組成,每一個字段分別有什麼用,https和http有什麼差距?
組成:
一、請求方法 和 URI及使用的協議
GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE
二、請求頭
服務端的有用信息,如服務器的類型、內容類型和長度
三、請求正文
響應正文
●二者區別:
https須要獲得ca申請證書,通常免費證書較少,於是須要必定的費用。
http是超文本傳輸協議,信息是明文傳輸的,https則是具備安全性的ssl加密傳輸協議
http(80)和https(443)使用的徹底不一樣的鏈接方式,用的端口號也不同。
http的鏈接簡單是無狀態的;https協議是有ssl+http協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議更安全。
———————————————————————————————————————————
●一、TCP面向鏈接(如打電話要先撥號創建鏈接);UDP是無鏈接的,即發送數據以前不須要創建鏈接
●二、TCP提供可靠的服務。也就是說,經過TCP鏈接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
Tcp經過校驗和,重傳控制,序號標識,滑動窗口、確認應答實現可靠傳輸。如丟包時的重發控制,還能夠對次序亂掉的分包進行順序控制。
●三、UDP具備較好的實時性,工做效率比TCP高,適用於對高速傳輸和實時性有較高的通訊或廣播通訊。
●4.每一條TCP鏈接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通訊
●五、TCP對系統資源要求較多,UDP對系統資源要求較少。
———————————————————————————————————————————
套接字之間的鏈接過程分爲三個步驟:服務器監聽,客戶端請求,鏈接確認
———————————————————————————————————————————
HTTP鏈接顯著的特色是客戶端發送的每次請求都須要服務器回送響應,在請求結束後會主動釋放鏈接。從創建鏈接到關閉鏈接的過程稱爲「一次鏈接」,HTTP鏈接是一種「短鏈接」
HTTP協議是創建在TCP協議之上的一種應用
●TCP鏈接
創建起一個TCP鏈接須要通過「三次握手」:
第一次握手:客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
———————————————————————————————————————————
(1) TCP客戶端發送一個FIN,用來關閉客戶到服務器的數據傳送。
(2) 服務器收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。和SYN同樣,一個FIN將佔用一個序號。
(3) 服務器關閉客戶端的鏈接,發送一個FIN給客戶端。
(4) 客戶端發回ACK報文確認,並將確認序號設置爲收到序號加1。
———————————————————————————————————————————
chmod命令是很是重要的,用於改變文件或目錄的訪問權限。用戶用它控制文件或目錄的訪問權限
———————————————————————————————————————————
●單例模式
經過單例模式能夠保證系統中,應用該模式的類一個類只有一個實例。
即一個類只有一個對象實例。
●門面模式
門面模式,是指提供一個統一的接口去訪問多個子系統的多個不一樣的接口,它爲子系統中的一組接口提供一個統一的高層接口。使得子系統更容易使用。
缺點:
不符合開閉原則。所謂的開閉原則是軟件工程裏面一個最基本的原則:對擴展開放,對修改關閉
●簡單工廠模式是屬於建立型模式
簡單工廠模式是由一個工廠對象決定建立出哪種產品類的實例
———————————————————————————————————————————
前端即網站前臺部分,運行在PC端,移動端等瀏覽器上展示給用戶瀏覽的網頁。
後端是封裝在後臺,
———————————————————————————————————————————
確保requests爬蟲出現錯誤繼續爬蟲?
———————————————————————————————————————————
●urllib2是python2內置模塊操做較爲底層,步驟繁瑣,主要用於瞭解爬蟲工做機制。
requests是第三方模塊,封裝大量爬蟲底層函數,對python2,3有友好支持。
●requests提供的函數請求get,post,等其餘請求
●經過urllib.urlencode()編碼參數的方式,是在urllib2底層操做中使用的
●
———————————————————————————————————————————
較爲高端的反爬蟲操做:字段屬性加密
客戶提交數據必需附帶服務端加密數據,若是沒有加密數據或加密數據不一致,不返回數據
解決措施:參數加密處理,瞭解加密的流程,對方加密的步驟和操做,還原加密的過程,得到加密的數據,採集目標數據。
全部可能出現驗證碼的狀況的通常都爲post請求,提交會改變數據。
人工打碼(24小時)啦啦打碼,打碼兔
———————————————————————————————————————————
Python提供對Xpath的友好支持引入第三方模塊 lxml
XML路徑語言,它是一種用來肯定XML(標準通用標記語言的子集)文檔中某部分位置的語言
———————————————————————————————————————————
中文分詞:jieba
數據渲染:
將詞語按雲圖形式處理:wordcloud
數據展現:matplotlib
中文處理:虛擬環境》lib》修改site.py
reload(sys)
Sys.setdedaultencoding(‘GBK’)
———————————————————————————————————————————
DDL、DML 數據庫定義語言,數據庫操做語言
Mysql數據庫,pymysql模塊
pymysql,mysqldb區別?
都是mysql數據庫使用的第三方模塊
Mysqldb是python操做的mysql數據模塊(官方)舊版本使用
Pymysql是第三方模塊新版本使用
———————————————————————————————————————————
CRUD操做:
增刪改:insert,delete,update [execute|executeMany]
查:select[execute|fetchone|fetchMany|fetchAll]
把pymysql操做數據庫,封裝成工具模塊,提供給其餘模塊引用使用,操做數據模塊[db_utils]
———————————————————————————————————————————
數據分爲:結構化的數據 非結構化的數據
正則表達 效率很是高
Xpath、Jsonpath 效率高
BeautifulSoup4(可結合正則,xpath)效率較高
結構化數據:Xpath、Jsonpath、BS四、正則
非結構化數據:正則
pip install beautifulsoup4
BS 對象:能夠直接操做網頁中的文檔數
Findall :ret=soup.findall()
主要:css select
# 1. CSS 標籤選擇器:根據標籤名稱查詢標籤對象
res1 = soup.select("span")
print(res1)
# 2. CSS ID選擇器:根據ID查詢標籤對象
res2 = soup.select("#gender")
print(res2)
# 3. CSS 類選擇器:根據class屬性查詢標籤對象
res3 = soup.select(".intro")
print(res3)
———————————————————————————————————————————
環境配置:
Windows 安裝可執行的安裝包
Python中安裝一個交互模塊 pypiwin32
建立scrapy項目:
Scrapy startproject 項目名 或者 進入到目錄裏scrapy genspider baidu(‘爬蟲項目’) baidu.com(網站域名)直接建立好
Item封裝採集數據類型
2.item中設置封裝採集數據
———————————————————————————————————————————
安裝 buildwith模塊 經過 buildwith.parse(url) 查看網頁實現技術
安裝 python-whois 模塊查看目標網站的所屬組織
———————————————————————————————————————————
.extract() 將取出的文本轉換爲unicode編碼
#yield 協程 相似於多線程
yield response.follow(next_page[0], callback=self.parse)
有下一頁連接,加到相應隊列,yield將請求對象交給scrapy引擎模塊,引擎模塊交給調度模塊進行排隊下載完 callback 交給 self.parse
———————————————————————————————————————————
ITEM_PIPELINES = {
'zhilianspider.pipelines.ZhilianspiderPipeline': 300,
}
300 是優先級 越小越先執行
———————————————————————————————————————————
Import scrapy
建立一個爬蟲項目 【scrapy startproject 項目名】
Cd 項目 在spiders目錄下建立爬蟲程序
自定義一個爬蟲程序繼承 scrapy.Spider
設置 名字 容許域名 目標採集地址
定義parse函數 篩選對應信息
判斷下一頁 ,yeild response.follow(next_page[0],callback=self.parse) 交給自身繼續採集
缺點:只適合簡單爬取,若是採集信息深度再加深,函數功能太複雜,不符合模塊開發面向對象的開發原則,
單一,高內聚,低耦合
●深度爬蟲: CrawlSpider
Scrapy 自動採集數據,咱們只負責定義Rule和指定的處理函數scrapy會根據指定的規則自動分類篩選數據,
將篩選的數據直接交給咱們指定好的函數進行處理
定義篩選連接的方式: scrapy.linkextractors.LinkExtractor
定義篩選規則:scrapy.spider.Rule
1.建立一個爬蟲項目 【scrapy startproject 項目名】
2.Cd 項目 在spiders目錄下建立爬蟲程序
須要引入模塊:
爬蟲模塊: from scrapy.spider import CrawlSpider
連接提取模塊:from scrapy.linkextractors import LinkExtractor
規則模塊: from scrapy.spider import rule
3自定義一個爬蟲程序繼承 CrawlSpider
4 設置 名字 容許域名 目標採集地址
5 定義提取連接
Link1= LinkExtractor(restrict_xpaths=(""))
定義提取下一頁
Link2= LinkExtractor(restrict_xpaths=(""))
6定義提取規則和指定函數
rules = [
# 第一個提取方式,第二個處理函數,follow跟進
Rule(link_job, callback="parse_job"),
Rule(link_page, follow=True),
]
———————————————————————————————————————————
Selenium+PhantomJS
引入測試模塊
from selenium.webdriver import PhantomJS
建立無界面瀏覽器對象
browser=PhantomJS(「./phantomjs-2.1.1-windows/bin/phantomjs」)
訪問網頁
brower.get(「http://www.baidu.com」)
輸入文本
input=brower.find_element_by_id(‘kw’)
Input.send_keys(‘lvfei’)
保存訪問到的網頁
brower.save_screenshot(「baidu1.png」)
點擊百度一下
btn=brower.find_element_by_id(‘su’)
tn.click()
退出瀏覽器
brower.quit()
———————————————————————————————————————————
Redis數據庫【內存數據庫】:專門用於在內存中處理程序中的數據操做的數據庫軟件
Key-value存儲系統
Redis爲了提高數據操做效率,將和程序交互的數據臨時在內存中交互【內存中的交互要比在硬盤中的交互方式快速太多】,同時檢測了內存中數據的讀寫次數,若是當一個數據長時間沒有進行數據讀寫時,直接同步到硬盤中,佔榮的內存空間釋放其它資源使用。
Redis特色:
支持數據的持久化,能夠將內存中的數據存在磁盤中,重啓的時候再次加載進行使用
不只僅支持簡單的key-value類型的數據,還提供list set hash等數據結構的存儲
Redis 性能極高 讀110000次/s 寫81000次/s
Redis 官方只支持linux unix系統安裝 windows下 github上面下載
Python內部使用引用計數,來保持追蹤內存中的對象,python內部記錄了對象有多少個引用,即引用計數,
當對象被建立時就建立了一個引用計數,當這個對象的引用計數爲0時,它被垃圾回收。
———————————————————————————————————————————
———————————————————————————————————————————
Lambda函數是一個能夠接收任意多個參數而且返回單個表達式值的函數。
好處:比較輕便,很適合完成一項功能,只在此處應用
匿名函數通常用來給filter,map這樣的函數編程服務
做爲回調函數傳遞給某些應用,好比消息傳遞
———————————————————————————————————————————
單例模式是經常使用的軟件設計模式,核心結構只包含一個被稱爲單例類的特殊類,單例模式保證一個類只有一個實例並且
該實例易於外界訪問,從而方便對實例個數控制並節約資源。
———————————————————————————————————————————
概念:協程是一種用戶狀態的輕量級線程
理解:線程是系統級別的,有操做系統調度,協程是程序級別的,由程序員根據須要本身調度,一個線程的一個函數
叫作子程序,子程序在執行過程當中能夠中斷去執行別的子程序,別的子程序也能夠中斷回來繼續執行以前的子程序。
優勢:避免了無心義的調度,提升了性能,方便切換,適合高併發
缺點:協程的本質就是單線程,沒法利用多核資源,若進行阻塞會阻塞掉整個程序
———————————————————————————————————————————
閉包:外部函數定義的內部函數就是閉包
閉包的做用及好處:
閉包給訪問外部函數定義的內部函數變量創造了條件,將關於函數的一切封閉到了函數內部,減小了全局變量
何時使用閉包?
當每次調用函數A時都要改變全局變量B,且B只與A有關。能夠將B定義爲A的內部變量,同時A內定義閉包C,並將C當值返回
———————————————————————————————————————————
|
Cookie |
Session |
儲存位置 |
客戶端 |
服務器端 |
目的 |
跟蹤會話,也能夠保存用戶偏好設置或者保存用戶名密碼等 |
跟蹤會話 |
安全性 |
不安全 |
安全 |
———————————————————————————————————————————
Svn/ Git
———————————————————————————————————————————
Uwsgi+nginx
———————————————————————————————————————————
(1)直接賦值是一個完徹底全的引用,對新變量的任何改動都會影響到原對象。
(2)淺拷貝建立了新的對象,可是隻拷貝了序列的元素,對於元素也是一個序列的狀況(即子對象),只複製了對這個序列的引用!
(3)深拷貝是完徹底全的拷貝,把原對象完整地拷貝到了新對象中。
淺拷貝只是增長了一個指針指向已經存在的內存,而深拷貝就是增長一個指針而且申請一個新的內存,使這個增長的指針指向新的內存
正則匹配
import re
str='hello'
p=re.compile(r'l')
p2=p.sub('o',str)
print p2 p2=heooo
find()方法能夠在一個較長的字符串中查找子串,返回子串坐在位置的最左端索引
# str='012hello456'
# str1=str.find('l')
# print str1
找第一個l位置索引
str='012hello456'
str1=str.rfind('l')
print str1
找最後一個l位置索引
replace()方法返回某字符串的全部匹配項均被替換以後獲得的字符串
str='everyone'
str1=str.replace('e','a')
print str1
列表能夠修改,而元組不能夠修改,若是元組中僅有一個元素,則要在元素後加上逗號。
元組和列表的查詢方式同樣。
元組只可讀不可修改
●編碼:python2 ascii 編碼 源代碼文件都不支持中文源代碼代碼中第一行的位置,添加支持中文的註釋
python3 unicode編碼
●爬蟲工做主流版本:2.x
[都是從網絡上採集數據,採集的數據文本數據、二進制數據,爲了方便而且統一的進行採集數據的處理,使用python2操做更加靈活]
Python2在爬蟲方向支持的第三方模塊更多
●python2 print 被 python3 print() 取代
●字符串類型
版本 |
python2 |
python3 |
字節字符串 |
str |
bytes |
文本字符串 |
Unicode |
str |
●python2中/的結果是整型,python3中是浮點類型
單雙引號若是字符串要換行要用\ 三引號則不用
32. redis 數據庫端口號 6379 mysql(關係型數據庫的明星) 端口號 3306 mongodb (文檔型數據庫的翹楚)端口號50107
Redis 啓動默認狀況下啓動16個數據庫,分別使用0-15個整數進行編號
存儲數據 以key value 存儲
Mongodb文檔型數據庫:提供可擴展的高性能數據存儲
基於分佈式的文件存儲,高負載狀況下添加更多的節點,保證服務器的性能,將數據存儲爲一個文檔
Mongodb對數據間的事物關係支持比較弱
Mongodb優點:
●適合對數據庫具體數據格式不明確或者數據庫數據格式常常發生變化的需求模型,對開發者友好。
●自帶分佈式文件系統,很方便的部署到服務器集羣上
●自帶map-reduce運算框架的支持,方便進行數據的統計
傳統數據庫由:數據庫 表 記錄 組成
Mongodb由:數據庫 集合 文檔對象 組成
數字,字符串,布爾值,元組(其餘都是可變的)
不可變類型傳遞後,一方進行了修改,不影響另外一方
可變類型傳遞後,一方修改了,影響另外一方
在Python中,這種一邊循環一邊計算的機制,稱爲生成器:generator。
能夠被next()函數調用並不斷返回下一個值的對象稱爲迭代器:Iterator。
*args 用來將參數打包成tuple給函數體調用
**kwargs 打包關鍵字參數成dict給函數體調用
順序問題 必須是 arg, *args,**kwargs 否則程序會報錯
裝飾器是一個很著名的設計模式,常常被用於有切面需求的場景,較爲經典的有插入日誌、性能測試、事務處理等。
裝飾器是解決這類問題的絕佳設計,有了裝飾器,咱們就能夠抽離出大量函數中與函數功能自己無關的雷同代碼並繼續重用。
歸納的講,裝飾器的做用就是爲已經存在的對象添加額外的功能。
函數重載主要是爲了解決兩個問題。
做爲python的模塊是自然的單例模式
線程全局鎖(Global Interpreter Lock),即Python爲了保證線程安全而採起的獨立線程運行的限制,說白了就是一個核只能在同一時間運行一個線程.
簡單點說協程是進程和線程的升級版,進程和線程都面臨着內核態和用戶態的切換問題而耗費許多切換時間,而協程就是用戶本身控制切換的時機,再也不須要陷入系統的內核態.
閉包(closure)是函數式編程的重要的語法結構。閉包也是一種組織代碼的結構,它一樣提升了代碼的可重複使用性。
Python GC主要使用引用計數(reference counting)來跟蹤和回收垃圾。在引用計數的基礎上,經過「標記-清除」(mark and sweep)解決容器對象可能產生的循環引用問題,經過「分代回收」(generation collection)以空間換時間的方法提升垃圾回收效率。
PyObject是每一個對象必有的內容,其中ob_refcnt就是作爲引用計數。當一個對象有新的引用時,它的ob_refcnt就會增長,當引用它的對象被刪除,它的ob_refcnt就會減小.引用計數爲0時,該對象生命就結束了。
優勢:簡單、實時性
缺點:維護引用計數消耗資源、循環引用
tuple能夠說是不可變的list,訪問方式也是經過下表索引
is是對比地址,==是對比值
Python:Python是一種解釋型語言,Python代碼在運行以前不須要編譯
Python是動態類型語言,指的是你在聲明變量時,不須要說明變量的類型
Python很是適合面向對象的編程(OOP),由於它支持經過組合(composition)與繼承(inheritance)的方式定義類(class)
Python代碼編寫快,可是運行速度比編譯語言一般要慢
Python讓困難的事情變得容易,所以程序員能夠專一於算法和數據結構的設計,而不用處理底層的細節
緣由:1競爭資源程 2序推動順序不當
必要條件:互斥條件、請求和保持條件、不剝奪條件、環路等待條件
處理死鎖基本方法:預防死鎖(摒棄除1之外的條件)、避免死鎖(銀行家算法)、檢測死鎖(資源分配圖)、解除死鎖(剝奪資源、撤銷進程)
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。
索引分爲聚簇索引和非聚簇索引兩種,聚簇索引 是按照數據存放的物理位置爲順序的,而非聚簇索引就不同了;聚簇索引能提升多行檢索的速度,而非聚簇索引對於單行的檢索很快。
悲觀鎖:假定會發生併發衝突,屏蔽一切可能違反數據完整性的操做
樂觀鎖:假設不會發生併發衝突,只在提交操做時檢查是否違反數據完整性。
Post不能被緩存,get能夠被緩存
列表去重
用字典
1 2 3 |
l1 = ['b','c','d','b','c','a','a'] l2 = {}.fromkeys(l1).keys() print l2 |
用字典並保持順序
1 2 3 4 |
l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) l2.sort(key=l1.index) print l2 |
Tornado是可擴展非阻塞型web服務器速度至關快
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用
403 Forbidden //服務器收到請求,可是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
1.數據庫視圖隱藏了數據的複雜性。
2.數據庫視圖有利於控制用戶對錶中某些列的訪問。
3.數據庫視圖使用戶查詢變得簡單。
requests、urllib、urllib2
BeautifulSoup、pyquery、Xpath、lxml
tmp_list=[1,2,3,4]
def fun(number):
return number+1
print map(fun,tmp_list)
[2,3,4,5]
print filter(fun,tmp_list)
[1,2,3,4]
a=[1,2,3,4,5]
#取前兩個
print a[:2] 【1,2】
#取依次隔兩位取
print a[::2] 【1,3,5】
#爲空
print a[-10:-8] 【】爲空
print a[-8:] 【1,2,3,4,5】
#從前日後取
print a[-4:] 【2,3,4,5】
python map(fun,[arg]+)函數最少有兩個參數,第一參數爲一個函數名,第二個參數是對應的這個函數的參數(通常爲一個或多個list)
>>>def fun(x):
... return x+1 ...
>>>list(map(fun,[1,2,3]))
>>>[2,3,4]
# a=[1,2,3,4]
# b=[]
# for x in a:
# b.append(x*x)
#
# print b
A=[(lambda x:x*x) (x) for x in range(1,5)]
print A
多進程和多線程均可以執行多個任務,線程是進程的一部分。線程的特色是線程之間能夠共享內存和變量,
資源消耗少(不過在Unix環境中,多進程和多線程資源調度消耗差距不明顯,Unix調度較快),缺點是線
程之間的同步和加鎖比較麻煩
模塊分爲:自定義模塊,內置模塊,開源模塊
內置模塊: time模塊 datetime模塊
sys模塊、os模塊、hashlib模塊,random模塊、json模塊、
re模塊:compile 、 match 、search、findall、group
match:只在第一個字符串開始找,若是沒有匹配,則再也不繼續找,若是第一個字符串中有,則只輸出第一個
searh: 在全部內容裏找,直到找到爲止,但只輸出找到的第一個
findall:把全部找到的匹配的內容,都經過列表的形式打印出來
compile: 編譯以後再去匹配,這樣能夠加快匹配的速度
group: 把他匹配的內容輸出出來