[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
Selenium 是一個Web 的自動化測試工具,能夠根據咱們的指令,讓瀏覽器自動加載頁面,獲取須要的數據,甚至頁面截屏,或者判斷網站上某些動做是否發生。Selenium 本身不帶瀏覽器,不支持瀏覽器的功能,它須要與第三方瀏覽器結合在一塊兒才能使用。可是咱們有時候須要讓它內嵌在代碼中運行,因此咱們能夠用一個叫 PhantomJS 的工具代替真實的瀏覽器。Selenium庫裏有個叫 WebDriver 的API。WebDriver 有點兒像能夠加載網站的瀏覽器,可是它也能夠像BeautifulSoup 或者其餘Selector 對象同樣用來查找頁面元素,與頁面上的元素進行交互 (發送文本、點擊等),以及執行其餘動做來運行網絡爬蟲。python
PhantomJS是一個基於 Webkit 的「無界面」(headless)瀏覽器,它會把網站加載到內存並執行頁面上的 JavaScript,由於不會展現圖形界面,因此運行起來比完整的瀏覽器要高效。相比傳統的Chrome或 Firefox 瀏覽器等,資源消耗會更少。mysql
若是咱們把 Selenium 和 PhantomJS 結合在一塊兒,就能夠運行一個很是強大的網絡爬蟲了,這個爬蟲能夠處理 JavaScrip、Cookie、headers,以及任何咱們真實用戶須要作的事情。主程序退出後,selenium 不保證 phantomJS 也成功退出,最好手動關閉 phantomJS 進程。(有可能會致使多個 phantomJS 進程運行,佔用內存)。WebDriverWait 雖然可能會減小延時,可是目前存在 bug(各類報錯),這種狀況能夠採用 sleep。phantomJS爬數據比較慢,能夠選擇多線程。若是運行的時候發現有的能夠運行,有的不能,能夠嘗試將 phantomJS 改爲 Chrome。react
緣由是:模擬瀏覽器,欺騙服務器,獲取和瀏覽器一致的內容
header 的形式:字典面試
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
用法: requests.get(url,headers=headers)ajax
應對策略:正則表達式
對於基本網頁的抓取能夠自定義headers,添加headers的數據,代理來解決 有些網站的數據抓取必須進行模擬登錄才能抓取到完整的數據,因此要進行模擬登錄。 對於限制抓取頻率的,能夠設置抓取的頻率下降一些, 對於限制ip抓取的可使用多個代理ip進行抓取,輪詢使用代理 針對動態網頁的可使用selenium+phantomjs進行抓取,可是比較慢,因此也可使用查找接口的方式進行抓取。 對部分數據進行加密的,可使用selenium進行截圖,飯後使用python自帶的 pytesseract庫進行識別,可是比較慢最直接的方法是找到加密的方法進行逆向推理。
scrapy-redis實現分佈式,其實從原理上來講很簡單,這裏爲描述方便,咱們把本身的核心服務器稱爲 master,而把用於跑爬蟲程序的機器稱爲 slave。redis
咱們知道,採用 scrapy 框架抓取網頁,咱們須要首先給定它一些 start_urls,爬蟲首先訪問 start_urls裏面的 url,再根據咱們的具體邏輯,對裏面的元素、或者是其餘的二級、三級頁面進行抓取。而要實現分佈式,咱們只須要在這個 starts_urls 裏面作文章就好了。算法
咱們在 master 上搭建一個 redis 數據庫(注意這個數據庫只用做 url 的存儲,不關心爬取的具體數據,不要和後面的 mongodb 或者 mysql 混淆),並對每個須要爬取的網站類型,都開闢一個單獨的列表字段。經過設置 slave 上 scrapy-redis 獲取 url 的地址爲 master 地址。這樣的結果就是,儘管有多個 slave,然而你們獲取 url 的地方只有一個,那就是服務器 master 上的 redis 數據庫。而且,因爲 scrapy-redis 自身的隊列機制,slave 獲取的連接不會相互衝突。這樣各個 slave 在完成抓取任務以後,再把獲取的結果彙總到服務器上(這時的數據存儲再也不在是 redis,而是 mongodb 或者mysql等存放具體內容的數據庫了)這種方法的還有好處就是程序移植性強,只要處理好路徑問題,把 slave 上的程序移植到另外一臺機器上運行,基本上就是複製粘貼的事情。sql
異同:都是作url請求的操做的,可是區別很明顯。 urllib2能夠接受一個Request類的實例來設置URL請求的headers,urllib僅能夠接受URL。這意味着,你不能夠經過urllib模塊假裝你的User Agent字符串等(假裝瀏覽器)。 urllib提供urlencode方法用來GET查詢字符串的產生,而urllib2沒有。這是爲什麼urllib常和urllib2一塊兒使用的緣由。 模塊比較優點的地方是urlliburllib2.urlopen能夠接受Request對象做爲參數,從而能夠控制HTTP Request的header部。 可是urllib.urlretrieve函數以及urllib.quote等一系列quote和unquote功能沒有被加入urllib2中,所以有時也須要urllib的輔助。
Robots協議(也稱爲爬蟲協議、爬蟲規則、機器人協議等)也就是robots.txt,網站經過robots協議告訴搜索引擎哪些頁面能夠抓取,哪些頁面不能抓取。mongodb
Robots協議是網站國際互聯網界通行的道德規範,其目的是保護網站數據和敏感信息、確保用戶我的信息和隱私不被侵犯。因其不是命令,故須要搜索引擎自覺遵照。
爬蟲是請求網站並提取數據的自動化程序
一、經過http庫向目標站點發起請求,即發送一個Request,請求能夠包含額外的headers等信息,等待服務器響應 二、若是服務器能正常響應,會獲得一個Response,Response的內容比啊是索要獲取的頁面內容 三、解析內容:正則表達式、頁面解析庫、json 四、保存數據:文本或者存入數據庫
本地 向 服務器 發送Request,服務器根據請求返回一個Response,頁面就顯示在頁面上了
一、瀏覽器就發送消息給該網址所在的服務器,這個過程叫作Http Request 二、服務器收到瀏覽器發送的消息後,可以根據瀏覽器發送消息的內容,作相應處 理,而後把消息回傳給瀏覽器,這個過程叫作HTTP Response 三、瀏覽器收到服務器的Response消息後,會對信息進行相應處理,而後顯示
一、請求方式:主要有GET和POST兩種方式,POST請求的參數不會包含在url裏面 二、請求URL URL:統一資源定位符,如一個網頁文檔、一張圖片、一個視頻等均可以用URL來惟一肯定 三、請求頭信息,包含了User-Agent(瀏覽器請求頭)、Host、Cookies信息 四、請求體,GET請求時,通常不會有,POST請求時,請求體通常包含form-data
一、響應狀態:狀態碼 正常響應200 重定向 二、響應頭:如內容類型、內容長度、服務器信息、設置cookie等 三、響應體信息:響應源代碼、圖片二進制數據等等
200狀態碼 服務器請求正常 301狀態碼:被請求的資源已永久移動到新位置。服務器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。 302狀態碼:請求的資源臨時從不一樣的URI響應請求,但請求者應繼續使用原有位置來進行之後的請求 401狀態碼:請求要求身份驗證。 對於須要登陸的網頁,服務器可能返回此響應。 403狀態碼:服務器已經理解請求,可是拒絕執行它。與401響應不一樣的是,身份驗證並不能提供任何幫助,並且這個請求也不該該被重複提交。 404狀態碼:請求失敗,請求所但願獲得的資源未被在服務器上發現。 500狀態碼:服務器遇到了一個不曾預料的情況,致使了它沒法完成對請求的處理。通常來講,這個問題都會在服務器的程序碼出錯時出現。 503狀態碼:因爲臨時的服務器維護或者過載,服務器當前沒法處理請求。
HTTP請求頭 Accept:瀏覽器可以處理的內容類型 Accept-Charset:瀏覽器可以顯示的字符集 Accept-Encoding:瀏覽器可以處理的壓縮編碼 Accept-Language:瀏覽器當前設置的語言 Connection:瀏覽器與服務器之間鏈接的類型 Cookie:當前頁面設置的任何Cookie Host:發出請求的頁面所在的域 Referer:發出請求的頁面的URL User-Agent:瀏覽器的用戶代理字符串
HTTP響應頭部信息: Date:表示消息發送的時間,時間的描述格式由rfc822定義 server:服務器名字。 Connection:瀏覽器與服務器之間鏈接的類型 content-type:表示後面的文檔屬於什麼MIME類型 Cache-Control:控制HTTP緩存
1.若是條件中有or,即便其中有條件帶索引也不會使用(這也是爲何儘可能少用or的緣由) 要想使用or,又想讓索引生效,只能將or條件中的每一個列都加上索引 2.對於多列索引,不是使用的第一部分,則不會使用索引 3.like查詢以%開頭 4.若是列類型是字符串,那必定要在條件中將數據使用引號引用起來,不然不使用索引 5.若是mysql估計使用全表掃描要比使用索引快,則不使用索引
主要 MyISAM 與 InnoDB 兩個引擎,其主要區別以下: 一、InnoDB 支持事務,MyISAM 不支持,這一點是很是之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪一個出錯還能夠回滾還原,而 MyISAM就不能夠了; 二、MyISAM 適合查詢以及插入爲主的應用,InnoDB 適合頻繁修改以及涉及到安全性較高的應用; 三、InnoDB 支持外鍵,MyISAM 不支持; 四、MyISAM 是默認引擎,InnoDB 須要指定; 五、InnoDB 不支持 FULLTEXT 類型的索引; 六、InnoDB 中不保存表的行數,如 select count() from table 時,InnoDB;須要掃描一遍整個表來計算有多少行,可是 MyISAM 只要簡單的讀出保存好的行數便可。注意的是,當 count()語句包含 where 條件時 MyISAM 也須要掃描整個表; 七、對於自增加的字段,InnoDB 中必須包含只有該字段的索引,可是在 MyISAM表中能夠和其餘字段一塊兒創建聯合索引; 八、清空整個表時,InnoDB 是一行一行的刪除,效率很是慢。MyISAM 則會重建表; 九、InnoDB 支持行鎖(某些狀況下仍是鎖整表,如 update table set a=1 where user like '%lee%'
優勢: scrapy 是異步的 採起可讀性更強的xpath代替正則 強大的統計和log系統 同時在不一樣的url上爬行 支持shell方式,方便獨立調試 寫middleware,方便寫一些統一的過濾器 經過管道的方式存入數據庫 缺點:基於python的爬蟲框架,擴展性比較差 基於twisted框架,運行中的exception是不會幹掉reactor,而且異步框架出錯後是不會停掉其餘任務的,數據出錯後難以察覺。
客戶端(一般是瀏覽器)先向服務器發出加密通訊的請求 服務器收到請求,而後響應 客戶端收到證書以後會首先會進行驗證 服務器收到使用公鑰加密的內容,在服務器端使用私鑰解密以後得到隨機數pre-master secret,而後根據radom一、radom二、pre-master secret經過必定的算法得出session Key和MAC算法祕鑰,做爲後面交互過程當中使用對稱祕鑰。同時客戶端也會使用radom一、radom二、pre-master secret,和一樣的算法生成session Key和MAC算法的祕鑰。 而後再後續的交互中就使用session Key和MAC算法的祕鑰對傳輸的內容進行加密和解密。
從start_urls裏獲取第一批url併發送請求,請求由引擎交給調度器入請求隊列,獲取完畢後,調度器將請求隊列裏的請求交給下載器去獲取請求對應的響應資源,並將響應交給本身編寫的解析方法作提取處理: 若是提取出須要的數據,則交給管道文件處理; 若是提取出url,則繼續執行以前的步驟(發送url請求,並由引擎將請求交給調度器入隊列...),直到請求隊列裏沒有請求,程序結束。