Python爬取猫眼电影
1.打开一个猫眼电影的URL,例如本月的较火的电影《毒液:致命守护者》http://maoyan.com/films/42964![](https://img-blog.csdnimg.cn/20181117141218514.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VuZGVybWFuX3hpYW9oZWk=,size_16,color_FFFFFF,t_70)
直接F12,查看审核元素,发现上面的数据都是方框无法正确显示![](https://img-blog.csdnimg.cn/20181117141354327.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VuZGVybWFuX3hpYW9oZWk=,size_16,color_FFFFFF,t_70)
选择Network,刷新之后,选择第一个42964,查看右侧Preview![](https://img-blog.csdnimg.cn/20181117141617640.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0VuZGVybWFuX3hpYW9oZWk=,size_16,color_FFFFFF,t_70)
也是无法显示,这就是反爬虫策略,主要爬取网上也有很多教程可供参考,我就贴几个
他们都写得非常好,很有参考价值
https://www.cnblogs.com/h2zZhou/p/7248261.html
https://blog.csdn.net/qq_31032181/article/details/79153578
https://mp.weixin.qq.com/s/wuwWnzJ85BKRV1mArwi57w
可以直接参考他们写得文章,然后爬取吧!
后文主要我写一下我遇到的难点,或者坑?
2.
利用这个网站,打开woff文件。 http://fontstore.baidu.com/static/editor/index.html
我们需要一个参考的base.woff
请求猫眼电影的woff文件,自己构建一个映射list,上下对应关系,对应顺序看你爬下来的woff文件
按照我的理解是通过
maoyan_font = TTFont('maoyan.woff')#爬取时的文件,为了找对应关系
maoyanGlyph = maoyan_font['glyf'][maoyan_unicode_list[i]]
#和
base_font = TTFont('base.woff')#你构建的woff
baseGlyph = base_font['glyf'][base_unicode_list[j]]
#通过这两者返回的
<fontTools.ttLib.tables._g_l_y_f.Glyph object at 0x...>
判断是否相等,相等就是你再次获取woff文件时之间的对应关系
之后网页上的那串乱码就是通过这个对应关系,找出相应的数字
找出这样的对应关系
https://mp.weixin.qq.com/s/wuwWnzJ85BKRV1mArwi57w
有段代码是
if unit:
bom = ['分', score[0].get_text().replace('.', '').replace('万', ''), unit[0].get_text()]
for i in range(len(mw)):
moviewish = mw[i].get_text().encode('utf-8')
moviewish = str(moviewish, encoding='utf-8')
# 通过比对获取反爬文字信息
for j in range(len(utf8last)):
moviewish = moviewish.replace(utf8last[j], maoyan_num_list[j])
if i == 0:
data["score"] = moviewish + bom[i]
elif i == 1:
if '万' in moviewish:
data["people"] = int(float(moviewish.replace('万', '')) * 10000)
else:
data["people"] = int(float(moviewish))
else:
if '万' == bom[i]:
data["box_office"] = int(float(moviewish) * 10000)
else:
data["box_office"] = int(float(moviewish) * 100000000)
else:
在moviewish那里,不知道为什么我运行失败。。。。晕
可能是我技术太差,编码还是不太懂,那段代码看的我晕,我走了一个取巧的方法
原来的运行应该是:
moviewish = mw[i].get_text().encode('utf-8')
print(moviewish,len(moviewish))
moviewish = str(moviewish, encoding='utf-8')
print(moviewish,len(moviewish))
结果是:
加了一行:
moviewish = mw[i].get_text().encode('utf-8')
print(moviewish,len(moviewish))
moviewish = str(moviewish, encoding='utf-8')
print(moviewish,len(moviewish))
moviewish = '%r' % moviewish
print(moviewish,len(moviewish))
字符串长度改变了,这样就可以使用replace替换为数字,因为之前搞定了映射关系
这不过又出现了一个问题
字符串套字符串,我去那怎么办,好吧这只能字符串切片了
moviewish = moviewish[1:-1]
最后的结果:
完美!