爬蟲
網絡是一爬蟲種自動獲取網頁內容的程序,是搜索引擎的重要組成部分。網絡爬蟲爲搜索引擎從萬維網下載網頁。通常分爲傳統爬蟲和聚焦爬蟲。javascript
爬蟲的分類
傳統爬蟲從一個或若干初始網頁的URL開始,得到初始網頁上的URL,在抓取網頁的過程當中,不斷從當前頁面上抽取新的URL放入隊列,直到知足系統的必定中止條件。通俗的講,也就是經過源碼解析來得到想要的內容。html
聚焦爬蟲的工做流程較爲複雜,須要根據必定的網頁分析算法過濾與主題無關的連接,保留有用的連接並將其放入等待抓取的URL隊列。而後,它將根據必定的搜索策略從隊列中選擇下一步要抓取的網頁URL,並重覆上述過程,直到達到系統的某一條件時中止。另外,全部被爬蟲抓取的網頁將會被系統存貯,進行必定的分析、過濾,並創建索引,以便以後的查詢和檢索;對於聚焦爬蟲來講,這一過程所獲得的分析結果還可能對之後的抓取過程給出反饋和指導。java
防爬蟲:KS-WAF將爬蟲行爲分爲搜索引擎爬蟲及掃描程序爬蟲,可屏蔽特定的搜索引擎爬蟲節省帶寬和性能,也可屏蔽掃描程序爬蟲,避免網站被惡意抓取頁面。python
爬蟲的本質
網絡爬蟲本質就是瀏覽器http請求。web
瀏覽器和網絡爬蟲是兩種不一樣的網絡客戶端,都以相同的方式來獲取網頁:正則表達式
1)首先, 客戶端程序鏈接到域名系統(DNS)服務器上,DNS服務器將主機 名轉換成ip 地址。算法
2)接下來,客戶端試着鏈接具備該IP地址的服務器。服務器上可能有多個 不一樣進程程序在運行,每一個進程程序都在監聽網絡以發現新的選接。.各個進程監聽不一樣的網絡端口 (port). 端口是一個l6位的數卞,用來辨識不一樣的服務。Http請求通常默認都是80端口。數據庫
3) 一旦創建鏈接,客戶端向服務器發送一個http請求,服務器接收到請求後,返回響應結果給客戶端。json
4)客戶端關閉該鏈接。瀏覽器
通用的爬蟲框架流程:
1)首先從互聯網頁面中精心選擇一部分網頁,以這 些網頁的連接地址做爲種子URL;
2)將這些種子URL放入待抓取URL隊列中;
3)爬蟲從待抓取 URL隊列依次讀取,並將URL經過DNS解析,把連接地址轉換爲網站服務器對應的IP地址。
4)而後將IP地址和網頁相對路徑名稱交給網頁下載器,
5)網頁下載器負責頁面內容的下載。
6)對於下載到 本地的網頁,一方面將其存儲到頁面庫中,等待創建索引等後續處理;另外一方面將下載網頁的 URL放入己抓取URL隊列中,這個隊列記載了爬蟲系統己經下載過的網頁URL,以免網頁 的重複抓取。
7)對於剛下載的網頁,從中抽取出所包含的全部連接信息,並在已抓取URL隊列 中檢査,若是發現連接尚未被抓取過,則將這個URL放入待抓取URL隊歹!
8,9)末尾,在以後的 抓取調度中會下載這個URL對應的網頁,如此這般,造成循環,直到待抓取URL隊列爲空
爬蟲的基本流程:
發起請求:
經過HTTP庫向目標站點發起請求,也就是發送一個Request,請求能夠包含額外的header等信息,等待服務器響應
獲取響應內容
若是服務器能正常響應,會獲得一個Response,Response的內容即是所要獲取的頁面內容,類型多是HTML,Json字符串,二進制數據(圖片或者視頻)等類型
解析內容
獲得的內容多是HTML,能夠用正則表達式,頁面解析庫進行解析,多是Json,能夠直接轉換爲Json對象解析,多是二進制數據,能夠作保存或者進一步的處理
保存數據
保存形式多樣,能夠存爲文本,也能夠保存到數據庫,或者保存特定格式的文件
詳情請看http://www.cnblogs.com/alex3714/articles/8359348.html
什麼是Urllib庫
Urllib是Python提供的一個用於操做URL的模塊,咱們爬取網頁的時候,常常須要用到這個庫。
升級合併後,模塊中的包的位置變化的地方較多。在此,列舉一些常見的位置變更,方便以前用Python2.x的朋友在使用Python3.x的時候能夠快速掌握。
常見的變化有:
- 在Pytho2.x中使用import urllib2——-對應的,在Python3.x中會使用import urllib.request,urllib.error。
- 在Pytho2.x中使用import urllib——-對應的,在Python3.x中會使用import urllib.request,urllib.error,urllib.parse。
- 在Pytho2.x中使用import urlparse——-對應的,在Python3.x中會使用import urllib.parse。
- 在Pytho2.x中使用import urlopen——-對應的,在Python3.x中會使用import urllib.request.urlopen。
- 在Pytho2.x中使用import urlencode——-對應的,在Python3.x中會使用import urllib.parse.urlencode。
- 在Pytho2.x中使用import urllib.quote——-對應的,在Python3.x中會使用import urllib.request.quote。
- 在Pytho2.x中使用cookielib.CookieJar——-對應的,在Python3.x中會使用http.CookieJar。
- 在Pytho2.x中使用urllib2.Request——-對應的,在Python3.x中會使用urllib.request.Reques
urllib.request 請求模塊
urllib.error 異常處理模塊
urllib.parse url解析模塊
urllib.robotparser robots.txt解析模塊
先進行一個簡單的實例:利用有道翻譯(post請求)
1 #引入模塊 2 import urllib.request 3 import urllib.parse 4 5 6 #URL選好很是重要,選很差將會出錯 7 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' 8 9 10 ''' 11 設置Headers 12 有不少網站爲了防止程序爬蟲爬網站形成網站癱瘓,會須要攜帶一些headers頭部信息才能訪問,最長見的有user-agent參數 13 ''' 14 headers = { 15 'Accept': 'application/json, text/javascript, */*; q=0.01', 16 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 17 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 18 'X-Requested-With':'XMLHttpRequest' 19 } 20 21 key = input('enter your word:\n') 22 23 form_data = { 24 'i': key, 25 'from':'AUTO', 26 'to':'AUTO', 27 'keyfrom':'fanyi.web', 28 'doctype':'json', 29 'version':'2.1', 30 'action':'FY_BY_REALTIME', 31 'typoResult':'flase' 32 } 33 34 35 36 ''' 37 這裏用到urllib.parse,經過urllib.parse.urlencode(form_data).encode(encoding='utf-8')能夠將post數據進行轉換放到urllib.request.urlopen的data參數中。這樣就完成了一次post請求。 38 因此若是咱們添加data參數的時候就是以post請求方式請求,若是沒有data參數就是get請求方式 39 ''' 40 data =urllib.parse.urlencode(form_data).encode(encoding='utf-8') 41 42 request = urllib.request.Request(url, data=data , headers=headers) 43 44 45 ''' 46 urlopen通常經常使用的有三個參數,它的參數以下:urllib.requeset.urlopen(url,data,timeout) 47 48 固然上述的urlopen只能用於一些簡單的請求,由於它沒法添加一些header信息,不少狀況下咱們是須要添加頭部信息去訪問目標站的,這個時候就用到了urllib.request 49 50 51 52 ''' 53 response = urllib.request.urlopen(request) 54 55 #response.read()能夠獲取到網頁的內容 56 result = response.read().decode('utf8') 57 #target = json.loads(result) 58 #target = urllib.parse.unquote(target) 59 #print(target['translateResult'][0][0]["tgt"]) 60 #a = target['translateResult'][0][0]["tgt"] 61 #print(type(a)) 62 #print(a) 63 print(result) 64 #print(target)
運行結果:
enter your words: I love python {"type":"EN2ZH_CN", "errorCode":0, "elapsedTime":1, "translateResult":[[{"src":"I love python", "tgt":"我喜歡python"}]] }
另一個簡單的小實例是:豆瓣網劇情片排名前20的電影(Ajax請求)
1 import urllib.request 2 import urllib.parse 3 import json 4 5 url = 'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action' 6 7 headers = { 8 'Accept': ' */*', 9 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 10 'X-Requested-With':'XMLHttpRequest' 11 } 12 13 form_data = { 14 'start': '0', 15 'limit': '20' 16 } 17 18 data =urllib.parse.urlencode(form_data).encode(encoding='utf-8') 19 request = urllib.request.Request(url, data=data , headers=headers) 20 response = urllib.request.urlopen(request) 21 result = response.read() 22 targets = json.loads(result) 23 24 #print(result) 25 for num,target in enumerate(targets): 26 print(num+1, target["title"])
運行結果:
1 肖申克的救贖 2 控方證人 3 霸王別姬 4 美麗人生 5 這個殺手不太冷 6 阿甘正傳 7 辛德勒的名單 8 十二怒漢 9 泰坦尼克號 3D版 10 十二怒漢 11 控方證人 12 盜夢空間 13 燦爛人生 14 茶館 15 背靠背,臉對臉 16 巴黎聖母院 17 三傻大鬧寶萊塢 18 千與千尋 19 泰坦尼克號 20 海上鋼琴師
這些只是一些簡單的運用。