日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

 小世界的野孩子 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)制方式存儲

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

    1、使用流程

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

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

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

    2、常用方法

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

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

      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>仰天大笑出門去</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
    
    # 獲取頁面
    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)
    
    # 解析頁面
    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é)束,謝謝使用本爬蟲")
                break
        
if __name__ == "__main__":
    spider = NeihanSpider()
    spider.workOn()

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

1、步驟

      1、找URL規(guī)律

        第1頁:https://www./njjzw/

第2頁:https://www./njjzw/index_2.html

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

      3、寫代碼

        1、發(fā)請求

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
        
    # 獲取頁面
    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)
    
    # 解析頁面
    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:[("霸王別姬","張國榮","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、知識點(diǎn)

      1、csv模塊的使用流程

        1、打開csv文件

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

         2、初始化寫入對象

          writer = csv.writer(f)

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

          writer.writerow([列表])

    2、準(zhǔn)備工作

      1、找URL規(guī)律

        第1頁:http:///board/4?offset=0

第2頁:http:///board/4?offset=10

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

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

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

      3、寫代碼

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

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

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

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

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

    db = conn.庫名

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

    myset = db.集合名

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

    myset.insert(字典)

    >>>show dbs

    >>>use 庫名

    >>>show collections

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

    >>>db.dropDatabase()

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

2、存入MySQL數(shù)據(jù)庫(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ā)起請求,并獲取響應(yīng)對象

    2、響應(yīng)對象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()使用場景

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

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

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

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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多