python修煉day33!
正則表達(dá)式
匹配單個(gè)字符
. 匹配任意一個(gè)字符,除了 d 匹配 0-9 的數(shù)字D 匹配非數(shù)字 與d 相反[] 匹配 [] 中列舉的字符 w 匹配 0-9 a-z A-Z _ 慎用,可以匹配中文W 匹配非 ws 匹配空白,即空格、tab鍵, 表示 tab 鍵S 匹配非空 與s 相反
匹配多個(gè)字符
{m,n} 匹配前一個(gè)字符 m-n 次{m} 匹配前一個(gè)字符 m 次? 匹配前一個(gè)字符1次或0次,可有可無 # python 默認(rèn)貪婪,加 ?變?yōu)榉秦澙罚? 匹配前一個(gè)字符0次或任意次,不匹配 可以使用模塊中的 re.S 模塊來忽略+ 匹配槍一個(gè)字符 1次或任意次
開頭結(jié)尾
^ 匹配字符串開頭 # [^>] 在 [] 中 ^ 表示非$ 匹配字符串結(jié)尾
匹配分組
| 匹配左邊或者右邊,表示 或(ab) 將括號(hào)中的字符作為一個(gè)分組um 引用分組num匹配到的字符串(?p<name>) 給分組起別名(?p=name) 引用別名為name的分組取到的字符串
re模塊高級(jí)用法
re.match() 能夠匹配出以xxx開頭的字符串re.search() 能夠匹配出包含xxx的字符串re.findall() 能夠找出所有xxx字符串re.sub() 將匹配到的數(shù)據(jù)進(jìn)行替換re.split() 根據(jù)匹配進(jìn)行切割字符串,并返回一個(gè)列表
Python里數(shù)量詞默認(rèn)是貪婪的
貪婪:總是嘗試匹配盡可能多的字符非貪婪:總是嘗試匹配盡可能少的字符。 在"","?","+","{m,n}"后面加上 ? , 使貪婪變成非貪婪。
r的作用
python中字符串加上 r 表示原生字符串,不需要頻繁轉(zhuǎn)義
練習(xí)代碼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("請(qǐng)輸入你的郵箱:") # 正則判斷郵箱是否正確 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("請(qǐng)輸入你的郵箱:") # 正則判斷郵箱是否正確 # ret = re.match(r"^[0-9a-zA-Z_]*@[0-9a-z]{3,5}.(com|c(diǎn)om.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(): """ 匹配座機(jī)號(hào)碼 要求:區(qū)號(hào)3-4位,號(hào)碼7-8位,號(hào)碼和區(qū)號(hào)之間可有有-號(hào),可以沒有 :return: """ # 提示輸入手機(jī)號(hào) phone_num = str(input("請(qǐng)輸入你的手機(jī)號(hào):")) # 正則判斷 ret = re.match(r"^[d]{3,4}-?[d]{7,8}$", phone_num) if ret: print("手機(jī)號(hào) %s 正確" % phone_num) else: print("手機(jī)號(hào) %s 不正確" % phone_num)def phone_2(): """ 匹配尾號(hào)不是4和7的手機(jī)號(hào) :return: """ # 提示輸入手機(jī)號(hào) phone_num = str(input("請(qǐng)輸入你的手機(jī)號(hào):")) # 正則判斷 ret = re.match(r"^[0-35-68-9]{11}$", phone_num) if ret: print("手機(jī)號(hào) %s 正確" % phone_num) else: print("手機(jī)號(hào) %s 不正確" % phone_num)def main(): email_1() email_2() phone_1() phone_2()if __name__ == '__main__': main()"""使用正則判斷來爬取一整個(gè)網(wǎng)頁的圖片,簡單的爬蟲思路: 1.先打開要爬取的網(wǎng)頁,找到網(wǎng)頁源代碼,保存在 douyu.txt 文件中, 2.進(jìn)行文件打開操作,使用正則判斷得到每個(gè)圖片地址并且保存在一個(gè)列表中 3.遍歷得到每個(gè)圖片地址,使用urllib庫取得每個(gè)圖片的信息,指定路徑進(jìn)行寫入操作。"""import reimport urllib.requestimport geventfrom gevent import monkeyimport timemonkey.patch_all()"""封裝函數(shù)實(shí)現(xiàn)一下多任務(wù) 失。ⅲⅲef find_img_url(): """打開存儲(chǔ)網(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): """對(duì)得到的網(wǎng)址列表進(jìn)行操作""" 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ù):爬取圖片,
從給定的網(wǎng)頁中寫正則取出圖片地址,放到列表中
根據(jù)過濾出來的鏈接去網(wǎng)上下載圖片,方法 img 文件夾中
給定一個(gè)網(wǎng)址,下載其中所有的圖片到 image 文件夾中
要求用協(xié)程實(shí)現(xiàn)
"""實(shí)現(xiàn)打開一個(gè)網(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'} # 請(qǐng)求頭,來模仿瀏覽器 # r = urllib.request.Request("https://www.douyu.com/g_yz", headers=header) # 請(qǐng)求一個(gè)網(wǎng)站(斗魚),將請(qǐng)求頭傳過去,服務(wù)器會(huì)返回一個(gè)值 r = urllib.request.Request("https://www.huya.com/g/1663", headers=header) # 虎牙 req = urllib.request.urlopen(r) # 打開服務(wù)器返回的源代碼 img_content = req.read().decode("utf-8") # 將數(shù)據(jù)保存到一個(gè)變量中, 進(jìn)行解碼 # print(img_content) # 使用正則從網(wǎng)頁數(shù)據(jù)中取出所有的 圖片地址并保存到一個(gè)列表中 img_all_url = re.findall(r"https://.*?.jpg", img_content) print(img_all_url) # img_all_url.pop(0) # 不知為何斗魚網(wǎng)站匹配出來的前兩個(gè)網(wǎng)址是錯(cuò)的,強(qiáng)行進(jìn)行刪除 # img_all_url.pop(0) # print(img_all_url) return img_all_urldef download_img(img_url, num): """對(duì)得到的每個(gè)圖片地址執(zhí)行下載操作""" ret = urllib.request.urlopen(img_url) # 得到每個(gè)圖片返回的數(shù)據(jù) img_content = ret.read() # 得到每個(gè)圖片的內(nèi)容 with open("./douyu_img/huya_img/img" + str(num) + ".jpg", "wb") as f: # 打開文件時(shí)注意路徑 f.write(img_content) print("正在從 %s 下載" % img_url) print("這是第 %d 張" % num)def main(): # 調(diào)用取得所有圖片地址的函數(shù) img_all_url = get_url() # 新建一個(gè) gevent 列表 gevent_list = [] num = 0 for img_url in img_all_url: # 遍歷得到每個(gè)圖片地址 num += 1 # download_img(img_url, num) # 調(diào)用函數(shù)對(duì)得到的每個(gè)圖片內(nèi)容下載 gevent_list.a(chǎn)ppend(gevent.spawn(download_img, img_url, num))
# 實(shí)現(xiàn)協(xié)程 gevent.joinall(gevent_list)if __name__ == '__main__': main()
今天的內(nèi)容需要記憶的很多,不過也很好玩,爬蟲真的是很有趣,不過現(xiàn)在只是實(shí)現(xiàn)了簡單的爬取圖片,而且實(shí)驗(yàn)的這兩個(gè)網(wǎng)址對(duì)于圖片的反爬機(jī)制不是那么好,以后要爬的肯定不是簡單的圖片,而且也不會(huì)那么好爬的,需要再學(xué)更多的知識(shí),才能做到想爬什么就爬什么。
爬蟲、反爬蟲、反反爬蟲、一個(gè)想爬,一個(gè)不讓爬,最后變?yōu)閮蓚(gè)程序員之間的戰(zhàn)爭,有意思...
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長度6~500個(gè)字
最新活動(dòng)更多
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 1 【一周車話】沒有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無人駕駛車,還未迎來“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 6 馬斯克致敬“國產(chǎn)蘿卜”?
- 7 神經(jīng)網(wǎng)絡(luò),誰是盈利最強(qiáng)企業(yè)?
- 8 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 9 諾獎(jiǎng)進(jìn)入“AI時(shí)代”,人類何去何從?
- 10 Open AI融資后成萬億獨(dú)角獸,AI人才之爭開啟
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市