乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Skr-Eric的爬蟲(chóng)課堂(二)——爬蟲(chóng)的解析模塊和數(shù)據(jù)持久化存儲(chǔ)

       小世界的野孩子 2020-01-15

      解析模塊

        1、數(shù)據(jù)的分類

          1、結(jié)構(gòu)化數(shù)據(jù)

            特點(diǎn):有固定的格式,如:HTML、XML

          2、非結(jié)構(gòu)化數(shù)據(jù)

            示例:圖片、音頻、視頻,這類數(shù)據(jù)以二進(jìn)制方式存儲(chǔ)

        2、正則表達(dá)式 re

          1、使用流程

            1、創(chuàng)建編譯對(duì)象 :p = re.compile('正則表達(dá)式')

            2、對(duì)字符串進(jìn)行匹配 :r = p.match('字符串')

            3、獲取匹配結(jié)果     :r.group()

          2、常用方法

            1、match(html) : 字符串開(kāi)頭的第1個(gè),返回對(duì)象

            2、search(html): 從開(kāi)始往后找,匹配第1個(gè),返回對(duì)象

            3、findall(html) : 所有全部匹配,返回列表

          3、表達(dá)式

            .  : 匹配任意字符(不包括\n)

            \d : 數(shù)字

            \s : 空白字符

            \S : 非空白字符

            \w : 字母、數(shù)字、_

            [...] : 包含[]內(nèi)容 :A[BCD]E --> ABE ACE ADE

            *  : 0次或多次

            ?  : 0次或1次

            +  : 1次或多次

            {m}: m次

            {m,n} : m-n次,  AB{1,3}C ->ABC ABBC ABBBC

          4、貪婪匹配和非貪婪匹配

            貪婪匹配(.*) : 在整個(gè)表達(dá)式匹配成功的前提下,盡可能多的匹配*

            非貪婪匹配(.*?) :在整個(gè)表達(dá)式匹配成功的前提下,盡可能少的匹配*

      import re
      
      html = """<div><p>仰天大笑出門(mén)去</p></div>
      <div><p>成也風(fēng)云,敗也風(fēng)云</p></div>
      """
      # 貪婪匹配,re.S使 . 能匹配\n在內(nèi)的所有字符
      p = re.compile('<div><p>.*</p></div>',re.S)
      r = p.findall(html)
      print(r)
      
      # 非貪婪匹配
      p = re.compile('<div><p>.*?</p></div>',re.S)
      r = p.findall(html)
      print(r)

          5、findall()的分組

      import re
      
      s = "A B C D"
      p1 = re.compile('\w+\s+\w+')
      r1 = p1.findall(s)
      print(r1)
      
      # 第1步:['A B','C D']
      # 第2步:['A','C']
      p2 = re.compile('(\w+)\s+\w+')
      r2 = p2.findall(s)
      print(r2)
      
      # 第1步:['A B','C D']
      # 第2步:[('A','B'),('C','D')]
      p3 = re.compile('(\w+)\s+(\w+)')
      r3 = p3.findall(s)
      print(r3)

        3、內(nèi)涵段子腦筋急轉(zhuǎn)彎抓取

      import urllib.request
      import re
      
      class NeihanSpider:
          def __init__(self):
              self.headers = {"User-Agent":"Mozilla/5.0"}
              self.baseurl = "https://www./njjzw/"
              self.page = 1
          
          # 獲取頁(yè)面
          def getPage(self,url):
              req = urllib.request.Request(url,headers=self.headers)
              res = urllib.request.urlopen(req) 
              html = res.read().decode("utf-8")
              self.parsePage(html)
          
          # 解析頁(yè)面
          def parsePage(self,html):
              p = re.compile('<div class="text-column-item.*?title="(.*?)">.*?class="desc">(.*?)</div>',re.S)
              r_list = p.findall(html)
      #        print(r_list)
              # r_list: [("二虎","公母"),(),()]
              self.writePage(r_list)
          # 保存數(shù)據(jù)
          def writePage(self,r_list):
              for r_tuple in r_list:
                  for r_str in r_tuple:
                      with open("急轉(zhuǎn)彎.txt","a",encoding="gb18030") as f:
                          f.write(r_str.strip() + "\n")
                  # 每個(gè)急轉(zhuǎn)彎之間有兩個(gè)空行
                  with open("急轉(zhuǎn)彎.txt","a") as f:
                      f.write("\n\n")
                  
          # 主函數(shù)
          def workOn(self):
              self.getPage(self.baseurl)
              while True:
                  c = input("成功,是否繼續(xù)(y/n):")
                  if c.strip().lower() == "y":
                      self.page += 1
                      url = self.baseurl + "index_"                       + str(self.page) + ".html"
                      self.getPage(url)
                  else:
                      print("爬取結(jié)束,謝謝使用本爬蟲(chóng)")
                      break
              
      if __name__ == "__main__":
          spider = NeihanSpider()
          spider.workOn()

          網(wǎng)址 :http://www.

      1、步驟

            1、找URL規(guī)律

              第1頁(yè):https://www./njjzw/

      第2頁(yè):https://www./njjzw/index_2.html

            2、用正則匹配出題目和答案

            3、寫(xiě)代碼

              1、發(fā)請(qǐng)求

      2、用正則解析

        <div class="text-column-item.*?title="(.*?)">.*?class="desc">(.*?)</div>

      3、保存

        4、貓眼電影top100榜單,存到csv文件里

      import urllib.request
      import re
      import csv
      
      class MaoyanSpider:
          def __init__(self):
              self.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60"}
              self.baseurl = "http:///board/4?offset="
              self.offset = 0
              self.page = 1
              
          # 獲取頁(yè)面
          def getPage(self,url):
              req = urllib.request.Request(url,headers=self.headers)
              res = urllib.request.urlopen(req)
              html = res.read().decode("utf-8")
              self.parsePage(html)
          
          # 解析頁(yè)面
          def parsePage(self,html):
              p = re.compile('<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>',re.S)
              r_list = p.findall(html)
              # r_list:[("霸王別姬","張國(guó)榮","1993"),(),()]
              self.writeTocsv(r_list)
              
          # 保存數(shù)據(jù)
          def writeTocsv(self,r_list):
              for r_tuple in r_list:
      #            L = list(r_tuple)
                  L = [r_tuple[0].strip(),r_tuple[1].strip(),r_tuple[2].strip()]
                  with open("貓眼電影.csv","a",newline="") as f:
                      writer = csv.writer(f)
                      writer.writerow(L)
              
          # 主函數(shù)
          def workOn(self):
              while True:
                  c = input("爬按y,退出按q:")
                  if c.strip().lower() == "y":  
                      url = self.baseurl + str(self.offset)
                      self.getPage(url)
                      self.page += 1
                      self.offset = (self.page - 1)*10 
                  else:
                      print("爬取結(jié)束")
                      break
                      
      if __name__ == "__main__":
          spider = MaoyanSpider()
          spider.workOn()

          網(wǎng)址 :貓眼電影 - 榜單 - top100榜

          目標(biāo) :抓取電影名、主演、上映時(shí)間

          1、知識(shí)點(diǎn)

            1、csv模塊的使用流程

              1、打開(kāi)csv文件

               with open("測(cè)試.csv","a",newline="") as f:

               2、初始化寫(xiě)入對(duì)象

                writer = csv.writer(f)

                3、寫(xiě)入數(shù)據(jù)(列表)

                writer.writerow([列表])

          2、準(zhǔn)備工作

            1、找URL規(guī)律

              第1頁(yè):http:///board/4?offset=0

      第2頁(yè):http:///board/4?offset=10

      第n頁(yè):offset=(n-1)*10

            2、寫(xiě)正則表達(dá)式

              <div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>

            3、寫(xiě)代碼

      數(shù)據(jù)持久化存儲(chǔ)

      1、存入mongodb數(shù)據(jù)庫(kù)(pymongo模塊回顧)

          # 創(chuàng)建連接對(duì)象

          conn = pymongo.MongoClient("localhost",27017)

          # 創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象

          db = conn.庫(kù)名

          # 創(chuàng)建集合對(duì)象

          myset = db.集合名

          # 插入數(shù)據(jù)

          myset.insert(字典)

          >>>show dbs

          >>>use 庫(kù)名

          >>>show collections

          >>>db.集合名.find().pretty()

          >>>db.dropDatabase()

          >>>db.集合名.count()

      2、存入MySQL數(shù)據(jù)庫(kù)(pymysql模塊回顧)

      3、requests模塊

        1、安裝

          Anaconda Prompt : conda install requests

          Windows cmd     : python -m pip install requests

            ## python -m 是以管理員身份執(zhí)行pip安裝命令

          Ubuntu          : sudo pip3 install requests

        2、常用方法

          1、requests.get(url,headers=headers)

            發(fā)起請(qǐng)求,并獲取響應(yīng)對(duì)象

          2、響應(yīng)對(duì)象res的屬性

            1、res.text    : 字符串

            2、res.content : 字節(jié)流

            3、res.encoding: 指定字符編碼 (ISO-8859-1)

                   ## res.encoding = "utf-8"

            4、res.status_code : 響應(yīng)碼

            5、res.url         : 實(shí)際數(shù)據(jù)的URL

          3、get()使用場(chǎng)景

            1、沒(méi)有查詢參數(shù)

              res = requests.get(url,headers=headers)

            2、有查詢參數(shù)(params)

              res = requests.get(url,params=params,headers=headers)

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多