麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Regex > 正文

python3爬蟲(chóng)之入門基礎(chǔ)和正則表達(dá)式

2020-03-16 21:03:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這篇文章主要介紹了python3爬蟲(chóng)之入門基礎(chǔ)和正則表達(dá)式的相關(guān)資料,需要的朋友可以參考下

前面的python3入門系列基本上也對(duì)python入了門,從這章起就開(kāi)始介紹下python的爬蟲(chóng)教程,拿出來(lái)給大家分享;爬蟲(chóng)說(shuō)的簡(jiǎn)單,就是去抓取網(wǎng)路的數(shù)據(jù)進(jìn)行分析處理;這章主要入門,了解幾個(gè)爬蟲(chóng)的小測(cè)試,以及對(duì)爬蟲(chóng)用到的工具介紹,比如集合,隊(duì)列,正則表達(dá)式;

用python抓取指定頁(yè)面:

代碼如下:

 

 
  1. import urllib.request 
  2. url= "http://www.baidu.com" 
  3. data = urllib.request.urlopen(url).read()# 
  4. data = data.decode('UTF-8'
  5. print(data) 

urllib.request.urlopen(url) 官方文檔 返回一個(gè) http.client.HTTPResponse 對(duì)象, 這個(gè)對(duì)象又用到的read()方法;返回?cái)?shù)據(jù);這個(gè)函數(shù)返回一個(gè) http.client.HTTPResponse 對(duì)象, 這個(gè)對(duì)象又有各種方法, 比如我們用到的read()方法;

查找可變網(wǎng)址:

 

 
  1. import urllib 
  2. import urllib.request 
  3. data={} 
  4. data['word']='one peace' 
  5. url_values=urllib.parse.urlencode(data) 
  6. url="http://www.baidu.com/s?" 
  7. full_url=url+url_values 
  8. a = urllib.request.urlopen(full_url) 
  9. data=a.read() 
  10. data=data.decode('UTF-8'
  11. print(data) 
  12. ##打印出網(wǎng)址: 
  13. a.geturl() 

data是一個(gè)字典, 然后通過(guò)urllib.parse.urlencode()來(lái)將data轉(zhuǎn)換為 ‘word=one+peace'的字符串, 最后和url合并為full_url

python正則表達(dá)式介紹:

隊(duì)列 介紹

在爬蟲(chóng)的程序中用到了廣度優(yōu)先級(jí)算法,該算法用到了數(shù)據(jù)結(jié)構(gòu),當(dāng)然你用list也可以實(shí)現(xiàn)隊(duì)列,但是效率不高。現(xiàn)在在此處介紹下:在容器中有隊(duì)列:collection.deque

#隊(duì)列簡(jiǎn)單測(cè)試:

from collections import deque

queue=deque(["peace","rong","sisi"])

queue.append("nick")

queue.append("pishi")

print(queue.popleft())

print(queue.popleft())

print(queue)

集合介紹:

在爬蟲(chóng)程序中, 為了不重復(fù)爬那些已經(jīng)爬過(guò)的網(wǎng)站, 我們需要把爬過(guò)的頁(yè)面的url放進(jìn)集合中, 在每一次要爬某一個(gè)url之前, 先看看集合里面是否已經(jīng)存在. 如果已經(jīng)存在, 我們就跳過(guò)這個(gè)url; 如果不存在, 我們先把url放入集合中, 然后再去爬這個(gè)頁(yè)面.

Python 還 包 含 了 一 個(gè) 數(shù) 據(jù) 類 型—— set ( 集 合 ) 。 集 合 是 一 個(gè) 無(wú) 序 不 重 復(fù) 元素 的 集 。 基 本 功 能 包 括 關(guān) 系 測(cè) 試 和 消 除 重 復(fù) 元 素 。 集 合 對(duì) 象 還 支 持 union( 聯(lián)合),intersection(交),difference(差)和 sysmmetric difference(對(duì)稱差集)等數(shù)學(xué)運(yùn)算。

大括號(hào)或 set() 函數(shù)可以用來(lái)創(chuàng)建集合。 注意:想要?jiǎng)?chuàng)建空集合,你必須使用set() 而不是 {} 。{}用于創(chuàng)建空字典;

集合的創(chuàng)建演示如下:

a={"peace","peace","rong","rong","nick"}

