第三章:爬蟲基礎知識回顧

第一節:技術選型,爬蟲能作什麼
技術選型
scrapy vs requests + beautifulsoup
1. requests + beautifulsoup都是庫,scrapy是框架
2.scrapy框架中能夠加入requests + beautifulsoup
3.scrapy基於twisted,性能是最大的優點
4.scrapy方便擴展,提供了不少內置的功能
5.scrapy內置的css和xpath selector很是方便,beautifulsoup最大的缺點就是慢css

網頁分類
常見類型的服務
1.靜態網頁(網頁是不會變的)
2.動態網頁
3.webservice(restapi)python

爬蟲能作什麼
1.搜索引擎---百度、google、垂直領域搜索引擎
2.推薦引擎---今日頭條 (根據咱們瀏覽的習慣)
3.機器學習的數據樣本
4.數據分析(如金融數據分析)、輿情分析等web

 

第二-四節:正則表達式正則表達式

正則表達式介紹
1.爲何必須會正則表達式
2.正則表達式的簡單應用及python示例
目錄
2.1 特殊字符
^ 開頭字符
$ 結尾字符
* /+ 1次或屢次
? 非貪婪匹配
{2} 限定出現兩次
{2,} 至少出現兩次
{2,5} 在2-5次之間
| 表示或者的意思
[ab]c 表示匹配ac或者bc 在中括號中沒有特殊含義了
\s 匹配空格
\S 匹配非空格
\w [0-9a-zA-Z_]
\W 非w
[\u4E00-\u9FA5] 匹配漢字
\d 數字
\D 非數字算法

示例:數據庫

```api

line = "xiaolinn123"
# regex_str = "^x.*"
#regex_str = ".*3$"
#regex_str = ".*(i.*n).*" #若是不在.*中加上問好,他會匹配到最後一個i的前一個
#regex_str = ".*?(i.*n).*" #加上問號就只匹配到第一個i的前一個
#regex_str = ".*?(i.*?n).*" #非貪婪匹配
#regex_str = ".*(i.{2,5}n).*"
#regex_str = "(xiaolin|xiaolinn)123"
#regex_str = "((xiaolin|xiaolinn)123)"
#regex_str = "([abcdx]iaolinn123)"
# line1 = "小林"
#regex_str = "([\u4E00-\u9FA5]+)"
# line2 = "study in 北京大學"
# regex_str = ".*?([\u4E00-\u9FA5]+)大學"
regex_str = ".*?(\d+)年"
line3 = "出生於2001年"
match_obj =re.match(regex_str,line3)
if match_obj:
print(match_obj.group(1))
# if re.match(regex_str,line):
# print("yes")框架

#line = "XXX出生於2001年6月1日"
#line = "XXX出生於2001/6/1"
#line = "XXX出生於2001-6-1"
#line = "XXX出生於2001-06-01"
#line = "XXX出生於2001-06"
regex_str = ".*出生於(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))"機器學習

match_obj =re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))scrapy

```

第五節:深度優先和廣度優先
1.網站的樹結構
url結構圖
www.jobbole.com
而後再分類,下面的文章,等等
能夠分爲一級域名,二級域名....(有可能能夠相互訪問)

2.深度優先算法和實現
先從一級域名到二級域名到三級域名,而後走完了
再退回二級域名,再從新到另一個三級域名

3.廣度優先算法和實現
先遍歷一級域名
而後再遍歷二級域名
接着再遍歷三級域名....

第六節:爬蟲去重策略
1.將訪問過的url保存到數據庫中
2.將訪問過的url保存到set中,只須要o(1)的代價就能夠查詢url
100000000*2byte*50個字符/1024/1024/1024 = 9G
3.url通過md5等方法哈希後保存到set中
4.用bitmap方法,將訪問過的url經過hash函數映射到某一位
5.bloomfilter方法對bitmap進行改進,多重hash函數下降衝突

第七節:完全搞清楚unicode和utf8編碼字符串編碼1.計算機只能處理數字,文本轉換爲數字才能處理。計算機中8個 bit做爲1個字節,因此一個字節能表示的最大的數字是2552.計算機是美國人發明的,因此一個字節能夠表示全部字符了,因此ASCII編碼就成爲美國人的標準編碼3.可是ASCII處理中文明顯是不夠的,中文不止255個漢字,因此中國製定了GB2312編碼,用兩個字節表示一個漢字。GB2312還把ASCII包含進去了,同理,日文,韓文等等上百個國家爲了解決這個問題都發展了一套字節的編碼,標準就愈來愈多,若是出現多種語言混合顯示就必定會出現亂碼4.越是unicode出現了,將全部語言統一到一套編碼裏5.看一下ASCII和unicode編碼:1):字母A用ASCII編碼十進制是652):漢字「中」已近超出了ASCII編碼的範圍,用unicode編碼是20013,二進制是01001110 001011013):A用unicode編碼只須要前面補0二進制是00000000 0100 00016.亂碼問題解決了,可是若是內容全是英文,unicode編碼比ASCII須要多一倍的存儲空間,同時若是傳輸須要多一倍的傳輸7.因此出現了可變長的編碼 utf-8,把英文變長一個字節,漢字3個字節,特別生僻的變成4-6字節,若是傳輸大量的英文,utf8做用就很明顯了encode("utf-8")

相關文章
相關標籤/搜索