<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                > 前面的python3入門系列基本上也對python入了門,從這章起就開始介紹下python的爬蟲教程,拿出來給大家分享;爬蟲說的簡單,就是去抓取網路的數據進行分析處理;這章主要入門,了解幾個爬蟲的小測試,以及對爬蟲用到的工具介紹,比如集合,隊列,正則表達式; ### 用python抓取指定頁面: 代碼如下: ~~~ import urllib.request url= "http://www.baidu.com" data = urllib.request.urlopen(url).read()# data = data.decode('UTF-8') print(data) ~~~ urllib.request.urlopen(url)[官方文檔](https://docs.python.org/3/library/urllib.html)返回一個 http.client.HTTPResponse 對象, 這個對象又用到的read()方法;返回數據;這個函數返回一個 http.client.HTTPResponse 對象, 這個對象又有各種方法, 比如我們用到的read()方法; ### 查找可變網址: ~~~ import urllib import urllib.request data={} data['word']='one peace' url_values=urllib.parse.urlencode(data) url="http://www.baidu.com/s?" full_url=url+url_values a = urllib.request.urlopen(full_url) data=a.read() data=data.decode('UTF-8') print(data) ##打印出網址: a.geturl() ~~~ data是一個字典, 然后通過urllib.parse.urlencode()來將data轉換為 ‘word=one+peace’的字符串, 最后和url合并為full_url ### python正則表達式介紹: ### 隊列 介紹 在爬蟲的程序中用到了廣度優先級算法,該算法用到了數據結構,當然你用list也可以實現隊列,但是效率不高。現在在此處介紹下: 在容器中有隊列:collection.deque ~~~ #隊列簡單測試: from collections import deque queue=deque(["peace","rong","sisi"]) queue.append("nick") queue.append("pishi") print(queue.popleft()) print(queue.popleft()) print(queue) ~~~ ### 集合介紹: 在爬蟲程序中, 為了不重復爬那些已經爬過的網站, 我們需要把爬過的頁面的url放進集合中, 在每一次要爬某一個url之前, 先看看集合里面是否已經存在. 如果已經存在, 我們就跳過這個url; 如果不存在, 我們先把url放入集合中, 然后再去爬這個頁面. Python 還 包 含 了 一 個 數 據 類 型—— set ( 集 合 ) 。 集 合 是 一 個 無 序 不 重 復 元素 的 集 。 基 本 功 能 包 括 關 系 測 試 和 消 除 重 復 元 素 。 集 合 對 象 還 支 持 union( 聯 合),intersection(交),difference(差)和 sysmmetric difference(對稱差集)等數學運算。 大括號或 set() 函數可以用來創建集合。 注意:想要創建空集合,你必須使用set() 而不是 {} 。{}用于創建空字典; 集合的創建演示如下: ~~~ a={"peace","peace","rong","rong","nick"} print(a) "peace" in a b=set(["peace","peace","rong","rong"]) print(b) #演示聯合 print(a|b) #演示交 print(a&b) #演示差 print(a-b) #對稱差集 print(a^b) #輸出: {'peace', 'rong', 'nick'} {'peace', 'rong'} {'peace', 'rong', 'nick'} {'peace', 'rong'} {'nick'} {'nick'} ~~~ ### 正則表達式 在爬蟲時收集回來的一般是字符流,我們要從中挑選出url就要求有簡單的字符串處理能力,而用正則表達式可以輕松的完成這一任務; 正則表達式的步驟:1,正則表達式的編譯 2,正則表達式匹配字符串 3,結果的處理 下圖列出了正則表達式的語法: ![語法](https://box.kancloud.cn/2016-06-06_5754eddc3c6af.jpg "") 在pytho中使用正則表達式,需要引入re模塊;下面介紹下該模塊中的一些方法; ### 1.compile和match re模塊中compile用于生成pattern的對象,再通過調用pattern實例的match方法處理文本最終獲得match實例;通過使用match獲得信息; ~~~ import re # 將正則表達式編譯成Pattern對象 pattern = re.compile(r'rlovep') # 使用Pattern匹配文本,獲得匹配結果,無法匹配時將返回None m = pattern.match('rlovep.com') if m: # 使用Match獲得分組信息 print(m.group()) ### 輸出 ### # rlovep ~~~ re.compile(strPattern[, flag]): 這個方法是Pattern類的工廠方法,用于將字符串形式的正則表達式編譯為Pattern對象。 第二個參數flag是匹配模式,取值可以使用按位或運算符’|’表示同時生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile(‘pattern’, re.I | re.M)與re.compile(‘(?im)pattern’)是等價的。 可選值有: re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同) M(MULTILINE): 多行模式,改變’^’和’$’的行為(參見上圖) S(DOTALL): 點任意匹配模式,改變’.’的行為 L(LOCALE): 使預定字符類 \w \W \b \B \s \S 取決于當前區域設定 U(UNICODE): 使預定字符類 \w \W \b \B \s \S \d \D 取決于unicode定義的字符屬性 X(VERBOSE): 詳細模式。這個模式下正則表達式可以是多行,忽略空白字符,并可以加入注釋。 Match: Match對象是一次匹配的結果,包含了很多關于此次匹配的信息,可以使用Match提供的可讀屬性或方法來獲取這些信息。 ~~~ 屬性: string: 匹配時使用的文本。 re: 匹配時使用的Pattern對象。 pos: 文本中正則表達式開始搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數相同。 endpos: 文本中正則表達式結束搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數相同。 lastindex: 最后一個被捕獲的分組在文本中的索引。如果沒有被捕獲的分組,將為None。 lastgroup: 最后一個被捕獲的分組的別名。如果這個分組沒有別名或者沒有被捕獲的分組,將為None。 方法: group([group1, …]): 獲得一個或多個分組截獲的字符串;指定多個參數時將以元組形式返回。group1可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫參數時,返回group(0);沒有截獲字符串的組返回None;截獲了多次的組返回最后一次截獲的子串。 groups([default]): 以元組形式返回全部分組截獲的字符串。相當于調用group(1,2,…last)。default表示沒有截獲字符串的組以這個值替代,默認為None。 groupdict([default]): 返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒有別名的組不包含在內。default含義同上。 start([group]): 返回指定的組截獲的子串在string中的起始索引(子串第一個字符的索引)。group默認值為0。 end([group]): 返回指定的組截獲的子串在string中的結束索引(子串最后一個字符的索引+1)。group默認值為0。 span([group]): 返回(start(group), end(group))。 expand(template): 將匹配到的分組代入template中然后返回。template中可以使用\id或\g<id>、 \g<name>引用分組,但不能使用編號0。\id與\g<id>是等價的;但\10將被認為是第10個分組,如果你想表達 \1之后是字符'0',只能使用\g<1>0。 ~~~ pattern: Pattern對象是一個編譯好的正則表達式,通過Pattern提供的一系列方法可以對文本進行匹配查找。 Pattern不能直接實例化,必須使用re.compile()進行構造。 ~~~ Pattern提供了幾個可讀屬性用于獲取表達式的相關信息: pattern: 編譯時用的表達式字符串。 flags: 編譯時用的匹配模式。數字形式。 groups: 表達式中分組的數量。 groupindex: 以表達式中有別名的組的別名為鍵、以該組對應的編號為值的字典,沒有別名的組不包含在內。 實例方法[ | re模塊方法]: match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]): 這個方法將從string的pos下標處起嘗試匹配pattern;如果pattern結束時仍可匹配,則返回一個Match對象;如果匹配過程中pattern無法匹配,或者匹配未結束就已到達endpos,則返回None。 pos和endpos的默認值分別為0和len(string);re.match()無法指定這兩個參數,參數flags用于編譯pattern時指定匹配模式。 注意:這個方法并不是完全匹配。當pattern結束時若string還有剩余字符,仍然視為成功。想要完全匹配,可以在表達式末尾加上邊界匹配符'$'。 search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]): 這個方法用于查找字符串中可以匹配成功的子串。從string的pos下標處起嘗試匹配pattern,如果pattern結束時仍可匹配,則返回一個Match對象;若無法匹配,則將pos加1重新嘗試匹配;直到pos=endpos時仍無法匹配則返回None。 pos和endpos的默認值分別為0和len(string));re.search()無法指定這兩個參數,參數flags用于編譯pattern時指定匹配模式。 split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]): 按照能夠匹配的子串將string分割后返回列表。maxsplit用于指定最大分割次數,不指定將全部分割。 findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]): 搜索string,以列表形式返回全部能匹配的子串。 finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]): 搜索string,返回一個順序訪問每一個匹配結果(Match對象)的迭代器。 sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]): 使用repl替換string中每一個匹配的子串后返回替換后的字符串。 當repl是一個字符串時,可以使用\id或\g<id>、\g<name>引用分組,但不能使用編號0。 當repl是一個方法時,這個方法應當只接受一個參數(Match對象),并返回一個字符串用于替換(返回的字符串中不能再引用分組)。 count用于指定最多替換次數,不指定時全部替換。 subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]): 返回 (sub(repl, string[, count]), 替換次數)。 ~~~ ### 2.re.match(pattern, string, flags=0) 函數參數說明: | 參數 | 描述 | |-----|-----| | pattern | 匹配的正則表達式 | | string | 要匹配的字符串。 | | flags | 標志位,用于控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。 | 匹配成功re.match方法返回一個匹配的對象,否則返回None。 我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。 | 匹配對象方法 | 描述 | |-----|-----| | group(num=0) | 匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。 | | groups() | 返回一個包含所有小組字符串的元組,從 1 到 所含的小組號。 | 演示如下: ~~~ #re.match. import re print(re.match("rlovep","rlovep.com"))##匹配rlovep print(re.match("rlovep","rlovep.com").span())##從開頭匹配rlovep print(re.match("com","http://rlovep.com"))##不再起始位置不能匹配成功 ##輸出: <_sre.SRE_Match object; span=(0, 6), match='rlovep'> (0, 6) None ~~~ 實例二:使用group ~~~ import re line = "This is my blog" #匹配含有is的字符串 matchObj = re.match( r'(.*) is (.*?) .*', line, re.M|re.I) #使用了組輸出:當group不帶參數是將整個匹配成功的輸出 #當帶參數為1時匹配的是最外層左邊包括的第一個括號,一次類推; if matchObj: print ("matchObj.group() : ", matchObj.group())#匹配整個 print ("matchObj.group(1) : ", matchObj.group(1))#匹配的第一個括號 print ("matchObj.group(2) : ", matchObj.group(2))#匹配的第二個括號 else: print ("No match!!") #輸出: matchObj.group() : This is my blog matchObj.group(1) : This matchObj.group(2) : my ~~~ ### 3re.search方法 re.search 掃描整個字符串并返回第一個成功的匹配。 函數語法: ~~~ re.search(pattern, string, flags=0) ~~~ 函數參數說明: | 參數 | 描述 | |-----|-----| | pattern | 匹配的正則表達式 | | string | 要匹配的字符串。 | | flags | 標志位,用于控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。 | 匹配成功re.search方法返回一個匹配的對象,否則返回None。 我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。 | 匹配對象方法 | 描述 | |-----|-----| | group(num=0) | 匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。 | | groups() | 返回一個包含所有小組字符串的元組,從 1 到 所含的小組號。 | 實例一: ~~~ import re print(re.search("rlovep","rlovep.com").span()) print(re.search("com","http://rlovep.com").span()) #輸出: import re print(re.search("rlovep","rlovep.com").span()) print(re.search("com","http://rlovep.com").span()) ~~~ 實例二: ~~~ import re line = "This is my blog" #匹配含有is的字符串 matchObj = re.search( r'(.*) is (.*?) .*', line, re.M|re.I) #使用了組輸出:當group不帶參數是將整個匹配成功的輸出 #當帶參數為1時匹配的是最外層左邊包括的第一個括號,一次類推; if matchObj: print ("matchObj.group() : ", matchObj.group())#匹配整個 print ("matchObj.group(1) : ", matchObj.group(1))#匹配的第一個括號 print ("matchObj.group(2) : ", matchObj.group(2))#匹配的第二個括號 else: print ("No match!!") #輸出: matchObj.group() : This is my blog matchObj.group(1) : This matchObj.group(2) : my ~~~ search和match區別: re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。 ### python爬蟲小試牛刀 利用python抓取頁面中所有的http協議的鏈接,并遞歸抓取子頁面的鏈接。使用了集合和隊列;此去爬的是我的網站,第一版很多bug; 代碼如下: ~~~ import re import urllib.request import urllib from collections import deque #使用隊列存放url queue = deque() #使用visited防止重復爬同一頁面 visited = set() url = 'http://rlovep.com' # 入口頁面, 可以換成別的 #入隊最初的頁面 queue.append(url) cnt = 0 while queue: url = queue.popleft() # 隊首元素出隊 visited |= {url} # 標記為已訪問 print('已經抓取: ' + str(cnt) + ' 正在抓取 <--- ' + url) cnt += 1 try: #抓取頁面 urlop = urllib.request.urlopen(url,timeout=10) except Exception: print("超時") continue #判斷是否為html頁面 if 'html' not in urlop.getheader('Content-Type'): continue # 避免程序異常中止, 用try..catch處理異常 try: #轉換為utf-8碼 data = urlop.read().decode('utf-8') except: continue # 正則表達式提取頁面中所有隊列, 并判斷是否已經訪問過, 然后加入待爬隊列 linkre = re.compile("href=['\"]([^\"'>]*?)['\"].*?") for x in linkre.findall(data):##返回所有有匹配的列表 if 'http' in x and x not in visited:##判斷是否為http協議鏈接,并判斷是否抓取過 queue.append(x) print('加入隊列 ---> ' + x) ~~~ 結果如下: ![結果](https://box.kancloud.cn/2016-06-06_5754eddc711c7.png "") #### 相關鏈接: [python3入門之類](http://rlovep.com/2015/09/23/python3%E5%85%A5%E9%97%A8%E4%B9%8B%E7%B1%BB/) [python3入門之函數](http://rlovep.com/2015/09/06/python3%E5%85%A5%E9%97%A8%E4%B9%8B%E5%87%BD%E6%95%B0/) [python3入門之循環](http://rlovep.com/2015/09/06/python3%E5%85%A5%E9%97%A8%E4%B9%8B%E5%BE%AA%E7%8E%AF/) [python3之if語句](http://rlovep.com/2015/08/05/python3%E4%B9%8Bif%E8%AF%AD%E5%8F%A5/) [python3入門之賦值語句介紹](http://rlovep.com/2015/08/03/python3%E5%85%A5%E9%97%A8%E4%B9%8B%E8%B5%8B%E5%80%BC%E8%AF%AD%E5%8F%A5%E4%BB%8B%E7%BB%8D/) [python3入門之print,import,input介紹](http://rlovep.com/2015/08/03/python3%E5%85%A5%E9%97%A8%E4%B9%8Bprint%EF%BC%8Cimport%EF%BC%8Cinput%E4%BB%8B%E7%BB%8D/) [python3入門之set](http://www.cnblogs.com/onepeace/p/4791578.html) [python3入門之字典](http://rlovep.com/2015/07/29/python3%E5%85%A5%E9%97%A8%E4%B9%8B%E5%AD%97%E5%85%B8/) [python3入門之字符串](http://rlovep.com/2015/07/28/python%E5%85%A5%E9%97%A8%E4%B9%8B%E5%AD%97%E7%AC%A6%E4%B8%B2/) [python3入門之列表和元組](http://rlovep.com/2015/07/14/python%E5%85%A5%E9%97%A8%E4%B9%8B%E5%88%97%E8%A1%A8%E5%92%8C%E5%85%83%E7%BB%84/) [python3入門之軟件安裝](http://rlovep.com/2015/07/14/python%E5%85%A5%E9%97%A8%E4%B9%8B%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/) [python3爬蟲之入門和正則表達式](http://rlovep.com/2015/09/23/python3%E7%88%AC%E8%99%AB%E4%B9%8B%E5%85%A5%E9%97%A8%E5%92%8C%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看