最近抓取了大衆點評的評論,其中遇到了相當有趣的用圖片代替字體的反扒方法,給大家分享一下。
需求
抓取目的商鋪的評論及相關信息
分析網站
- 大衆點評的評論信息需要登錄後才能看到,登錄獲取其cookie,用以爬蟲模擬登錄
- 分析其評論詳情圖片,發現裏面的某字體不是正常的文字,而是通過圖片代替字體,通過檢查文字的css,發現相關的字體在http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/145a30db44df01339efea895999d3587.svg(不同的時間,地址會有所改變)
同時,通過研究頁面的源代碼,發現裏面的某個css文件存放着給個字體的class對應的位置
通過對這些的分析,能得到相應的字體文字。
代碼實現
獲取每個字代表的偏移量
def get_font_dict():
"""
獲取每個字代表的偏移量
:return:
"""
url = 'http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/c6763031f4ca5ef21c6b079409f076b9.css'
url = 'http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/66ed5cd66492f2f67ccf37ae948a303c.css'
r = requests.get(url, headers=headers)
font_list = re.findall('.*?{.*?}', r.text)
font_dict = {}
for font in font_list:
# print(font)
class_font = font.split('{')[0].replace('.', '')
pianyi_list = re.findall('\d+', font.split('{')[1])
num_list = [int(x) for x in pianyi_list if int(x) != 0]
if len(num_list) == 1:
num_list.insert(0, 0)
font_dict[class_font] = num_list
# print(font_dict)
return font_dict
獲取每一行的文字
def get_font_place():
"""
獲取每一行對應的文字
:return:
"""
# url = 'http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/3617c635ce7e39c7e8fa09bb3a0ea481.svg'
url = 'http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/145a30db44df01339efea895999d3587.svg'
place_list = []
id_dict = []
r = requests.get(url, headers)
# print(r.text)
soup = BeautifulSoup(r.text, 'html.parser')
# print(soup)
text_list = soup.find_all('text')
# text_list = soup.find_all('textpath')
# id_list = soup.find_all('path')
# print(len(text_list))
for i in range(len(text_list)):
# x = text_list[i]['textlength']
# # st = text_list[i].text
# # # print(id_list[i])
# # y = id_list[i]['d'].split()[1]
# # # print(y, st)
# # place_list.append({y: [x, st]})
y = text_list[i]['y']
text = text_list[i].text
place_list.append({y:text})
# print(place_list)
return place_list
獲取相應的位置對應的真實文字
def get_ture_font(place):
"""
獲取真實的評論字
:param place:
:return:
"""
num = 0
for i in font_place:
for k in i:
if int(k) > place[1]:
# print(i)
num = 1
st = i[k]
# st = i[k][1]
# leng = i[k][0]
if num:
break
# st_num = int((int(leng) - place[0]) / 14)
st_num = int(place[0]) / 14
# print(st_num)
# true_font = st[len(st) - st_num]
true_font = st[int(st_num)]
# print(true_font)
return true_font
總結
大衆點評的反爬比較嚴重,對ip、賬號的實行限制,對字體也進行反爬,而且字體反爬的鏈接、規則也會變化,是個進行爬蟲技能檢閱的不錯的網站。下面是詳細的代碼:詳細代碼地址