猫眼电影反爬攻防
文集 移动端网页端爬虫
按照上文操作一直很顺利,直到文章最后
图1.
编码与实际数字不是按照文中所述的那样顺序对应的,所以即使拿到网页的woff文件也无法得到正确的映射关系。相信这是最近刚更新以应对爬虫们的。
解决办法
- 更改woff文件后缀为.ttf, 双击打开,便能看到下图。 我的mac,经测试window和mac英文版都不能直接打开
图2
图中‘3816207549’的顺序与图一中编码的顺序对应。这样就找到了编码与数字的映射关系。
准确的说图2中的顺序应该是云xml文件中cmap(或者htmx)节点的顺序对应,因为有的woff文件的数字是可重复的总数大于10的。如抖音 下图的顺序与xml中map节点的code属性顺序一致
<cmap_format_4 platformID="0" platEncID="3" language="0">
<map code="0x78" name="x"/><!-- LATIN SMALL LETTER X -->
<map code="0xe602" name="num_"/><!-- ???? -->
<map code="0xe603" name="num_1"/><!-- ???? -->
<map code="0xe604" name="num_2"/><!-- ???? -->
<map code="0xe605" name="num_3"/><!-- ???? -->
<map code="0xe606" name="num_4"/><!-- ???? -->
<map code="0xe607" name="num_5"/><!-- ???? -->
<map code="0xe608" name="num_6"/><!-- ???? -->
<map code="0xe609" name="num_7"/><!-- ???? -->
<map code="0xe60a" name="num_8"/><!-- ???? -->
<map code="0xe60b" name="num_9"/><!-- ???? -->
<map code="0xe60c" name="num_4"/><!-- ???? -->
<map code="0xe60d" name="num_1"/><!-- ???? -->
<map code="0xe60e" name="num_"/><!-- ???? -->
<map code="0xe60f" name="num_5"/><!-- ???? -->
<map code="0xe610" name="num_3"/><!-- ???? -->
<map code="0xe611" name="num_2"/><!-- ???? -->
<map code="0xe612" name="num_6"/><!-- ???? -->
<map code="0xe613" name="num_8"/><!-- ???? -->
<map code="0xe614" name="num_9"/><!-- ???? -->
<map code="0xe615" name="num_7"/><!-- ???? -->
<map code="0xe616" name="num_1"/><!-- ???? -->
<map code="0xe617" name="num_3"/><!-- ???? -->
<map code="0xe618" name="num_"/><!-- ???? -->
<map code="0xe619" name="num_4"/><!-- ???? -->
<map code="0xe61a" name="num_2"/><!-- ???? -->
<map code="0xe61b" name="num_5"/><!-- ???? -->
<map code="0xe61c" name="num_8"/><!-- ???? -->
<map code="0xe61d" name="num_9"/><!-- ???? -->
<map code="0xe61e" name="num_7"/><!-- ???? -->
<map code="0xe61f" name="num_6"/><!-- ???? -->
</cmap_format_4>
-
补充
有些网站猫眼的font文件是不固定的,每个一段时间请求可能不一样。
以上方法需要人工来识别顺序,所以对这样的网站就行不通了。
解决方法
分析:那些网站工程师们,为了应对爬虫可以制作n多的font文件,但是不变的是最终只有0-9十个字符(即使可能有些肉眼看起来一样实际编码不一样的字符会使这个范围超过10,但我想是有限的)。
验证:
-
准备若干个font文件,将是转换成xml文件,如此生成若干个对应的xml文件
# -*- coding: utf-8 -*- from fontTools.ttLib import TTFont font = TTFont('./iconfont_9eb9a50.woff') font.saveXML('iconfont_9eb9a50.xml')
-
观察xml文件
<TTGlyph name="glyph00000"/><!-- contains no outline data --> <TTGlyph name="num_" xMin="0" yMin="0" xMax="609" yMax="755"> <contour> <pt x="542" y="754" on="1"/> <pt x="608" y="754" on="1"/> <pt x="608" y="20" on="1"/> <pt x="524" y="20" on="1"/> <pt x="524" y="651" on="1"/> <pt x="454" y="581" on="0"/> <pt x="351" y="550" on="1"/> <pt x="351" y="635" on="1"/> <pt x="405" y="650" on="0"/> <pt x="454" y="679" on="1"/> <pt x="503" y="710" on="0"/> </contour> <instructions/> </TTGlyph> <TTGlyph name="num_1" xMin="0" yMin="0" xMax="770" yMax="769"> <contour> <pt x="512" y="768" on="1"/> <pt x="643" y="769" on="0"/> <pt x="710" y="652" on="1"/> <pt x="769" y="554" on="0"/> <pt x="769" y="220" on="0"/> <pt x="710" y="122" on="1"/> <pt x="643" y="6" on="0"/> <pt x="380" y="6" on="0"/> <pt x="314" y="122" on="1"/> <pt x="255" y="220" on="0"/> <pt x="255" y="554" on="0"/> <pt x="314" y="652" on="1"/> <pt x="380" y="769" on="0"/> </contour> <contour> <pt x="512" y="696" on="1"/> <pt x="413" y="697" on="0"/> <pt x="370" y="591" on="1"/> <pt x="339" y="516" on="0"/> <pt x="339" y="259" on="0"/> <pt x="370" y="183" on="1"/> <pt x="413" y="78" on="0"/> <pt x="611" y="78" on="0"/> <pt x="654" y="183" on="1"/> <pt x="685" y="259" on="0"/> <pt x="685" y="516" on="0"/> <pt x="654" y="591" on="1"/> <pt x="611" y="697" on="0"/> </contour> <instructions/> </TTGlyph> <TTGlyph name="num_2" xMin="0" yMin="0" xMax="770" yMax="769"> <contour> <pt x="519" y="768" on="1"/> <pt x="625" y="769" on="0"/> <pt x="753" y="661" on="0"/> <pt x="754" y="569" on="1"/> <pt x="754" y="445" on="0"/> <pt x="633" y="404" on="1"/> <pt x="698" y="385" on="0"/> <pt x="732" y="342" on="1"/> <pt x="769" y="298" on="0"/> <pt x="769" y="234" on="1"/> <pt x="769" y="133" on="0"/> <pt x="628" y="5" on="0"/> <pt x="514" y="5" on="1"/> <pt x="409" y="6" on="0"/> <pt x="343" y="59" on="1"/> <pt x="265" y="124" on="0"/> <pt x="256" y="247" on="1"/> <pt x="341" y="247" on="1"/> <pt x="345" y="160" on="0"/> <pt x="399" y="115" on="1"/> <pt x="445" y="78" on="0"/> <pt x="514" y="77" on="1"/> <pt x="593" y="78" on="0"/> <pt x="641" y="123" on="1"/> <pt x="684" y="166" on="0"/> <pt x="685" y="297" on="0"/> <pt x="599" y="370" on="0"/> <pt x="522" y="369" on="1"/> <pt x="463" y="369" on="1"/> <pt x="463" y="435" on="1"/> <pt x="519" y="435" on="1"/> <pt x="593" y="436" on="0"/> <pt x="670" y="502" on="0"/> <pt x="670" y="625" on="0"/> <pt x="632" y="659" on="1"/> <pt x="592" y="696" on="0"/> <pt x="520" y="695" on="1"/> <pt x="446" y="696" on="0"/> <pt x="362" y="616" on="0"/> <pt x="355" y="542" on="1"/> <pt x="271" y="542" on="1"/> <pt x="281" y="649" on="0"/> <pt x="350" y="709" on="1"/> <pt x="414" y="769" on="0"/> </contour> <instructions/> </TTGlyph> <TTGlyph name="num_3" xMin="0" yMin="0" xMax="757" yMax="769"> <contour> <pt x="522" y="768" on="1"/> <pt x="624" y="768" on="0"/> <pt x="755" y="651" on="0"/> <pt x="755" y="459" on="0"/> <pt x="684" y="382" on="1"/> <pt x="645" y="341" on="0"/> <pt x="532" y="264" on="1"/> <pt x="391" y="169" on="0"/> <pt x="371" y="95" on="1"/> <pt x="757" y="95" on="1"/> <pt x="757" y="20" on="1"/> <pt x="267" y="20" on="1"/> <pt x="267" y="120" on="0"/> <pt x="340" y="202" on="1"/> <pt x="383" y="252" on="0"/> <pt x="500" y="332" on="1"/> <pt x="586" y="394" on="0"/> <pt x="615" y="424" on="1"/> <pt x="671" y="484" on="0"/> <pt x="671" y="556" on="1"/> <pt x="671" y="623" on="0"/> <pt x="591" y="696" on="0"/> <pt x="519" y="696" on="1"/> <pt x="443" y="697" on="0"/> <pt x="403" y="645" on="1"/> <pt x="360" y="595" on="0"/> <pt x="358" y="498" on="1"/> <pt x="273" y="498" on="1"/> <pt x="274" y="622" on="0"/> <pt x="411" y="768" on="0"/> </contour> <instructions/> </TTGlyph> <TTGlyph name="num_4" xMin="0" yMin="0" xMax="797" yMax="755"> <contour> <pt x="598" y="754" on="1"/> <pt x="678" y="754" on="1"/> <pt x="678" y="255" on="1"/> <pt x="797" y="255" on="1"/> <pt x="797" y="186" on="1"/> <pt x="678" y="186" on="1"/> <pt x="678" y="20" on="1"/> <pt x="597" y="20" on="1"/> <pt x="597" y="186" on="1"/> <pt x="228" y="186" on="1"/> <pt x="228" y="267" on="1"/> </contour> <contour> <pt x="594" y="644" on="1"/> <pt x="299" y="255" on="1"/> <pt x="597" y="255" on="1"/> <pt x="597" y="644" on="1"/> </contour> <instructions/> </TTGlyph> <TTGlyph name="num_5" xMin="0" yMin="0" xMax="769" yMax="755"> <contour> <pt x="311" y="754" on="1"/> <pt x="738" y="754" on="1"/> <pt x="738" y="679" on="1"/> <pt x="380" y="679" on="1"/> <pt x="356" y="433" on="1"/> <pt x="360" y="433" on="1"/> <pt x="391" y="470" on="0"/> <pt x="439" y="489" on="1"/> <pt x="482" y="507" on="0"/> <pt x="533" y="506" on="1"/> <pt x="637" y="506" on="0"/> <pt x="768" y="373" on="0"/> <pt x="768" y="254" on="1"/> <pt x="768" y="143" on="0"/> <pt x="689" y="72" on="1"/> <pt x="614" y="6" on="0"/> <pt x="506" y="5" on="1"/> <pt x="408" y="5" on="0"/> <pt x="340" y="58" on="1"/> <pt x="263" y="117" on="0"/> <pt x="256" y="217" on="1"/> <pt x="339" y="217" on="1"/> <pt x="345" y="148" on="0"/> <pt x="395" y="110" on="1"/> <pt x="438" y="78" on="0"/> <pt x="507" y="77" on="1"/> <pt x="584" y="77" on="0"/> <pt x="684" y="176" on="0"/> <pt x="685" y="253" on="1"/> <pt x="684" y="341" on="0"/> <pt x="592" y="438" on="0"/> <pt x="512" y="437" on="1"/> <pt x="460" y="438" on="0"/> <pt x="418" y="415" on="1"/> <pt x="375" y="393" on="0"/> <pt x="353" y="349" on="1"/> <pt x="272" y="349" on="1"/> </contour> <instructions/> </TTGlyph> <TTGlyph name="num_6" xMin="0" yMin="0" xMax="770" yMax="769"> <contour> <pt x="522" y="768" on="1"/> <pt x="726" y="769" on="0"/> <pt x="757" y="572" on="1"/> <pt x="673" y="572" on="1"/> <pt x="649" y="698" on="0"/> <pt x="521" y="697" on="1"/> <pt x="435" y="698" on="0"/> <pt x="386" y="612" on="1"/> <pt x="337" y="532" on="0"/> <pt x="337" y="406" on="1"/> <pt x="337" y="400" on="0"/> <pt x="338" y="380" on="1"/> <pt x="342" y="380" on="1"/> <pt x="370" y="437" on="0"/> <pt x="422" y="468" on="1"/> <pt x="471" y="500" on="0"/> <pt x="536" y="500" on="1"/> <pt x="641" y="500" on="0"/> <pt x="769" y="365" on="0"/> <pt x="769" y="149" on="0"/> <pt x="629" y="6" on="0"/> <pt x="521" y="5" on="1"/> <pt x="387" y="6" on="0"/> <pt x="320" y="105" on="1"/> <pt x="255" y="199" on="0"/> <pt x="256" y="367" on="1"/> <pt x="256" y="543" on="0"/> <pt x="325" y="653" on="1"/> <pt x="397" y="769" on="0"/> </contour> <contour> <pt x="519" y="430" on="1"/> <pt x="447" y="430" on="0"/> <pt x="351" y="332" on="0"/> <pt x="351" y="178" on="0"/> <pt x="397" y="129" on="1"/> <pt x="443" y="76" on="0"/> <pt x="519" y="76" on="1"/> <pt x="593" y="77" on="0"/> <pt x="640" y="127" on="1"/> <pt x="686" y="179" on="0"/> <pt x="686" y="336" on="0"/> <pt x="641" y="382" on="1"/> <pt x="595" y="431" on="0"/> </contour> <instructions/> </TTGlyph> <TTGlyph name="num_7" xMin="0" yMin="0" xMax="770" yMax="769"> <contour> <pt x="504" y="768" on="1"/> <pt x="636" y="768" on="0"/> <pt x="704" y="670" on="1"/> <pt x="769" y="577" on="0"/> <pt x="769" y="406" on="1"/> <pt x="769" y="231" on="0"/> <pt x="700" y="121" on="1"/> <pt x="626" y="6" on="0"/> <pt x="503" y="5" on="1"/> <pt x="298" y="6" on="0"/> <pt x="268" y="202" on="1"/> <pt x="352" y="202" on="1"/> <pt x="374" y="77" on="0"/> <pt x="504" y="76" on="1"/> <pt x="589" y="77" on="0"/> <pt x="640" y="162" on="1"/> <pt x="688" y="244" on="0"/> <pt x="688" y="367" on="1"/> <pt x="687" y="394" on="1"/> <pt x="683" y="394" on="1"/> <pt x="655" y="339" on="0"/> <pt x="604" y="306" on="1"/> <pt x="554" y="274" on="0"/> <pt x="489" y="274" on="1"/> <pt x="383" y="274" on="0"/> <pt x="319" y="344" on="1"/> <pt x="256" y="410" on="0"/> <pt x="256" y="516" on="1"/> <pt x="255" y="626" on="0"/> <pt x="396" y="769" on="0"/> </contour> <contour> <pt x="506" y="697" on="1"/> <pt x="431" y="698" on="0"/> <pt x="339" y="596" on="0"/> <pt x="339" y="516" on="1"/> <pt x="339" y="439" on="0"/> <pt x="429" y="344" on="0"/> <pt x="506" y="344" on="1"/> <pt x="577" y="344" on="0"/> <pt x="626" y="393" on="1"/> <pt x="673" y="443" on="0"/> <pt x="673" y="596" on="0"/> <pt x="628" y="645" on="1"/> <pt x="582" y="697" on="0"/> </contour> <instructions/> </TTGlyph> <TTGlyph name="num_8" xMin="0" yMin="0" xMax="770" yMax="755"> <contour> <pt x="287" y="754" on="1"/> <pt x="769" y="754" on="1"/> <pt x="769" y="685" on="1"/> <pt x="499" y="20" on="1"/> <pt x="410" y="20" on="1"/> <pt x="683" y="677" on="1"/> <pt x="287" y="677" on="1"/> </contour> <instructions/> </TTGlyph> <TTGlyph name="num_9" xMin="0" yMin="0" xMax="778" yMax="769"> <contour> <pt x="512" y="768" on="1"/> <pt x="627" y="769" on="0"/> <pt x="692" y="709" on="1"/> <pt x="751" y="655" on="0"/> <pt x="752" y="574" on="1"/> <pt x="752" y="515" on="0"/> <pt x="724" y="475" on="1"/> <pt x="693" y="432" on="0"/> <pt x="636" y="412" on="1"/> <pt x="636" y="410" on="1"/> <pt x="694" y="395" on="0"/> <pt x="734" y="346" on="1"/> <pt x="777" y="293" on="0"/> <pt x="777" y="222" on="1"/> <pt x="777" y="125" on="0"/> <pt x="709" y="66" on="1"/> <pt x="638" y="6" on="0"/> <pt x="384" y="6" on="0"/> <pt x="247" y="125" on="0"/> <pt x="247" y="222" on="1"/> <pt x="247" y="293" on="0"/> <pt x="290" y="346" on="1"/> <pt x="329" y="395" on="0"/> <pt x="388" y="410" on="1"/> <pt x="388" y="412" on="1"/> <pt x="329" y="432" on="0"/> <pt x="300" y="475" on="1"/> <pt x="272" y="515" on="0"/> <pt x="272" y="574" on="1"/> <pt x="272" y="655" on="0"/> <pt x="332" y="709" on="1"/> <pt x="397" y="769" on="0"/> </contour> <contour> <pt x="512" y="700" on="1"/> <pt x="433" y="700" on="0"/> <pt x="390" y="659" on="1"/> <pt x="351" y="625" on="0"/> <pt x="352" y="515" on="0"/> <pt x="386" y="480" on="1"/> <pt x="426" y="440" on="0"/> <pt x="597" y="440" on="0"/> <pt x="638" y="480" on="1"/> <pt x="672" y="515" on="0"/> <pt x="672" y="625" on="0"/> <pt x="634" y="659" on="1"/> <pt x="589" y="700" on="0"/> </contour> <contour> <pt x="512" y="374" on="1"/> <pt x="423" y="374" on="0"/> <pt x="375" y="329" on="1"/> <pt x="329" y="289" on="0"/> <pt x="329" y="157" on="0"/> <pt x="422" y="75" on="0"/> <pt x="601" y="74" on="0"/> <pt x="650" y="117" on="1"/> <pt x="694" y="158" on="0"/> <pt x="694" y="289" on="0"/> <pt x="650" y="329" on="1"/> <pt x="600" y="374" on="0"/> </contour> <instructions/> </TTGlyph> <TTGlyph name="x" xMin="0" yMin="-31" xMax="956" yMax="792"> <contour> <pt x="281" y="543" on="1"/> <pt x="254" y="542" on="0"/> <pt x="228" y="542" on="1"/> <pt x="145" y="542" on="1"/> <pt x="127" y="542" on="0"/> <pt x="90" y="530" on="0"/> <pt x="62" y="505" on="0"/> <pt x="44" y="466" on="0"/> <pt x="44" y="440" on="1"/> <pt x="44" y="364" on="1"/> <pt x="956" y="364" on="1"/> <pt x="955" y="453" on="1"/> <pt x="955" y="466" on="0"/> <pt x="945" y="498" on="0"/> <pt x="921" y="525" on="0"/> <pt x="882" y="543" on="0"/> <pt x="852" y="543" on="1"/> <pt x="719" y="543" on="1"/> <pt x="719" y="446" on="1"/> <pt x="281" y="446" on="1"/> </contour> <contour> <pt x="955" y="310" on="1"/> <pt x="955" y="258" on="1"/> <pt x="956" y="148" on="1"/> <pt x="956" y="119" on="0"/> <pt x="935" y="82" on="0"/> <pt x="904" y="59" on="0"/> <pt x="869" y="50" on="0"/> <pt x="841" y="49" on="0"/> <pt x="826" y="50" on="1"/> <pt x="764" y="50" on="1"/> <pt x="719" y="178" on="1"/> <pt x="280" y="178" on="1"/> <pt x="236" y="50" on="1"/> <pt x="173" y="50" on="1"/> <pt x="153" y="50" on="0"/> <pt x="103" y="51" on="0"/> <pt x="71" y="70" on="0"/> <pt x="52" y="97" on="0"/> <pt x="44" y="129" on="0"/> <pt x="44" y="143" on="1"/> <pt x="44" y="310" on="1"/> </contour> <contour> <pt x="163" y="247" on="1"/> <pt x="151" y="247" on="0"/> <pt x="133" y="230" on="0"/> <pt x="133" y="204" on="0"/> <pt x="151" y="187" on="0"/> <pt x="176" y="187" on="0"/> <pt x="194" y="204" on="0"/> <pt x="194" y="230" on="0"/> <pt x="176" y="247" on="0"/> </contour> <contour> <pt x="316" y="123" on="1"/> <pt x="308" y="97" on="0"/> <pt x="302" y="75" on="1"/> <pt x="297" y="56" on="0"/> <pt x="292" y="38" on="1"/> <pt x="284" y="13" on="1"/> <pt x="282" y="6" on="0"/> <pt x="280" y="-10" on="0"/> <pt x="284" y="-23" on="0"/> <pt x="299" y="-31" on="0"/> <pt x="313" y="-31" on="1"/> <pt x="678" y="-31" on="1"/> <pt x="701" y="-31" on="0"/> <pt x="723" y="-7" on="0"/> <pt x="714" y="19" on="1"/> <pt x="709" y="32" on="0"/> <pt x="700" y="67" on="0"/> <pt x="690" y="103" on="0"/> <pt x="684" y="123" on="1"/> </contour> <contour> <pt x="336" y="498" on="1"/> <pt x="336" y="726" on="1"/> <pt x="336" y="737" on="0"/> <pt x="341" y="761" on="0"/> <pt x="356" y="780" on="0"/> <pt x="382" y="792" on="0"/> <pt x="403" y="792" on="1"/> <pt x="591" y="792" on="1"/> <pt x="622" y="792" on="0"/> <pt x="663" y="763" on="0"/> <pt x="663" y="725" on="1"/> <pt x="663" y="498" on="1"/> </contour> <instructions/> </TTGlyph>
可以猜测,这些xy的坐标就是决定机器画出什么样的图形(数字)的。那么只要画出的图形是绝对相同的那么这个坐标也应该相同才对。
经过对比多个xml文件发现:这些xy的矩阵是完全一样的,不一样的只有顺序(经验证这个顺序和以上提到的mac打开ttf文件看到的顺序是一致的)。又发现不同xml文件中,相同矩阵出现在父节点中的序号(位置),对应到mac打开ttf文件看到的序列的相应位置的数字是相同的。
到此可以判断:每个矩阵,即每个<TTGlyph>节点代表一个数字,并且相同数字的矩阵在不同font文件中也相同。
-
结论
制作<TTGlyph>矩阵节点到实际数字的映射
通过html拿到编码值(&#EB83),替换成uniEB83(这个值就是<TTGlyph>矩阵节点的name属性),得到<TTGlyph>子节点的值,查找映射表得到数字