訂閱
糾錯
加入自媒體

python修煉day33!

2019-02-23 09:27
QYFabc
關(guān)注

正則表達式

匹配單個字符

.   匹配任意一個字符,除了  d  匹配 0-9 的數(shù)字D 匹配非數(shù)字   與d 相反[]  匹配 [] 中列舉的字符 w  匹配 0-9 a-z A-Z _    慎用,可以匹配中文W  匹配非 ws   匹配空白,即空格、tab鍵,     表示 tab 鍵S  匹配非空   與s 相反

匹配多個字符

{m,n}  匹配前一個字符 m-n 次{m}  匹配前一個字符 m 次?  匹配前一個字符1次或0次,可有可無       # python 默認貪婪,加 ?變?yōu)榉秦澙罚?    匹配前一個字符0次或任意次,不匹配   可以使用模塊中的 re.S 模塊來忽略+   匹配槍一個字符 1次或任意次

開頭結(jié)尾

^  匹配字符串開頭       #  [^>]    在 [] 中 ^ 表示非$ 匹配字符串結(jié)尾

匹配分組

|  匹配左邊或者右邊,表示 或(ab)  將括號中的字符作為一個分組um  引用分組num匹配到的字符串(?p<name>)   給分組起別名(?p=name)   引用別名為name的分組取到的字符串

re模塊高級用法

re.match()     能夠匹配出以xxx開頭的字符串re.search()    能夠匹配出包含xxx的字符串re.findall()  能夠找出所有xxx字符串re.sub()     將匹配到的數(shù)據(jù)進行替換re.split()     根據(jù)匹配進行切割字符串,并返回一個列表

Python里數(shù)量詞默認是貪婪的

貪婪:總是嘗試匹配盡可能多的字符非貪婪:總是嘗試匹配盡可能少的字符。    在"","?","+","{m,n}"后面加上 ? , 使貪婪變成非貪婪。

r的作用

python中字符串加上 r 表示原生字符串,不需要頻繁轉(zhuǎn)義

練習代碼import re"""判斷變量名是否符合要求"""# 一些變量名names = ["age", "_age", "1age", "age1", "a_age", "age_1_", "age。, "a#123", "__________"]for name in names:    # 使用正則來判斷是否符合要求    # 只能由字母、數(shù)字、下劃線組成,不能以數(shù)字開頭    # 正則以 ^ 開頭, $ 結(jié)尾    ret = re.match(r"^[a-zA-Z_][a-zA-Z0-9_]*$", name)    # 判斷是否有數(shù)據(jù)    if ret:        print("%s 變量名符合要求,正則匹配的數(shù)據(jù)是 %s" % (name, ret.group()))    else:        print("%s 不符合要求" % name)import redef email_1():    """    匹配網(wǎng)易郵箱    qinyifan__123@163.com    命名規(guī)范:由 0-9 a-z A-Z _ 組成,不能以數(shù)字開頭    """    # 提示輸入郵箱    email_str = input("請輸入你的郵箱:")    # 正則判斷郵箱是否正確    ret = re.match(r"^[a-zA-Z_][0-9a-zA-Z_]{3,19}@163.com", email_str)    if ret:        print("郵箱 %s 名字合法" % email_str)    else:        print("郵箱 %s 名字不合法" % email_str)def email_2():    """    匹配任意郵箱    :return:    """    # 提示輸入郵箱    email_str = input("請輸入你的郵箱:")    # 正則判斷郵箱是否正確    # ret = re.match(r"^[0-9a-zA-Z_]*@[0-9a-z]{3,5}.(com|com.cn|net|org.cn.com)", email_str)    ret = re.match(r"^[0-9a-zA-Z_]+@[0-9a-zA-Z]+(.[a-zA-Z])", email_str)    if ret:        print("郵箱 %s 名字合法" % email_str)    else:        print("郵箱 %s 名字不合法" % email_str)def phone_1():    """    匹配座機號碼    要求:區(qū)號3-4位,號碼7-8位,號碼和區(qū)號之間可有有-號,可以沒有    :return:    """    # 提示輸入手機號    phone_num = str(input("請輸入你的手機號:"))    # 正則判斷    ret = re.match(r"^[d]{3,4}-?[d]{7,8}$", phone_num)    if ret:        print("手機號 %s 正確" % phone_num)    else:        print("手機號 %s 不正確" % phone_num)def phone_2():    """    匹配尾號不是4和7的手機號    :return:    """    # 提示輸入手機號    phone_num = str(input("請輸入你的手機號:"))    # 正則判斷    ret = re.match(r"^[0-35-68-9]{11}$", phone_num)    if ret:        print("手機號 %s 正確" % phone_num)    else:        print("手機號 %s 不正確" % phone_num)def main():    email_1()    email_2()    phone_1()    phone_2()if __name__ == '__main__':    main()"""使用正則判斷來爬取一整個網(wǎng)頁的圖片,簡單的爬蟲思路:    1.先打開要爬取的網(wǎng)頁,找到網(wǎng)頁源代碼,保存在 douyu.txt 文件中,    2.進行文件打開操作,使用正則判斷得到每個圖片地址并且保存在一個列表中    3.遍歷得到每個圖片地址,使用urllib庫取得每個圖片的信息,指定路徑進行寫入操作。"""import reimport urllib.requestimport geventfrom gevent import monkeyimport timemonkey.patch_all()"""封裝函數(shù)實現(xiàn)一下多任務  失敗"""def find_img_url():    """打開存儲網(wǎng)頁源代碼的文件,使用正則得到圖片網(wǎng)址列表"""    with open("douyu.txt", "rb") as f:        file = f.read().decode("utf-8")        # print(file)        ret = re.findall(r"https://.*.jpg", file)        print(ret)    return retdef download_img(ret):    """對得到的網(wǎng)址列表進行操作"""    num = 0    for img_url in ret:        num += 1        content = urllib.request.urlopen(img_url)        img = content.read()        with open("./douyu_img/img" + str(num) + ".jpg", "wb") as f:            f.write(img)            print("第 %d 張下載完畢" % num)    print("全部下載完畢")def main():    # 先調(diào)用獲取網(wǎng)址列表的函數(shù)    ret = find_img_url()    # download_img(ret)    # 創(chuàng)建協(xié)程    # g = gevent.spawn(download_img, ret)    # g.join()    gevent.joinall([        gevent.spawn(download_img, ret)    ])if __name__ == '__main__':    main()

