iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python爬虫实例:爬取猫眼电影——破
  • 690
分享到

Python爬虫实例:爬取猫眼电影——破

爬虫猫眼实例 2023-01-30 22:01:22 690人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

 字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的。 现在貌似不少网站都有采用这种反爬机制,我们通过猫眼

 字体反爬

字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的。

现在貌似不少网站都有采用这种反爬机制,我们通过猫眼的实际情况来解释一下。

 

下图的是猫眼网页上的显示:

 

检查元素看一下

这是什么鬼,关键信息全是乱码。

熟悉 CSS 的同学会知道,CSS 中有一个 @font-face,它允许网页开发者为其网页指定在线字体。原本是用来消除对用户电脑字体的依赖,现在有了新作用——反爬。

汉字光常用字就有好几千,如果全部放到自定义的字体中,那么字体文件就会变得很大,必然影响网页的加载速度,因此一般网站会选取关键内容加以保护,如上图,知道了等于不知道。

这里的乱码是由于 unicode 编码导致的,查看源文件可以看到具体的编码信息。

搜索 stonefont,找到 @font-face 的定义:

 

这里的 .woff 文件就是字体文件,我们将其下载下来,利用 Http://fontstore.baidu.com/static/editor/index.html 网页将其打开,显示如下:

网页源码中显示的  跟这里显示的是不是有点像?事实上确实如此,去掉开头的 &#x 和结尾的 ; 后,剩余的4个16进制显示的数字加上 uni 就是字体文件中的编码。所以 &#xea0b 对应的就是数字“9”。

知道了原理,我们来看下如何实现。

 

处理字体文件,我们需要用到 FontTools 库。

先将字体文件转换为 xml 文件看下:

from fontTools.ttLib import TTFont

font = TTFont('bb70be69aaed960fa6ec3549342b87d82084.woff')
font.saveXML('bb70be69aaed960fa6ec3549342b87d82084.xml')

打开 xml 文件

开头显示的就是全部的编码,这里的 id 仅仅是编号而已,千万别当成是对应的真实值。实际上,整个字体文件中,没有任何地方是说明 EA0B 对应的真实值是啥的。

看到下面

这里就是每个字对应的字体信息,计算机显示的时候,根本不需要知道这个字是啥,只需要知道哪个像素是黑的,哪个像素是白的就可以了。

 

猫眼的字体文件是动态加载的,每次刷新都会变,虽然字体中定义的只有 0-9 这9个数字,但是编码和顺序都是会变的。就是说,这个字体文件中“EA0B”代表“9”,在别的文件中就不是了。

但是,有一样是不变的,就是这个字的形状,也就是上图中定义的这些点。

 

我们先随便下载一个字体文件,命名为 base.woff,然后利用 fontstore 网站查看编码和实际值的对应关系,手工做成字典并保存下来。爬虫爬取的时候,下载字体文件,根据网页源码中的编码,在字体文件中找到“字形”,再循环跟 base.woff 文件中的“字形”做比较,“字形”一样那就说明是同一个字了。在 base.woff 中找到“字形”后,获取“字形”的编码,而之前我们已经手工做好了编码跟值的映射表,由此就可以得到我们实际想要的值了。

 

这里的前提是每个字体文件中所定义的“字形”都是一样的(猫眼目前是这样的,以后也许还会更改策略),如果更复杂一点,每个字体中的“字形”都加一点点的随机形变,那这个方法就没有用了,只能祭出杀手锏“OCR”了。

 

下面是完整的代码,抓取的是猫眼2018年电影的第一页,由于主要是演示破解字体反爬,所以没有抓取全部的数据。

代码中使用的 base.woff 文件跟上面截图显示的不是同一个,所以会看到编码跟值跟上面是对不上的。

import os
import time
import re
import requests
from fontTools.ttLib import TTFont
from fake_useragent import UserAgent
from bs4 import BeautifulSoup

host = 'http://maoyan.com'


def main():
    url = 'http://maoyan.com/films?yearId=13&offset=0'
    get_moviescore(url)


os.makedirs('font', exist_ok=True)
regex_woff = re.compile("(?<=url\(').*\.woff(?='\))")
regex_text = re.compile('(?<=<span class="stonefont">).*?(?=</span>)')
regex_font = re.compile('(?<=&#x).{4}(?=;)')

basefont = TTFont('base.woff')
fontdict = {'uniF30D': '0', 'uniE6A2': '8', 'uniEA94': '9', 'uniE9B1': '2', 'uniF620': '6',
            'uniEA56': '3', 'uniEF24': '1', 'uniF53E': '4', 'uniF170': '5', 'uniEE37': '7'}


