Python爬蟲入門教程 65-100 爬蟲與反爬蟲的修羅場,點評網站,字體反爬之三

爬蟲與反爬蟲的修羅場

哪種平臺最吸引爬蟲愛好者,當然是社區類的,那裏容易產生原生態,高質量的數據啊,

你看微博,知乎,豆瓣爬的不亦樂乎。

評論也是產生內容的好地方

生活類點評網站

旅遊類點評網站

音樂類點評

只要有點評的地方,總有成千上萬的爬蟲趴着。

這些都是爬蟲與反爬蟲的修羅場,他不想叫你爬,你越想爬

對他是核心數據,對你也是核心數據

今天要分析的網站

今天我們弄一下大衆點評

學習階段,我們要抱着學習的目的

重點是思路,做爬蟲就不要想着一勞永逸了

方法公開,人家就換了

知識是你自己的,學到了,他換不掉

好了,我們開始吧

網站展示

在這裏插入圖片描述
what?! 數字是圖片

在這裏插入圖片描述
在這裏插入圖片描述
打開svg圖片,看看貓膩

在這裏插入圖片描述
按照咱爬蟲的經驗分析

必然是css實現了圖片的定位,顯示的局部

簡單,手撕代碼

走起

我們如何搞定這些定位呢?

在這裏插入圖片描述
簡單啊,查找突破口

DOM長成這個樣子

<b>
<svgmtsi class="zrvm6"></svgmtsi>
<svgmtsi class="zrpoc"></svgmtsi>
</b>

zrvm6 對應的是哪個數字呢?

座標在着

.zrvm6 {
    background: -103.0px -116.0px;
}

那是不是拿到所有的座標就可以了?

必然是的

在這裏插入圖片描述
打開網頁源文件

找啊~找啊,找朋友

咦?

在這裏插入圖片描述
這麼耿直的麼?
這是在鄙視我們爬蟲工程師麼
還是告訴我,此地無銀

在這裏插入圖片描述
秀啊,找到了

接下來,敲黑板

如何從<svgmtsi class="zrvm6"></svgmtsi>得到數字6

第一步,我要打rap

額,不,我要獲取css

爲了加速,我寫重要步驟了

你只需要這樣,這樣,就抓取到了
哈哈哈

關鍵代碼

重要的註釋,我已經添加好了

import re
import requests
from lxml import html


# 獲取css的全部數據,並且一會通過正則表達式匹配出你想要的class
# css_name 你需要獲取的css名稱,例如zrvm6
# css_url 'https://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/3b0a424aef56ae40afe7711036173836.css'
# 這個地方是動態的,每次都要重新抓取一下
# .tiimh{background:-456.0px -849.0px;}  編寫正則表達式
def get_css_position(css_name,css_url):

    css_positon_html = requests.get(css_url).text

    str_css = (r'%s{background:-(\d+).0px -(\d+).0px' % css_name)
    css_re = re.compile(str_css)
    info_css = css_re.findall(css_positon_html)

    return info_css
if __name__ == '__main__':
    a = get_css_position('tiimh','https://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/3b0a424aef56ae40afe7711036173836.css')
    print(a)

展示結果,bingo,搞定

[('456', '849')]

接下來,你在這樣,這樣,over

在這裏插入圖片描述
座標拿到了,下面要對應到svg裏面
svg是有規律的,讓我們看一下吧

在這裏插入圖片描述
橫座標,12的倍數,縱座標分別是49,90,140,這個應該也是動態的,批量抓取的時候注意

# url需要動態獲取哦~
result = requests.get('https://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/3e7551c3d26f090c29498db5024b1090.svg')
tree = html.fromstring(result.content)

a = tree.xpath('//text[@y="49"]/text()')[0]  # 縱座標也是動的,需要動態
b = tree.xpath('//text[@y="90"]/text()')[0]
c = tree.xpath('//text[@y="140"]/text()')[0]

補全解析過程

x,y = get_css_position('zrvm6','https://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/3b0a424aef56ae40afe7711036173836.css')[0]
x,y = int(x),int(y)
print('zrvm6的座標是',x,y)
if y <= 49:
    print('svg圖片對應的數字:',a[x // 12])
elif y <= 90:
    print('svg圖片對應的數字:',b[x // 12])
else:
    print('svg圖片對應的數字:',c[x // 12])
09682953461602125891507990058105385628648915741477 54883192734856091073652293607343306967545493213422 24700621614898877713
zrvm6的座標是 103 116
svg圖片對應的數字: 6

ok,搞定了,要的就是這個feel

得到數字6,回去一看

哦,果然是6

666

在這裏插入圖片描述
歡迎關注「非本科程序員」 回覆 【點評】獲取本篇博客源碼

掃碼關注非本科程序員

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章