亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > regex > 正文

python3爬蟲之入門基礎和正則表達式

2020-01-20 22:09:31
字體:
來源:轉載
供稿:網友

前面的python3入門系列基本上也對python入了門,從這章起就開始介紹下python的爬蟲教程,拿出來給大家分享;爬蟲說的簡單,就是去抓取網路的數據進行分析處理;這章主要入門,了解幾個爬蟲的小測試,以及對爬蟲用到的工具介紹,比如集合,隊列,正則表達式;

用python抓取指定頁面:

代碼如下:

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

urllib.request.urlopen(url) 官方文檔 返回一個 http.client.HTTPResponse 對象, 這個對象又用到的read()方法;返回數據;這個函數返回一個 http.client.HTTPResponse 對象, 這個對象又有各種方法, 比如我們用到的read()方法;

查找可變網址:

import urllibimport urllib.requestdata={}data['word']='one peace'url_values=urllib.parse.urlencode(data)url="http://www.baidu.com/s?"full_url=url+url_valuesa = 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也可以實現隊列,但是效率不高?,F在在此處介紹下:在容器中有隊列: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,結果的處理

下圖列出了正則表達式的語法:

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

1.compile和match

re模塊中compile用于生成pattern的對象,再通過調用pattern實例的match方法處理文本最終獲得match實例;通過使用match獲得信息;

import re# 將正則表達式編譯成Pattern對象pattern = re.compile(r'rlovep')# 使用Pattern匹配文本,獲得匹配結果,無法匹配時將返回Nonem = pattern.match('rlovep.com')if m:# 使用Match獲得分組信息  print(m.group())### 輸出 #### rlovepre.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
標志位,用于控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。

匹配對象方法
描述
group(num=0)
匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。
groups()
返回一個包含所有小組字符串的元組,從 1 所含的小組號。

演示如下:

#re.match.import reprint(re.match("rlovep","rlovep.com"))##匹配rlovepprint(re.match("rlovep","rlovep.com").span())##從開頭匹配rlovepprint(re.match("com","http://rlovep.com"))##不再起始位置不能匹配成功##輸出:<_sre.SRE_Match object; span=(0, 6), match='rlovep'>(0, 6)None

實例二:使用group

import reline = "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 blogmatchObj.group(1) : ThismatchObj.group(2) : my

3.re.search方法

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

函數語法:

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

函數參數說明:

參數
描述
pattern
匹配的正則表達式
string
要匹配的字符串。
flags
標志位,用于控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。

匹配對象方法
描述
group(num=0)
匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。
groups()
返回一個包含所有小組字符串的元組,從 1 所含的小組號。

實例一:

import reprint(re.search("rlovep","rlovep.com").span())print(re.search("com","http://rlovep.com").span())#輸出:import reprint(re.search("rlovep","rlovep.com").span())print(re.search("com","http://rlovep.com").span())

實例二:

import reline = "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 blogmatchObj.group(1) : ThismatchObj.group(2) : my

search和match區別:re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。

python爬蟲小試牛刀

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

import reimport urllib.requestimport urllibfrom collections import deque#使用隊列存放url queue = deque()>前面的python3入門系列基本上也對python入了門,從這章起就開始介紹下python的爬蟲教程,拿出來給大家分享;爬蟲說的簡單,就是去抓取網路的數據進行分析處理;這章主要入門,了解幾個爬蟲的小測試,以及對爬蟲用到的工具介紹,比如集合,隊列,正則表達式;<!--more-->#使用visited防止重復爬同一頁面visited = set()url = 'http://rlovep.com' # 入口頁面, 可以換成別的 #入隊最初的頁面queue.append(url)cnt = 0while queue: url = queue.popleft() # 隊首元素出隊 visited |= {url} # 標記為已訪問 print('已經抓取: ' + str(cnt) + '  正在抓取 <--- ' + url) cnt += 1 #抓取頁面 urlop = urllib.request.urlopen(url) #判斷是否為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)