def get_moviescore(url):
    # headers = {"User-Agent": UserAgent(verify_ssl=False).random}
    headers = {'User-Agent': 'Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWEBKit/537.36 (KHTML, like Gecko) '
                             'Chrome/68.0.3440.106 Safari/537.36'}
    html = requests.get(url, headers=headers).text
    soup = BeautifulSoup(html, 'lxml')
    ddlist = soup.find_all('dd')
    for dd in ddlist:
        a = dd.find('a')
        if a is not None:
            link = host + a['href']
            time.sleep(5)
            dhtml = requests.get(link, headers=headers).text
            msg = {}

            dsoup = BeautifulSoup(dhtml, 'lxml')
            msg['name'] = dsoup.find(class_='name').text
            ell = dsoup.find_all('li', {'class': 'ellipsis'})
            msg['type'] = ell[0].text
            msg['country'] = ell[1].text.split('/')[0].strip()
            msg['length'] = ell[1].text.split('/')[1].strip()
            msg['release-time'] = ell[2].text[:10]

            # 下载字体文件
            woff = regex_woff.search(dhtml).group()
            wofflink = 'http:' + woff
            localname = 'font\\' + os.path.basename(wofflink)
            if not os.path.exists(localname):
                downloads(wofflink, localname)
            font = TTFont(localname)

            # 其中含有 unicode 字符,BeautifulSoup 无法正常显示,只能用原始文本通过正则获取
            ms = regex_text.findall(dhtml)
            if len(ms) < 3:
                msg['score'] = '0'
                msg['score-num'] = '0'
                msg['box-office'] = '0'
            else:
                msg['score'] = get_fontnumber(font, ms[0])
                msg['score-num'] = get_fontnumber(font, ms[1])
                msg['box-office'] = get_fontnumber(font, ms[2]) + dsoup.find('span', class_='unit').text
            print(msg)


def get_fontnumber(newfont, text):
    ms = regex_font.findall(text)
    for m in ms:
        text = text.replace(f'&#x{m};', get_num(newfont, f'uni{m.upper()}'))
    return text


def get_num(newfont, name):
    uni = newfont['glyf'][name]
    for k, v in fontdict.items():
        if uni == basefont['glyf'][k]:
            return v


def downloads(url, localfn):
    with open(localfn, 'wb+') as sw:
        sw.write(requests.get(url).content)


if __name__ == '__main__':
    main()

 


 

也可以扫码关注我的个人公众号,后台回复 “猫眼”获取源码,及代码中我使用的 basefont。 

 


 

相关博文推荐:

 

--结束END--

本文标题: Python爬虫实例:爬取猫眼电影——破

