抓取大衆點評評論

最近抓取了大衆點評的評論,其中遇到了相當有趣的用圖片代替字體的反扒方法,給大家分享一下。

需求

抓取目的商鋪的評論及相關信息

分析網站

  • 大衆點評的評論信息需要登錄後才能看到,登錄獲取其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、賬號的實行限制,對字體也進行反爬,而且字體反爬的鏈接、規則也會變化,是個進行爬蟲技能檢閱的不錯的網站。下面是詳細的代碼:詳細代碼地址

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