print(a)

"peace" in a

b=set(["peace","peace","rong","rong"])

print(b)

#演示聯(lián)合

print(a|b)

#演示交

print(a&b)

#演示差

print(a-b)

#對(duì)稱差集

print(a^b)

#輸出:

{'peace', 'rong', 'nick'}

{'peace', 'rong'}

{'peace', 'rong', 'nick'}

{'peace', 'rong'}

{'nick'}

{'nick'}

正則表達(dá)式

在爬蟲(chóng)時(shí)收集回來(lái)的一般是字符流,我們要從中挑選出url就要求有簡(jiǎn)單的字符串處理能力,而用正則表達(dá)式可以輕松的完成這一任務(wù);

正則表達(dá)式的步驟:1,正則表達(dá)式的編譯 2,正則表達(dá)式匹配字符串 3,結(jié)果的處理

下圖列出了正則表達(dá)式的語(yǔ)法:

python3爬蟲(chóng)之入門基礎(chǔ)和正則表達(dá)式

在pytho中使用正則表達(dá)式,需要引入re模塊;下面介紹下該模塊中的一些方法;

1.compile和match

re模塊中compile用于生成pattern的對(duì)象,再通過(guò)調(diào)用pattern實(shí)例的match方法處理文本最終獲得match實(shí)例;通過(guò)使用match獲得信息;

 

 
  1. import re 
  2.  
  3. # 將正則表達(dá)式編譯成Pattern對(duì)象 
  4. pattern = re.compile(r'rlovep'
  5. # 使用Pattern匹配文本,獲得匹配結(jié)果,無(wú)法匹配時(shí)將返回None 
  6. m = pattern.match('rlovep.com'
  7. if m: 
  8. # 使用Match獲得分組信息 
  9. print(m.group()) 
  10. ### 輸出 ### 
  11. # rlovep 
  12. re.compile(strPattern[, flag]): 

這個(gè)方法是Pattern類的工廠方法,用于將字符串形式的正則表達(dá)式編譯為Pattern對(duì)象。 第二個(gè)參數(shù)flag是匹配模式,取值可以使用按位或運(yùn)算符'|'表示同時(shí)生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)與re.compile('(?im)pattern')是等價(jià)的。

可選值有:

re.I(re.IGNORECASE): 忽略大小寫(括號(hào)內(nèi)是完整寫法,下同)

M(MULTILINE): 多行模式,改變'^'和'$'的行為(參見(jiàn)上圖)

S(DOTALL): 點(diǎn)任意匹配模式,改變'.'的行為

L(LOCALE): 使預(yù)定字符類 /w /W /b /B /s /S 取決于當(dāng)前區(qū)域設(shè)定

U(UNICODE): 使預(yù)定字符類 /w /W /b /B /s /S /d /D 取決于unicode定義的字符屬性

X(VERBOSE): 詳細(xì)模式。這個(gè)模式下正則表達(dá)式可以是多行,忽略空白字符,并可以加入注釋。

Match:Match對(duì)象是一次匹配的結(jié)果,包含了很多關(guān)于此次匹配的信息,可以使用Match提供的可讀屬性或方法來(lái)獲取這些信息。

屬性:

string: 匹配時(shí)使用的文本。

re: 匹配時(shí)使用的Pattern對(duì)象。

pos: 文本中正則表達(dá)式開(kāi)始搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數(shù)相同。

endpos: 文本中正則表達(dá)式結(jié)束搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數(shù)相同。

lastindex: 最后一個(gè)被捕獲的分組在文本中的索引。如果沒(méi)有被捕獲的分組,將為None。

lastgroup: 最后一個(gè)被捕獲的分組的別名。如果這個(gè)分組沒(méi)有別名或者沒(méi)有被捕獲的分組,將為None。

方法:

group([group1, …]):

獲得一個(gè)或多個(gè)分組截獲的字符串;指定多個(gè)參數(shù)時(shí)將以元組形式返回。group1可以使用編號(hào)也可以使用別名;編號(hào)0代表整個(gè)匹配的子串;不填寫參數(shù)時(shí),返回group(0);沒(méi)有截獲字符串的組返回None;截獲了多次的組返回最后一次截獲的子串。

groups([default]):

以元組形式返回全部分組截獲的字符串。相當(dāng)于調(diào)用group(1,2,…last)。default表示沒(méi)有截獲字符串的組以這個(gè)值替代,默認(rèn)為None。

groupdict([default]):

返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒(méi)有別名的組不包含在內(nèi)。default含義同上。

start([group]):

返回指定的組截獲的子串在string中的起始索引(子串第一個(gè)字符的索引)。group默認(rèn)值為0。

end([group]):

返回指定的組截獲的子串在string中的結(jié)束索引(子串最后一個(gè)字符的索引+1)。group默認(rèn)值為0。

span([group]):

返回(start(group), end(group))。

expand(template):

將匹配到的分組代入template中然后返回。template中可以使用/id或/g、 /g引用分組,但不能使用編號(hào)0。/id與/g是等價(jià)的;但/10將被認(rèn)為是第10個(gè)分組,如果你想表達(dá) /1之后是字符'0',只能使用/g<1>0。

pattern:Pattern對(duì)象是一個(gè)編譯好的正則表達(dá)式,通過(guò)Pattern提供的一系列方法可以對(duì)文本進(jìn)行匹配查找。

Pattern不能直接實(shí)例化,必須使用re.compile()進(jìn)行構(gòu)造。

Pattern提供了幾個(gè)可讀屬性用于獲取表達(dá)式的相關(guān)信息:

pattern: 編譯時(shí)用的表達(dá)式字符串。

flags: 編譯時(shí)用的匹配模式。數(shù)字形式。

groups: 表達(dá)式中分組的數(shù)量。

groupindex: 以表達(dá)式中有別名的組的別名為鍵、以該組對(duì)應(yīng)的編號(hào)為值的字典,沒(méi)有別名的組不包含在內(nèi)。

實(shí)例方法[ | re模塊方法]:

match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]):