結果如下:

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产高清视频一区三区| 欧美日韩一区二区精品| 欧美日韩国产区| 久久精品国产视频| 日韩欧美aaa| 欧美午夜无遮挡| 国产91成人在在线播放| 揄拍成人国产精品视频| 欧美激情手机在线视频| 国产精品偷伦免费视频观看的| 亚洲欧美日韩精品久久奇米色影视| 久久天天躁狠狠躁夜夜躁2014| 亚洲国产精品嫩草影院久久| 精品国产一区二区三区久久| 成人激情视频在线观看| 国产色综合天天综合网| 成人网在线视频| 国产aaa精品| 欧美日韩亚洲一区二区三区| 欧美韩国理论所午夜片917电影| 亚洲欧美成人精品| 亚洲最大av在线| 亚洲国产欧美一区| 欧美一区亚洲一区| 亚洲一区二区久久久| 成人在线视频福利| 欧美视频裸体精品| 亚洲精品国产精品久久清纯直播| 狠狠久久五月精品中文字幕| 亚洲精品短视频| 国产精品麻豆va在线播放| 亚洲奶大毛多的老太婆| 成人福利视频网| 一区二区三区www| 久久久久女教师免费一区| 亚洲乱码一区av黑人高潮| 亚洲欧洲自拍偷拍| 亚洲系列中文字幕| 国产精品专区第二| 久久亚洲精品中文字幕冲田杏梨| 伊人久久五月天| 国产精品久久一| 亚洲天堂精品在线| 日韩在线视频中文字幕| 国产一区视频在线| 精品国产依人香蕉在线精品| 91美女片黄在线观看游戏| 亚洲一区亚洲二区| 成人两性免费视频| 欧美在线观看日本一区| 中文字幕v亚洲ⅴv天堂| 久久久亚洲网站| 欧美国产在线电影| 日韩在线观看免费高清完整版| 午夜精品国产精品大乳美女| 影音先锋日韩有码| 欧美日韩黄色大片| 国产一区二区欧美日韩| 久久这里有精品| 亚洲第一区第二区| 国产97在线|日韩| 国产精品丝袜一区二区三区| 亚洲一区二区三区四区在线播放| 欧美亚洲国产成人精品| 91午夜在线播放| 欧美日韩成人黄色| 97久久超碰福利国产精品…| 日韩成人在线观看| 伊人久久久久久久久久| 日韩精品免费在线视频观看| 91系列在线播放| 欧美日韩一区二区精品| 91精品国产高清久久久久久| 一本一道久久a久久精品逆3p| 国产视频久久久久久久| 国产精品视频网址| 久久不射热爱视频精品| 亚洲国产精品悠悠久久琪琪| 国产精品日韩在线播放| www.亚洲免费视频| 亚洲国产私拍精品国模在线观看| 日韩av在线免费播放| 久久久精品一区二区| 国产91免费看片| 国产91精品视频在线观看| 欧美日韩激情视频| 久久久久久久电影一区| 欧美成人亚洲成人| 久久精品福利视频| 亚洲最大福利视频| 日韩精品有码在线观看| 高清欧美性猛交xxxx黑人猛交| 国产精品三级网站| 亚洲色图13p| 96精品久久久久中文字幕| 亚洲欧美日韩精品久久奇米色影视| 精品久久久久久中文字幕大豆网| 中文日韩在线观看| 日本精品久久中文字幕佐佐木| 全亚洲最色的网站在线观看| 亚洲国产精品中文| 亚洲成人教育av| 欧美亚洲另类制服自拍| 欧美整片在线观看| 欧美片一区二区三区| 精品国产乱码久久久久酒店| 国产亚洲日本欧美韩国| 久久视频在线视频| 精品成人在线视频| 国模精品一区二区三区色天香| 亚洲人在线视频| 日韩在线不卡视频| 亚洲精品日韩在线| 欧美一区二区三区免费视| 日韩高清欧美高清| 久久国产精品久久精品| 欧美精品日韩三级| 91久久精品久久国产性色也91| 中文字幕在线国产精品| 国产一区二区在线免费| 成人久久精品视频| 国产精品视频1区| 欧美在线免费视频| 亚洲精品在线视频| 欧美一区二区三区精品电影| 91亚洲va在线va天堂va国| 91高清免费在线观看| 国产视频久久久| 一级做a爰片久久毛片美女图片| 欧美理论在线观看| 亚洲综合精品一区二区| 中国人与牲禽动交精品| 一区二区三区在线播放欧美| 欧美激情国产高清| 26uuu亚洲伊人春色| 九九热99久久久国产盗摄| 欧美精品在线免费观看| 国产成人高清激情视频在线观看| 国产精品欧美一区二区三区奶水| 日韩电影第一页| 久久精品亚洲精品| 91精品国产综合久久久久久久久| 久久精品视频导航| 日韩的一区二区| 国产精品青青在线观看爽香蕉| 精品久久久国产精品999| 日韩av毛片网| 日韩黄在线观看| 国产精品福利无圣光在线一区| 欧美成人四级hd版| 欧美理论片在线观看| 中文字幕成人精品久久不卡| 亚洲一区二区在线播放| 久久精品青青大伊人av| 日韩av毛片网| 久久国产精品久久精品| 国产婷婷成人久久av免费高清| 久久在线免费观看视频| 日韩欧美亚洲成人| 亚洲欧美一区二区激情| 亚洲乱亚洲乱妇无码| 国产成人精品亚洲精品| 在线亚洲午夜片av大片| 欧美在线一区二区视频|