久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

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

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

      用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) 官方文檔 返回一個 http.client.HTTPResponse 對象, 這個對象又用到的read()方法;返回?cái)?shù)據(jù);這個函數(shù)返回一個 http.client.HTTPResponse 對象, 這個對象又有各種方法, 比如我們用到的read()方法;

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

        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)  ##打印出網(wǎng)址:  a.geturl()

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

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

      隊(duì)列 介紹

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

      #隊(duì)列簡單測試:
      from collections import deque
      queue=deque([“peace”,”rong”,”sisi”])
      queue.append(“nick”)
      queue.append(“pishi”)
      print(queue.popleft())
      print(queue.popleft())
      print(queue)

      集合介紹:

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

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

      大括號或 set() 函數(shù)可以用來創(chuà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)
        #對稱差集
        print(a^b)
      #輸出: 
      {‘peace’, ‘rong’, ‘nick’}
      {‘peace’, ‘rong’}
      {‘peace’, ‘rong’, ‘nick’}
      {‘peace’, ‘rong’}
      {‘nick’}
      {‘nick’}

      正則表達(dá)式

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

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

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

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

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

      1.compile和match

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

        import re    # 將正則表達(dá)式編譯成Pattern對象  pattern = re.compile(r'rlovep')  # 使用Pattern匹配文本,獲得匹配結(jié)果,無法匹配時將返回None  m = pattern.match('rlovep.com')  if m:  # 使用Match獲得分組信息    print(m.group())  ### 輸出 ###  # rlovep  re.compile(strPattern[, flag]):

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

      可選值有:

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

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

      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ì)模式。這個模式下正則表達(dá)式可以是多行,忽略空白字符,并可以加入注釋。

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

      屬性:

      string: 匹配時使用的文本。
      re: 匹配時使用的Pattern對象。
      pos: 文本中正則表達(dá)式開始搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數(shù)相同。
      endpos: 文本中正則表達(dá)式結(jié)束搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數(shù)相同。
      lastindex: 最后一個被捕獲的分組在文本中的索引。如果沒有被捕獲的分組,將為None。
      lastgroup: 最后一個被捕獲的分組的別名。如果這個分組沒有別名或者沒有被捕獲的分組,將為None。

      方法:

      group([group1, …]):
      獲得一個或多個分組截獲的字符串;指定多個參數(shù)時將以元組形式返回。group1可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫參數(shù)時,返回group(0);沒有截獲字符串的組返回None;截獲了多次的組返回最后一次截獲的子串。
      groups([default]):
      以元組形式返回全部分組截獲的字符串。相當(dāng)于調(diào)用group(1,2,…last)。default表示沒有截獲字符串的組以這個值替代,默認(rèn)為None。
      groupdict([default]):
      返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒有別名的組不包含在內(nèi)。default含義同上。
      start([group]):
      返回指定的組截獲的子串在string中的起始索引(子串第一個字符的索引)。group默認(rèn)值為0。
      end([group]):
      返回指定的組截獲的子串在string中的結(jié)束索引(子串最后一個字符的索引+1)。group默認(rèn)值為0。
      span([group]):
      返回(start(group), end(group))。
      expand(template):
      將匹配到的分組代入template中然后返回。template中可以使用id或g<id>、 g<name>引用分組,但不能使用編號0。id與g<id>是等價的;但10將被認(rèn)為是第10個分組,如果你想表達(dá) 1之后是字符’0’,只能使用g<1>0。
      pattern:Pattern對象是一個編譯好的正則表達(dá)式,通過Pattern提供的一系列方法可以對文本進(jìn)行匹配查找。

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

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

      pattern: 編譯時用的表達(dá)式字符串。
      flags: 編譯時用的匹配模式。數(shù)字形式。
      groups: 表達(dá)式中分組的數(shù)量。
      groupindex: 以表達(dá)式中有別名的組的別名為鍵、以該組對應(yīng)的編號為值的字典,沒有別名的組不包含在內(nèi)。
      實(shí)例方法[ | re模塊方法]:

      match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]):
      這個方法將從string的pos下標(biāo)處起嘗試匹配pattern;如果pattern結(jié)束時仍可匹配,則返回一個Match對象;如果匹配過程中pattern無法匹配,或者匹配未結(jié)束就已到達(dá)endpos,則返回None。
      pos和endpos的默認(rèn)值分別為0和len(string);re.match()無法指定這兩個參數(shù),參數(shù)flags用于編譯pattern時指定匹配模式。
      注意:這個方法并不是完全匹配。當(dāng)pattern結(jié)束時若string還有剩余字符,仍然視為成功。想要完全匹配,可以在表達(dá)式末尾加上邊界匹配符’$’。
      search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):
      這個方法用于查找字符串中可以匹配成功的子串。從string的pos下標(biāo)處起嘗試匹配pattern,如果pattern結(jié)束時仍可匹配,則返回一個Match對象;若無法匹配,則將pos加1重新嘗試匹配;直到pos=endpos時仍無法匹配則返回None。 pos和endpos的默認(rèn)值分別為0和len(string));re.search()無法指定這兩個參數(shù),參數(shù)flags用于編譯pattern時指定匹配模式。
      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,返回一個順序訪問每一個匹配結(jié)果(Match對象)的迭代器。
      sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):
      使用repl替換string中每一個匹配的子串后返回替換后的字符串。 當(dāng)repl是一個字符串時,可以使用id或g<id>、g<name>引用分組,但不能使用編號0。 當(dāng)repl是一個方法時,這個方法應(yīng)當(dāng)只接受一個參數(shù)(Match對象),并返回一個字符串用于替換(返回的字符串中不能再引用分組)。 count用于指定最多替換次數(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ù)說明:

      參數(shù)
      描述
      pattern
      匹配的正則表達(dá)式
      string
      要匹配的字符串。
      flags
      標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。

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

      匹配對象方法
      描述
      group(num=0)
      匹配的整個表達(dá)式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應(yīng)值的元組。
      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

      實(shí)例二:使用group

        import re  line = "This is my blog"  #匹配含有is的字符串  matchObj = re.match( r'(.*) is (.*?) .*', line, re.M|re.I)  #使用了組輸出:當(dāng)group不帶參數(shù)是將整個匹配成功的輸出  #當(dāng)帶參數(shù)為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

      3.re.search方法

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

      函數(shù)語法:

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

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

      參數(shù)
      描述
      pattern
      匹配的正則表達(dá)式
      string
      要匹配的字符串。
      flags
      標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。

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

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

      實(shí)例一:

        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())

      實(shí)例二:

        import re  line = "This is my blog"  #匹配含有is的字符串  matchObj = re.search( r'(.*) is (.*?) .*', line, re.M|re.I)  #使用了組輸出:當(dāng)group不帶參數(shù)是將整個匹配成功的輸出  #當(dāng)帶參數(shù)為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區(qū)別:re.match只匹配字符串的開始,如果字符串開始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回None;而re.search匹配整個字符串,直到找到一個匹配。

      python爬蟲小試牛刀

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

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

      結(jié)果如下:

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

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號