小任務:爬取圖片,

從給定的網(wǎng)頁中寫正則取出圖片地址,放到列表中

根據(jù)過濾出來的鏈接去網(wǎng)上下載圖片,方法 img 文件夾中

給定一個網(wǎng)址,下載其中所有的圖片到 image 文件夾中

要求用協(xié)程實現(xiàn)

"""實現(xiàn)打開一個網(wǎng)址,從中下載圖片"""import urllib.requestimport reimport geventdef get_url():    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}  # 請求頭,來模仿瀏覽器    # r = urllib.request.Request("https://www.douyu.com/g_yz", headers=header)  # 請求一個網(wǎng)站(斗魚),將請求頭傳過去,服務器會返回一個值    r = urllib.request.Request("https://www.huya.com/g/1663", headers=header)  # 虎牙    req = urllib.request.urlopen(r)  # 打開服務器返回的源代碼    img_content = req.read().decode("utf-8")  # 將數(shù)據(jù)保存到一個變量中,  進行解碼    # print(img_content)    # 使用正則從網(wǎng)頁數(shù)據(jù)中取出所有的 圖片地址并保存到一個列表中    img_all_url = re.findall(r"https://.*?.jpg", img_content)    print(img_all_url)    # img_all_url.pop(0)  # 不知為何斗魚網(wǎng)站匹配出來的前兩個網(wǎng)址是錯的,強行進行刪除    # img_all_url.pop(0)    # print(img_all_url)    return img_all_urldef download_img(img_url, num):    """對得到的每個圖片地址執(zhí)行下載操作"""    ret = urllib.request.urlopen(img_url)  # 得到每個圖片返回的數(shù)據(jù)    img_content = ret.read()  # 得到每個圖片的內(nèi)容    with open("./douyu_img/huya_img/img" + str(num) + ".jpg", "wb") as f:  # 打開文件時注意路徑        f.write(img_content)    print("正在從 %s 下載" % img_url)    print("這是第 %d 張" % num)def main():    # 調(diào)用取得所有圖片地址的函數(shù)    img_all_url = get_url()    # 新建一個 gevent 列表    gevent_list = []    num = 0    for img_url in img_all_url:  # 遍歷得到每個圖片地址        num += 1        # download_img(img_url, num)  # 調(diào)用函數(shù)對得到的每個圖片內(nèi)容下載        gevent_list.a(chǎn)ppend(gevent.spawn(download_img, img_url, num))
   # 實現(xiàn)協(xié)程    gevent.joinall(gevent_list)if __name__ == '__main__':    main()

今天的內(nèi)容需要記憶的很多,不過也很好玩,爬蟲真的是很有趣,不過現(xiàn)在只是實現(xiàn)了簡單的爬取圖片,而且實驗的這兩個網(wǎng)址對于圖片的反爬機制不是那么好,以后要爬的肯定不是簡單的圖片,而且也不會那么好爬的,需要再學更多的知識,才能做到想爬什么就爬什么。

爬蟲、反爬蟲、反反爬蟲、一個想爬,一個不讓爬,最后變?yōu)閮蓚程序員之間的戰(zhàn)爭,有意思...


<上一頁  1  2  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號