本文链接: https://www.lsjlt.com/news/180264.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python爬虫实例:爬取猫眼电影——破
     字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的。 现在貌似不少网站都有采用这种反爬机制,我们通过猫眼...
    99+
    2023-01-30
    爬虫 猫眼 实例
  • Python爬虫项目--爬取猫眼电影To
     本次抓取猫眼电影Top100榜所用到的知识点: 1. python requests库 2. 正则表达式 3. csv模块 4. 多进程 正文 目标站点分析 通过对目标站点的分析, 来确定网页结构, 进一步确定具体的抓取方式. 1. 浏...
    99+
    2023-01-30
    爬虫 猫眼 项目
  • 爬取猫眼电影TOP100
    本文所讲的爬虫项目实战属于基础、入门级别,使用的是Python3.5实现的。 本项目基本目标:在猫眼电影中把top100的电影名,排名,海报,主演,上映时间,评分等爬取下来 爬虫原理和步骤 爬虫,就是从网页中爬取自己所需要的东西,如文字、...
    99+
    2023-01-30
    猫眼 电影
  • java爬虫如何爬取猫眼电影TOP榜数据
    这篇文章给大家分享的是有关java爬虫如何爬取猫眼电影TOP榜数据的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。爬虫是如何爬取猫眼电影TOP榜数据的。主要抓取的内容有排名、图片、电影名称、主演、上映时间和评分信息...
    99+
    2023-06-02
  • 一起学爬虫——使用xpath库爬取猫眼电
    之前分享了一篇使用requests库爬取豆瓣电影250的文章,今天继续分享使用xpath爬取猫眼电影热播口碑榜 XPATH语法 XPATH(XML Path Language)是一门用于从XML文件中查找信息的语言。通用适用于从HTML文...
    99+
    2023-01-30
    爬虫 猫眼 xpath
  • 网络爬虫丨基于requests+mysql爬取猫眼热门电影数据做可视化分析
    文章目录 写在前面实验描述实验内容遇到问题 写在后面 写在前面 本期内容:基于requests+mysql爬取猫眼热门电影数据做可视化分析 实验需求 anaconda丨pycharmp...
    99+
    2024-01-21
    爬虫 mysql 数据库
  • 用python爬取猫眼top100电影,我发现经典永远是经典
    前言想必大家在无聊的时候,都想找一部口碑的好电影,而自己又没看过的,这个其实可以参考猫眼top100的上排名,因为排名是靠评分升上去,想排名第一的《霸王别姬》,“哥哥”在里面的出色表演,让人惊叹下面来看看实现的过程...
    99+
    2023-06-02
  • Python爬虫爬取豆瓣电影之数据提取值
    工具:Python 3.6.5、PyCharm开发工具、Windows 10 操作系统、谷歌浏览器 目的:爬取豆瓣电影排行榜中电影的title、链接地址、图片、评价人数、评分等 网址:https://movie.douban.com/ch...
    99+
    2023-01-30
    爬虫 豆瓣 数据
  • python爬虫抓取电影天堂最新电影
    该小脚本实现对电影天堂网站的最新电影查找。from bs4 import BeautifulSoup  import  urllib import  re url= 'http://www.ygdy8.net/html/gndy/dyzz/...
    99+
    2023-01-31
    爬虫 最新电影 天堂
  • Python爬虫爬取爱奇艺电影片库首页的实例代码
    上篇文章给大家介绍了Python爬取爱奇艺电影信息代码实例 感兴趣的朋友点击查看下。 今天给大家介绍Python爬虫爬取爱奇艺电影片库首页,下面是实例代码,参考下: i...
    99+
    2024-04-02
  • Python趣味爬虫之爬取爱奇艺热门电影
    目录一、首先我们要找到目标二、F12查看网页源代码三、进行代码实现,获取想要资源。四、查看现象一、首先我们要找到目标 找到目标先分析一下网页很幸运这个只有一个网页,不需要翻页。 二...
    99+
    2024-04-02
  • Python爬虫怎么爬取豆瓣影评
    本篇内容主要讲解“Python爬虫怎么爬取豆瓣影评”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python爬虫怎么爬取豆瓣影评”吧!一、学习开始前需安装模块pip install reques...
    99+
    2023-06-02
  • requests项目实战--抓取猫眼电影排行
    requests项目实战--抓取猫眼电影排行目标 url : https://maoyan.com/board/4offset=0提取出猫眼电影TOP100的电影名称,主演,上映时间,评分,图片等信息,提取的结果以文本的形式保存起...
    99+
    2023-01-30
    猫眼 实战 项目
  • Python爬虫实现抓取电影网站信息并入库
    目录一.环境搭建1.下载安装包2.修改环境变量3.安装依赖模块二.代码开发三.运行测试1.新建电影信息表2.代码运行四.问题排查和修复1.空白字符报错2.请求报错一.环境搭建 1.下...
    99+
    2024-04-02
  • 爬虫实例(二)—— 爬取高清4K图片
    大家好,我是 Enovo飞鱼,今天继续分享一个爬虫案例,爬取高清4K图片,加油💪。     目录 前言 增加异常处理 增加代码灵活性 基本环境配置 爬取目标网站 分析网站页面 具体代码实现 图片下载示例 感谢支持...
    99+
    2023-09-08
    爬虫 python 开发语言
  • 六个步骤学会使用Python爬虫爬取数据(爬虫爬取微博实战)
    用python的爬虫爬取数据真的很简单,只要掌握这六步就好,也不复杂。以前还以为爬虫很难,结果一上手,从初学到把东西爬下来,一个小时都不到就解决了。 Python爬虫六部曲 第一步:安装request...
    99+
    2023-09-10
    python 爬虫 python入门 python爬虫 python爬虫爬取网页数据
  • 【Python】爬虫练习-爬取豆瓣网电影评论用户的观影习惯数据
    目录 前言 一、配置环境 1.1、 安装Python 1.2、 安装Requests库和BeautifulSoup库 1.3.、安装Matplotlib 二、登录豆瓣网(重点) 2.1、获取代理 2.2、测试代理ip是否可用 2.3、设置...
    99+
    2023-10-25
    windows python 开发语言 爬虫
  • Python爬虫实现热门电影信息采集
    目录一、前言二、前期准备1、使用的软件2、需要用的模块3、模块安装问题4、如何配置pycharm里面的python解释器?5、pycharm如何安装插件?三、思路1、...
    99+
    2024-04-02
  • python爬虫实例(urllib&Be
    python 2.7.6urllib:发送报文并得到responseBeautifulSoup:解析报文的body(html)#encoding=UTF-8 from bs4 import BeautifulSoup from urllib...
    99+
    2023-01-31
    爬虫 实例 python
  • Python爬虫实例分析
    今天小编给大家分享一下Python爬虫实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。环境搭建既然用python,那么...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作