爬蟲與反爬蟲的修羅場
哪種平台最吸引爬蟲愛好者,當然是社區類的,那里容易產生原生態,高質量的數據啊,
你看微博,知乎,豆瓣爬的不亦樂乎。
評論也是產生內容的好地方
生活類點評網站
旅游類點評網站
音樂類點評
只要有點評的地方,總有成千上萬的爬蟲趴着。
這些都是爬蟲與反爬蟲的修羅場,他不想叫你爬,你越想爬
對他是核心數據,對你也是核心數據
今天要分析的網站
今天我們弄一下大眾點評
學習階段,我們要抱着學習的目的
重點是思路,做爬蟲就不要想着一勞永逸了
方法公開,人家就換了
知識是你自己的,學到了,他換不掉
好了,我們開始吧
網站展示
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
歡迎關注「非本科程序員」 回復 【點評】獲取本篇博客源碼