柚子快報(bào)邀請(qǐng)碼778899分享:02、爬蟲數(shù)據(jù)解析-Re解析
柚子快報(bào)邀請(qǐng)碼778899分享:02、爬蟲數(shù)據(jù)解析-Re解析
數(shù)據(jù)解析的目的是不拿到頁面的全部?jī)?nèi)容,只拿到部分我們想要的內(nèi)容內(nèi)容。
Re解析就是正則解析,效率高準(zhǔn)確性高。學(xué)習(xí)本節(jié)內(nèi)容前需要學(xué)會(huì)基礎(chǔ)的正則表達(dá)式。
一、正則匹配規(guī)則
1、常用元字符
.? ? ? ?匹配除換行符以外的字符
\w? ? 匹配字母或數(shù)字或下劃線
\s? ? ?匹配任意的空白符
\d? ? ?匹配數(shù)字
\n? ? ?匹配一個(gè)換行符
\t? ? ? 匹配一個(gè)制表符
^? ? ? 匹配字符串的開始
$? ? ? 匹配字符串的結(jié)尾
?\W? ?匹配非字母或數(shù)字或下劃線
\D? ? ?匹配非數(shù)字
\S? ? ?匹配非空白符
a|b? ? 匹配字符a或字符b
()? ? ? ?匹配括號(hào)內(nèi)的表達(dá)式,也表示一個(gè)組
[...]? ? 匹配字符組中的字符
[^...]? ?匹配除了字符組中字符的所有字符
2、量詞:控制前面的元字符出現(xiàn)的次數(shù)
*? ? ? ? 重復(fù)0次或更多次
+? ? ? ?重復(fù)一次或更多次
?? ? ? 重復(fù)0次或一次
{n}? ? ?重復(fù)n次
{n,}? ? 重復(fù)n次或更多次
{n,m} 重復(fù)n到m次
3、貪婪匹配和非貪婪匹配(重要)
.*? ? ?貪婪匹配
.*?? ?惰性匹配
二、Re模塊
re模塊中只需要記住以下幾種功能就夠用了
1、re.findall
匹配字符串中所有的符合正則的內(nèi)容,返回list
import re
list = re.findall(r"\d+","我的電話號(hào)是:10086,小紅的電話是100000")
print(list)
#運(yùn)行結(jié)果:['10086', '100000']
2、re.finditer(重點(diǎn))
和findall差不多,只不過這時(shí)返回的是迭代器
因?yàn)閒indall返回列表,當(dāng)頁面上數(shù)據(jù)較大時(shí),list就會(huì)非常大,效率不高。
從迭代器中拿到內(nèi)容需要.group()
import re
it = re.finditer(r"\d+","我的電話號(hào)是:10086,小紅的電話是100000")
print(it)
#返回結(jié)果:
for i in it:
print(i.group())
#返回結(jié)果
# 10086
# 100000
3、re.search
進(jìn)行匹配,但是如果匹配到了第一個(gè)結(jié)果,就會(huì)返回這個(gè)結(jié)果。如果匹配不上search返回的是None。
如果拿到了返回的依然是迭代器,使用.group()取到匹配的內(nèi)容
import re
s = re.search(r"\d+","我的電話號(hào)是:10086,小紅的電話是100000")
print(s.group())
#返回結(jié)果 10086
4、re.match
只能從字符串的開頭進(jìn)行匹配。相當(dāng)于在正則表達(dá)式前面加了一個(gè)^
import re
s1 = re.match(r"\d+","我的電話號(hào)是:10086,小紅的電話是100000")
print(s1.group()) #報(bào)錯(cuò),未找到
s2 = re.match(r"\d+","10086,小紅的電話是100000")
print(s2.group()) #返回10086
5、預(yù)加載正則表達(dá)式(re.compile(r"\d+"))
當(dāng)后面正則較為復(fù)雜的時(shí)候,就可以使用預(yù)加載,先寫規(guī)則。
import re
obj = re.compile(r"\d+")
ret = obj.finditer("我的電話號(hào)是:10086,小紅的電話是100000")
for it in ret:
print(it.group())
6、單獨(dú)提取正則中的內(nèi)容
re.S的作用是讓.能匹配換行符
obj = re.compile(r"
ret = obj.finditer(s)
for it in ret:
print(it.group("hello"))
# 小米
# 華為
# 三星
# 蘋果
三、實(shí)戰(zhàn):豆瓣top250
1、需求:
拿到排行榜的電影名稱,年份,評(píng)價(jià),打分,并使用csvwriter寫入到csv文件中
2、思路:
(1)拿到頁面源代碼 requests
(2)通過re來提取到想要的有效信息 re
import re
import requests
import csv
url = "http://movie.douban.com/top250"
headers ={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
}
resp = requests.get(url,headers=headers)
page_content = resp.text
#解析數(shù)據(jù)
obj = re.compile(r'
r'
.*?
(?P
r'
.*?'r'(?P
ret = obj.finditer(page_content)
f = open("data.csv",mode="w",encoding="utf-8")
csvwriter = csv.writer(f)
for it in ret:
# print(it.group("name"))
# print(it.group("time").strip())
# print(it.group("score"))
# print(it.group("judge"))
dic = it.groupdict()
dic['time'] = dic['time'].strip()#因?yàn)槟攴莺竺嬗锌崭瘢瑔为?dú)處理
csvwriter.writerow(dic.values())
resp.close()
?結(jié)果:
四、實(shí)戰(zhàn):屠戮盜版天堂電影信息
1、需求:
想拿到2024必看篇的所有電影下載地址。
2、思路
(1)定位到2024必看篇
(2)從2024必看篇中提取到子頁面的鏈接地址
(3)請(qǐng)求子頁面的鏈接地址,拿到我們想要的下載地址
注:此站點(diǎn)進(jìn)行了反爬措施,需要添加User-Agent和Cookie。并且編碼為gb2312,需要設(shè)置。
import requests
import re
url = "https://www.dytt89.com/"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
"Cookie":"guardok=VxXtQIYG+FVwAJLu76U/QvRiEyoXdFVFLcCsBijzPzwTF6G1uhyRle6K2pHzz4oYx32wQY0n0W/gv80enczOuA==; __vtins__KSHU1VNqce379XHB=%7B%22sid%22%3A%20%222408df8b-f3ee-5771-b99c-a0b206621ca0%22%2C%20%22vd%22%3A%201%2C%20%22stt%22%3A%200%2C%20%22dr%22%3A%200%2C%20%22expires%22%3A%201722072217375%2C%20%22ct%22%3A%201722070417375%7D; __51uvsct__KSHU1VNqce379XHB=1; __51vcke__KSHU1VNqce379XHB=8133f70d-0abb-5af7-91dc-fbf00581cf6a; __51vuft__KSHU1VNqce379XHB=1722070417377; Hm_lvt_93b4a7c2e07353c3853ac17a86d4c8a4=1722070418; Hm_lpvt_93b4a7c2e07353c3853ac17a86d4c8a4=1722070418; HMACCOUNT=4AF1B6073CA4B2F3; Hm_lvt_8e745928b4c636da693d2c43470f5413=1722070418; Hm_lpvt_8e745928b4c636da693d2c43470f5413=1722070418; Hm_lvt_0113b461c3b631f7a568630be1134d3d=1722070418; Hm_lpvt_0113b461c3b631f7a568630be1134d3d=1722070418"
}
resp = requests.get(url, verify=False,headers=headers)#verify=False去掉安全驗(yàn)證
resp.encoding = "gb2312"
# print(resp.text)
#定位到2024必看
obj1 = re.compile(r'2024必看熱片.*?
- (.*?)
obj2 = re.compile(r"a href='(?P
obj3 = re.compile(r'譯 名(?P
.*?WORD-WRAP: break-word" bgcolor="#fdfddf">', re.S)
result1 = obj1.finditer(resp.text)
for it in result1:
ul = it.group()
#提取子頁面鏈接
result2 = obj2.finditer(ul)
for it2 in result2:
)
#請(qǐng)求子頁面鏈接
resp2 = requests.get(href, headers=headers,verify=False)
resp2.encoding = "gb2312"
#拿到子頁面鏈接的下載地址
result3 = obj3.finditer(resp2.text)
for it3 in result3:
print(it3.group("movie"))
print(it3.group("download"))
resp2.close()
resp.close()
柚子快報(bào)邀請(qǐng)碼778899分享:02、爬蟲數(shù)據(jù)解析-Re解析
推薦文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。