這個(gè)方法將從string的pos下標(biāo)處起嘗試匹配pattern;如果pattern結(jié)束時(shí)仍可匹配,則返回一個(gè)Match對(duì)象;如果匹配過(guò)程中pattern無(wú)法匹配,或者匹配未結(jié)束就已到達(dá)endpos,則返回None。

pos和endpos的默認(rèn)值分別為0和len(string);re.match()無(wú)法指定這兩個(gè)參數(shù),參數(shù)flags用于編譯pattern時(shí)指定匹配模式。

注意:這個(gè)方法并不是完全匹配。當(dāng)pattern結(jié)束時(shí)若string還有剩余字符,仍然視為成功。想要完全匹配,可以在表達(dá)式末尾加上邊界匹配符'$'。

search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):

這個(gè)方法用于查找字符串中可以匹配成功的子串。從string的pos下標(biāo)處起嘗試匹配pattern,如果pattern結(jié)束時(shí)仍可匹配,則返回一個(gè)Match對(duì)象;若無(wú)法匹配,則將pos加1重新嘗試匹配;直到pos=endpos時(shí)仍無(wú)法匹配則返回None。 pos和endpos的默認(rèn)值分別為0和len(string));re.search()無(wú)法指定這兩個(gè)參數(shù),參數(shù)flags用于編譯pattern時(shí)指定匹配模式。

split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):

按照能夠匹配的子串將string分割后返回列表。maxsplit用于指定最大分割次數(shù),不指定將全部分割。

findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]):

搜索string,以列表形式返回全部能匹配的子串。

finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):

搜索string,返回一個(gè)順序訪問(wèn)每一個(gè)匹配結(jié)果(Match對(duì)象)的迭代器。

sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):

使用repl替換string中每一個(gè)匹配的子串后返回替換后的字符串。 當(dāng)repl是一個(gè)字符串時(shí),可以使用/id或/g、/g引用分組,但不能使用編號(hào)0。 當(dāng)repl是一個(gè)方法時(shí),這個(gè)方法應(yīng)當(dāng)只接受一個(gè)參數(shù)(Match對(duì)象),并返回一個(gè)字符串用于替換(返回的字符串中不能再引用分組)。 count用于指定最多替換次數(shù),不指定時(shí)全部替換。

subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]):

返回 (sub(repl, string[, count]), 替換次數(shù))。

2.re.match(pattern, string, flags=0)

函數(shù)參數(shù)說(shuō)明:

參數(shù)

描述

pattern

匹配的正則表達(dá)式

string

要匹配的字符串。

flags

標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。

