您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“python爬蟲遇到動(dòng)態(tài)加密怎么辦”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
在前幾天針某點(diǎn)評(píng)商家搜索頁面的字體反爬給出了解決方案,但是還有一個(gè)問題,那就是當(dāng)時(shí)給出的方法是下載對(duì)應(yīng)的woff字體文件,然后建立加密字體與編碼之間的映射關(guān)系來進(jìn)行破解。
但是有一個(gè)問題就是不同頁面的字體文件,是動(dòng)態(tài)加載的,換句話說就是你在這個(gè)頁面建立的映射關(guān)系,換一個(gè)頁面就不能用了。
那就沒有解決辦法了嗎?其實(shí)也不難,或者說對(duì)方還是給了很清晰的思考方向,因?yàn)椋m然每一個(gè)頁面的字體是動(dòng)態(tài)加載的,但是這個(gè)動(dòng)態(tài)僅針對(duì)字體解析后編碼的變化,字體內(nèi)部順序是沒有變化的,也就是如下圖所示
每?jī)蓚€(gè)頁面中,僅僅是字體編碼發(fā)生了改變,而字體的位置順序并沒有改變,所以我們只需要在解析每一頁的數(shù)據(jù)之前,先提取頁面中CSS樣式,再?gòu)腃SS內(nèi)容中定位到字體文件存儲(chǔ)鏈接,之后就是請(qǐng)求這一頁對(duì)應(yīng)的字體文件并解析構(gòu)造匹配字典,后面的步驟就和上一篇文章一樣了。
那我們開始,目標(biāo)是爬取某城市指定美食的全部商家信息,比如定位廣州搜索沙縣小吃,之后爬取全部的搜索頁面。
首先就是構(gòu)造全部的URL,由于每一頁的URL是有一定規(guī)律的,所以這一步很簡(jiǎn)單,從第一頁中提取全部頁數(shù)然后按照規(guī)律添加到url_list中即可,而這個(gè)數(shù)據(jù)沒有被加密
所以這部分代碼可以這樣寫
def get_url(url): headers = { "Host": "www.dianping.com", "Referer":f"{url}", "User-Agent":ua.random, "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", "Sec-Fetch-User": "?1", "Upgrade-Insecure-Requests": "1" } r = requests.get(url = url,headers = headers,proxies = get_ip()) soup = BeautifulSoup(r.text) page_num = int(soup.find_all('a',class_ = 'PageLink')[-1].text) url_list = [url + f"/p{i+1}" for i in range(page_num)] return url_list
這部分代碼不難理解構(gòu)造請(qǐng)求——解析頁面——提取頁數(shù)——模擬URL,其中g(shù)et_ip()必須要返回一個(gè)可以使用的ip,不論你是用免費(fèi)的還是付費(fèi)的代理,在這里不做詳細(xì)講解。
搞定URL之后,我們來到最關(guān)鍵的步驟,寫一個(gè)函數(shù),傳進(jìn)來一個(gè)頁面返回該頁的文字匹配字典,那么第一步就是把字體拿下來,下面四行代碼即可搞定
css_url = "http://" + re.search(r's3plus.meituan.net/(.*?)/svgtextcss/(.*?).css', page.text).group(0) #拿到css文件 css_value = requests.get(css_url).text addr_font = "http:" + re.search(r'address(.*?).woff', css_value).group(0).split(',')[-1][5:] price_font = "http:" + re.search(r'shopNum(.*?).woff', css_value).group(0).split(',')[-1][5:]
簡(jiǎn)單來看一下這段代碼,我們傳入一個(gè)請(qǐng)求后得到的page后
“
第一行代碼使用正則表達(dá)式提取字體所在的css鏈接
第二行代碼使用requests請(qǐng)求css內(nèi)容
最后兩行代碼使用正則提取woff字體文件所在URL
”
如果你傳進(jìn)去的頁面是正常的,那么現(xiàn)在我們就有地址、均價(jià)字段的字體所在URL,下面就可以使用requests將這兩個(gè)字體文件下載并保存在本地,代碼如下
x = requests.get(addr_font).content with open('addr.woff','wb+') as f: f.write(x) x = requests.get(price_font).content with open('price.woff','wb+') as f: f.write(x)
現(xiàn)在工作目錄下就有兩個(gè)字體文件,之后就按照上一篇文章介紹的字體加密破解方法操作即可。所以這部分完整代碼如下:
def get_font(page): ''' 接收請(qǐng)求后的頁面 返回該頁url字體woff文件對(duì)應(yīng)的兩個(gè)字典文件 '''python css_url = "http://" + re.search(r's3plus.meituan.net/(.*?)/svgtextcss/(.*?).css', page.text).group(0) #拿到css文件 css_value = requests.get(css_url).text addr_font = "http:" + re.search(r'address(.*?).woff', css_value).group(0).split(',')[-1][5:] price_font = "http:" + re.search(r'shopNum(.*?).woff', css_value).group(0).split(',')[-1][5:] #下載字體保存到本地 x = requests.get(addr_font).content with open('addr.woff','wb+') as f: f.write(x) x = requests.get(price_font).content with open('price.woff','wb+') as f: f.write(x) #解析字體 font_addr = TTFont('addr.woff') font1 = font_addr.getGlyphOrder()[2:] font1 = [font1[i][-4:] for i in range(len(font1))] font_price = TTFont('price.woff') font2 = font_price.getGlyphOrder()[2:] font2 = [font2[i][-4:] for i in range(len(font2))] font3 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '店', '中', '美', '家', '館', '小', '車', '大', '市', '公', '酒', '行', '國(guó)', '品', '發(fā)', '電', '金', '心', '業(yè)', '商', '司', '超', '生', '裝', '園', '場(chǎng)', '食', '有', '新', '限', '天', '面', '工', '服', '海', '華', '水', '房', '飾', '城', '樂', '汽', '香', '部', '利', '子', '老', '藝', '花', '專', '東', '肉', '菜', '學(xué)', '福', '飯', '人', '百', '餐', '茶', '務(wù)', '通', '味', '所', '山', '區(qū)', '門', '藥', '銀', '農(nóng)', '龍', '停', '尚', '安', '廣', '鑫', '一', '容', '動(dòng)', '南', '具', '源', '興', '鮮', '記', '時(shí)', '機(jī)', '烤', '文', '康', '信', '果', '陽', '理', '鍋', '寶', '達(dá)', '地', '兒', '衣', '特', '產(chǎn)', '西', '批', '坊', '州', '牛', '佳', '化', '五', '米', '修', '愛', '北', '養(yǎng)', '賣', '建', '材', '三', '會(huì)', '雞', '室', '紅', '站', '德', '王', '光', '名', '麗', '油', '院', '堂', '燒', '江', '社', '合', '星', '貨', '型', '村', '自', '科', '快', '便', '日', '民', '營(yíng)', '和', '活', '童', '明', '器', '煙', '育', '賓', '精', '屋', '經(jīng)', '居', '莊', '石', '順', '林', '爾', '縣', '手', '廳', '銷', '用', '好', '客', '火', '雅', '盛', '體', '旅', '之', '鞋', '辣', '作', '粉', '包', '樓', '校', '魚', '平', '彩', '上', '吧', '保', '永', '萬', '物', '教', '吃', '設(shè)', '醫(yī)', '正', '造', '豐', '健', '點(diǎn)', '湯', '網(wǎng)', '慶', '技', '斯', '洗', '料', '配', '匯', '木', '緣', '加', '麻', '聯(lián)', '衛(wèi)', '川', '泰', '色', '世', '方', '寓', '風(fēng)', '幼', '羊', '燙', '來', '高', '廠', '蘭', '阿', '貝', '皮', '全', '女', '拉', '成', '云', '維', '貿(mào)', '道', '術(shù)', '運(yùn)', '都', '口', '博', '河', '瑞', '宏', '京', '際', '路', '祥', '青', '鎮(zhèn)', '廚', '培', '力', '惠', '連', '馬', '鴻', '鋼', '訓(xùn)', '影', '甲', '助', '窗', '布', '富', '牌', '頭', '四', '多', '妝', '吉', '苑', '沙', '恒', '隆', '春', '干', '餅', '氏', '里', '二', '管', '誠(chéng)', '制', '售', '嘉', '長(zhǎng)', '軒', '雜', '副', '清', '計(jì)', '黃', '訊', '太', '鴨', '號(hào)', '街', '交', '與', '叉', '附', '近', '層', '旁', '對(duì)', '巷', '棟', '環(huán)', '省', '橋', '湖', '段', '鄉(xiāng)', '廈', '府', '鋪', '內(nèi)', '側(cè)', '元', '購(gòu)', '前', '幢', '濱', '處', '向', '座', '下', '県', '鳳', '港', '開', '關(guān)', '景', '泉', '塘', '放', '昌', '線', '灣', '政', '步', '寧', '解', '白', '田', '町', '溪', '十', '八', '古', '雙', '勝', '本', '單', '同', '九', '迎', '第', '臺(tái)', '玉', '錦', '底', '后', '七', '斜', '期', '武', '嶺', '松', '角', '紀(jì)', '朝', '峰', '六', '振', '珠', '局', '崗', '洲', '橫', '邊', '濟(jì)', '井', '辦', '漢', '代', '臨', '弄', '團(tuán)', '外', '塔', '楊', '鐵', '浦', '字', '年', '島', '陵', '原', '梅', '進(jìn)', '榮', '友', '虹', '央', '桂', '沿', '事', '津', '凱', '蓮', '丁', '秀', '柳', '集', '紫', '旗', '張', '谷', '的', '是', '不', '了', '很', '還', '個(gè)', '也', '這', '我', '就', '在', '以', '可', '到', '錯(cuò)', '沒', '去', '過', '感', '次', '要', '比', '覺', '看', '得', '說', '常', '真', '們', '但', '最', '喜', '哈', '么', '別', '位', '能', '較', '境', '非', '為', '歡', '然', '他', '挺', '著', '價(jià)', '那', '意', '種', '想', '出', '員', '兩', '推', '做', '排', '實(shí)', '分', '間', '甜', '度', '起', '滿', '給', '熱', '完', '格', '薦', '喝', '等', '其', '再', '幾', '只', '現(xiàn)', '朋', '候', '樣', '直', '而', '買', '于', '般', '豆', '量', '選', '奶', '打', '每', '評(píng)', '少', '算', '又', '因', '情', '找', '些', '份', '置', '適', '什', '蛋', '師', '氣', '你', '姐', '棒', '試', '總', '定', '啊', '足', '級(jí)', '整', '帶', '蝦', '如', '態(tài)', '且', '嘗', '主', '話', '強(qiáng)', '當(dāng)', '更', '板', '知', '己', '無', '酸', '讓', '入', '啦', '式', '笑', '贊', '片', '醬', '差', '像', '提', '隊(duì)', '走', '嫩', '才', '剛', '午', '接', '重', '串', '回', '晚', '微', '周', '值', '費(fèi)', '性', '桌', '拍', '跟', '塊', '調(diào)', '糕'] font_addr_data = dict(map(lambda x,y:[x,y],font1,font3)) font_price_data = dict(map(lambda x,y:[x,y],font2,font3)) return font_addr_data,font_price_data
唯一需要注意的就是,這里傳進(jìn)去的page,就是你直接請(qǐng)求當(dāng)前頁面返回的內(nèi)容,比如
page = requests.get(url = url,headers = headers,proxies = get_ip()).text
你需要確保這里的page是正確包含內(nèi)容的,如果是被403之后的頁面或者是提示要輸入驗(yàn)證碼之類的頁面是無法正確執(zhí)行的。
那么到這里,我們就搞定了在每一頁的字體文件都是動(dòng)態(tài)加載的情況下如何爬取全部搜索頁面的信息,之后只需要寫一個(gè)循環(huán)爬去url_list中的全部URL,并使用pandas進(jìn)行保存即可。
“python爬蟲遇到動(dòng)態(tài)加密怎么辦”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。