Scrapy vs requsts+beautifulsoup
1,reqests,beautifulsoup都是庫,Scrapy是框架
2,Scrapy中能夠加入requests beautifulsoup
3,Scrapy基於twisted,異步IO框架,性能最大的優點
4,Scrapy 擴展方便,提供了許多內置功能
5,內置css和xpath selector(都是c寫的)很是方便,beautifulsoup(是純python寫的缺點就是慢)css
1,靜態網頁
2,動態頁面
3,webservice(restapi)python
1,搜索引擎,百度google,垂直領域的搜索引擎
2,推薦引擎,--今日頭條
3,機器學習的數據樣本
4,數據分析,金融分析web
1,爲何學習正則表達式
精細化提取
2,基礎內容
特殊字符
1)
^:^b 必須以b開頭
. : 表明任意字符
* :前面出現的字符任意屢次
$ : b$ 必須以b結尾的
? :非貪婪匹配模式,儘可能少的匹配
+ :前面出現的字符出現(1,+00)
{2} : 前面的字符出現了兩次
{3,}:前面的字符出現了最少3次
{2,5} : 前面的字符出現了2-5次
| : 數線 或的關係,先提取前面的
2)
[] : [abc] 從abc中都選一個均可以;[0-9a-Z]區間;[.]進入[]中的.*等沒特殊意義;
[^1] 排除1的均可以匹配
手機號: "1[48357][0-9]{9}"
3)
\s : 空格
\S : 只要不是空格就匹配了
\w : 等價於[a-zA-Z0-9_]
\W : 除了[a-zA-Z0-9_]都匹配
4)
[\u4E00-\u9FA5] :值提取中文
\d : 數字
體會一下非貪婪匹配:
匹配boooobby 中的boooob
算法
1 import re 2 a = "aaboooobby123" 3 match_obj = re.match(".*?(b.*?b).*",a) 4 if match_obj: 5 print(match_obj.group(1)) #輸出匹配子串1 6 # ".*(b.*b).*" --> bb 貪婪匹配,從左邊開始匹配或者 7 #說從右邊開始找到最後一個符合條件的 8 # ".*?(b.*b).*" --> boooobb 括號中是貪婪匹配,直至找到最後一個b 9 #".*?(b.*?b).*" --> boooob 都是非貪婪匹配
深度優先:數據庫
對於二叉樹,先考慮一邊,往深了尋找
Scrapy 默認也是深度優先,遞歸算法實現
廣度優先:api
優先兄弟節點而不是子節點;按每層遍歷
經過隊列形式實現框架
1,將URL報存到數據庫,麻煩,慢 2,保存到set中,只須要O(1)代價就能查詢URL
可是:一億 100000000*2byte*50個字符/1024/1024=9G
小型爬蟲一億很少
3,url 通過md5等方法哈希後保存到set中
Scrapy採用的就是此;可將字符縮短到固定通常長度16個byte
4,bitmap方法將訪問的URL經過hash函數映射到某一位
缺點:衝突可能性較大
5,bloomfilter方法對bitmap進行改進,多重hash函數下降衝突
機器學習