我們可以使用group(num) 或 groups() 匹配對(duì)象函數(shù)來(lái)獲取匹配表達(dá)式。

匹配對(duì)象方法

描述

group(num=0)

匹配的整個(gè)表達(dá)式的字符串,group()可以一次輸入多個(gè)組號(hào),在這種情況下它將返回一個(gè)包含那些組所對(duì)應(yīng)值的元組。

groups()

返回一個(gè)包含所有小組字符串的元組,從1所含的小組號(hào)。

演示如下:

 

 
  1. #re.match. 
  2. import re 
  3. print(re.match("rlovep","rlovep.com"))##匹配rlovep 
  4. print(re.match("rlovep","rlovep.com").span())##從開(kāi)頭匹配rlovep 
  5. print(re.match("com","http://rlovep.com"))##不再起始位置不能匹配成功 
  6. ##輸出: 
  7. <_sre.SRE_Match object; span=(0, 6), match='rlovep'
  8. (0, 6) 
  9. None 

實(shí)例二:使用group

 

 
  1. import re 
  2. line = "This is my blog" 
  3. #匹配含有is的字符串 
  4. matchObj = re.match( r'(.*) is (.*?) .*', line, re.M|re.I) 
  5. #使用了組輸出:當(dāng)group不帶參數(shù)是將整個(gè)匹配成功的輸出 
  6. #當(dāng)帶參數(shù)為1時(shí)匹配的是最外層左邊包括的第一個(gè)括號(hào),一次類推; 
  7. if matchObj: 
  8. print ("matchObj.group() : ", matchObj.group())#匹配整個(gè) 
  9. print ("matchObj.group(1) : ", matchObj.group(1))#匹配的第一個(gè)括號(hào) 
  10. print ("matchObj.group(2) : ", matchObj.group(2))#匹配的第二個(gè)括號(hào) 
  11. else
  12. print ("No match!!"
  13. #輸出: 
  14. matchObj.group() : This is my blog 
  15. matchObj.group(1) : This 
  16. matchObj.group(2) : my 

3.re.search方法

re.search 掃描整個(gè)字符串并返回第一個(gè)成功的匹配。

函數(shù)語(yǔ)法:

re.search(pattern, string, flags=0)

函數(shù)參數(shù)說(shuō)明:

參數(shù)

描述

pattern

匹配的正則表達(dá)式

string

要匹配的字符串。

flags

標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。

我們可以使用group(num) 或 groups() 匹配對(duì)象函數(shù)來(lái)獲取匹配表達(dá)式。

匹配對(duì)象方法

描述

group(num=0)

匹配的整個(gè)表達(dá)式的字符串,group()可以一次輸入多個(gè)組號(hào),在這種情況下它將返回一個(gè)包含那些組所對(duì)應(yīng)值的元組。

groups()

返回一個(gè)包含所有小組字符串的元組,從1所含的小組號(hào)。

實(shí)例一:

 

 
  1. import re 
  2. print(re.search("rlovep","rlovep.com").span()) 
  3. print(re.search("com","http://rlovep.com").span()) 
  4. #輸出: 
  5. import re 
  6. print(re.search("rlovep","rlovep.com").span()) 
  7. print(re.search("com","http://rlovep.com").span()) 

實(shí)例二:

 

 
  1. import re 
  2. line = "This is my blog" 
  3. #匹配含有is的字符串 
  4. matchObj = re.search( r'(.*) is (.*?) .*', line, re.M|re.I) 
  5. #使用了組輸出:當(dāng)group不帶參數(shù)是將整個(gè)匹配成功的輸出 
  6. #當(dāng)帶參數(shù)為1時(shí)匹配的是最外層左邊包括的第一個(gè)括號(hào),一次類推; 
  7. if matchObj: 
  8. print ("matchObj.group() : ", matchObj.group())#匹配整個(gè) 
  9. print ("matchObj.group(1) : ", matchObj.group(1))#匹配的第一個(gè)括號(hào) 
  10. print ("matchObj.group(2) : ", matchObj.group(2))#匹配的第二個(gè)括號(hào) 
  11. else
  12. print ("No match!!"
  13. #輸出: 
  14. matchObj.group() : This is my blog 
  15. matchObj.group(1) : This 
  16. matchObj.group(2) : my 

search和match區(qū)別:re.match只匹配字符串的開(kāi)始,如果字符串開(kāi)始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回None;而re.search匹配整個(gè)字符串,直到找到一個(gè)匹配。

python爬蟲(chóng)小試牛刀

利用python抓取頁(yè)面中所有的http協(xié)議的鏈接,并遞歸抓取子頁(yè)面的鏈接。使用了集合和隊(duì)列;此去爬的是我的網(wǎng)站,第一版很多bug;代碼如下:

 

 
  1. import re 
  2. import urllib.request 
  3. import urllib 
  4. from collections import deque 
  5. #使用隊(duì)列存放url  
  6. queue = deque() 
  7. >前面的python3入門系列基本上也對(duì)python入了門,從這章起就開(kāi)始介紹下python的爬蟲(chóng)教程,拿出來(lái)給大家分享;爬蟲(chóng)說(shuō)的簡(jiǎn)單,就是去抓取網(wǎng)路的數(shù)據(jù)進(jìn)行分析處理;這章主要入門,了解幾個(gè)爬蟲(chóng)的小測(cè)試,以及對(duì)爬蟲(chóng)用到的工具介紹,比如集合,隊(duì)列,正則表達(dá)式; 
  8. <!--more--> 
  9. #使用visited防止重復(fù)爬同一頁(yè)面 
  10. visited = set() 
  11. url = 'http://rlovep.com' # 入口頁(yè)面, 可以換成別的 
  12. #入隊(duì)最初的頁(yè)面 
  13. queue.append(url) 
  14. cnt = 0 
  15. while queue: 
  16. url = queue.popleft() # 隊(duì)首元素出隊(duì) 
  17. visited |= {url} # 標(biāo)記為已訪問(wèn) 
  18. print('已經(jīng)抓取: ' + str(cnt) + ' 正在抓取 <--- ' + url) 
  19. cnt += 1 
  20. #抓取頁(yè)面 
  21. urlop = urllib.request.urlopen(url) 
  22. #判斷是否為html頁(yè)面 
  23. if 'html' not in urlop.getheader('Content-Type'): 
  24. continue 
  25. # 避免程序異常中止, 用try..catch處理異常 
  26. try
  27. #轉(zhuǎn)換為utf-8碼 
  28. data = urlop.read().decode('utf-8'
  29. except: 
  30. continue 
  31. # 正則表達(dá)式提取頁(yè)面中所有隊(duì)列, 并判斷是否已經(jīng)訪問(wèn)過(guò), 然后加入待爬隊(duì)列 
  32. linkre = re.compile("href=['/"]([^/"'>]*?)['/"].*?"
  33. for x in linkre.findall(data):##返回所有有匹配的列表 
  34. if 'http' in x and x not in visited:##判斷是否為http協(xié)議鏈接,并判斷是否抓取過(guò) 
  35. queue.append(x) 
  36. print('加入隊(duì)列 ---> ' + x) 

結(jié)果如下:

python3爬蟲(chóng)之入門基礎(chǔ)和正則表達(dá)式

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 一二区电影 | 天天干导航 | 91九色福利 | 久久在线免费视频 | 一区二区三区日韩精品 | 久久人添人人爽人人爽人人片av | 国产精品久久久久久久娇妻 | 亚洲成人免费网站 | 国产中出在线观看 | 91看片在线播放 | 香蕉成人在线视频 | 国产乱淫av一区二区三区 | 日朝毛片 | 国产精品99久久99久久久二 | 色综合久久久久久久久久久 | 久国产 | 久久久久国产一区二区三区不卡 | 国产精品久久久久久婷婷天堂 | 日韩视频一区在线 | 逼片| 成人免费福利 | 国产一区二区精品免费 | 国产一精品久久99无吗一高潮 | 久久久久久久九九九九 | 亚洲国产中文字幕 | 黄色av免费网站 | 丰满年轻岳中文字幕一区二区 | 综合网日日天干夜夜久久 | 国产91在线亚洲 | 欧美黄色视屏 | 国产在线精品一区二区三区 | 国产一及毛片 | 久久久免费观看完整版 | 中文字幕在线网站 | 久久精品一二三区白丝高潮 | 亚州综合 | 49vv看片免费| 国产午夜电影在线观看 | 少妇一级淫片免费放4p | 成人午夜在线播放 | 在线91视频 |