猫眼电影专业版可以实时获取电影的票房数据,但我们要爬它却不怎么容易。首先来看看,难在哪里?
在源码中我们可以看到它网页使用的是自己的字体。我们无法通过源码来爬取到想要的数据。
百度了一圈回来发现有人说自己去破解它网页的字体,但更多的人推荐使用截图识别的方式。
这里说一下思路
使用自动化测试工具selenium配合phantomJS将网页截图,然后进行区域截图获得票房数字,利用pytesser进行数字识别。
先上selenium的代码
#webdriver从官网中下载放在python目录下的script文件夹内则不需要设置webdriver路径
from selenium import webdriver
import os
import time
# from PIL import Image
from selenium.webdriver.common.keys import Keys
#chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\Chromedriver.exe"
#os.environ["webdriver.chrome.driver"] = chromedriver
#driver = webdriver.Chrome(chromedriver)
driver = webdriver.PhantomJS()
driver.get('http://piaofang.maoyan.com/')
driver.save_screenshot('screenshot.png')#这里截图完成
#开始对图片进行区域截图处理
for i in range(1,19):
pic = Image.open('screenshot.png')
element = driver.find_element_by_xpath('//ul[@class="canTouch"][%d]/li[2]'%i)#对票房数据进行定位
left = element.location['x']
top = element.location['y']
right = element.location['x'] + element.size['width']
bottom = element.location['y'] + element.size['height']
pic = pic.crop((left,top,right,bottom))#开始区域截图
pic.resize((140,53),Image.BILINEAR)#将图片放大,不然识别不出来
pic.save('s%d.png'%i)
time.sleep(1)
driver.quit()
我刚开始进行图片处理的时候,截下来的图是这样的
然后我用pytesser尝试对图片识别
如果成功的话是print
1031.35
结果却是
K
卡在了这里,不知道怎么解决,提高识别率。由于工作比较繁忙,我把这事搁置了两个礼拜。这两天想起来,就开始查资料。找到了两个思路,一个是使用libSVM,另一个是scikit-learn。但两个我都不懂。而且我对pytesser还不死心,就继续折腾。我尝试了把图片搞成黑白的去识别也不行。最后我是把图片放大了,才成功识别的。终于明白,原来图片太小是识别不了的。
成功了!!哟嘎达!!
稍微解释一下代码吧
import pytesser
from PIL import Image,ImageEnhance
image = Image.open('s1.png')#打开图片
image = image.convert('L')#把图片变灰
ImageEnhance.Sharpness(image)#把图片锐化?
image =image.resize((140,53),Image.BILINEAR)#把图片放大
enhancer = ImageEnhance.Contrast(image) #图片变黑白!!!这一步可以极大的提高识别率!!!!
image2 = enhancer.enhance(4)
image2.save('test2.png')
vcode = pytesser.image_to_string(image2)#识别图片数字
print (vcode)
为了方便大家读代码整理思路,下面是完整的代码
'''
webdriver从官网中下载放在python目录下的script文件夹内则不需要设置webdriver路径
'''
from selenium import webdriver
import os
import time
import pytesser
from PIL import Image,ImageEnhance
from selenium.webdriver.common.keys import Keys
#chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\Chromedriver.exe"
#os.environ["webdriver.chrome.driver"] = chromedriver
#driver = webdriver.Chrome(chromedriver)
driver = webdriver.PhantomJS()
driver.get('http://piaofang.maoyan.com/')
driver.save_screenshot('screenshot.png')
for i in range(1,19):
pic = Image.open('screenshot.png')
element = driver.find_element_by_xpath('//ul[@class="canTouch"][%d]/li[2]'%i)
left = element.location['x']
top = element.location['y']
right = element.location['x'] + element.size['width']
bottom = element.location['y'] + element.size['height']
pic = pic.crop((left,top,right,bottom))
pic =pic.resize((140,53),Image.BILINEAR)
pic = pic.convert('L')
ImageEnhance.Sharpness(pic)
enhancer = ImageEnhance.Contrast(pic)
pic2 = enhancer.enhance(4)
vcode = pytesser.image_to_string(pic2)
print (vcode)
pic2.save('%s.png'%vcode.strip())
time.sleep(1)
driver.quit()
然后下一刻,我们来见证奇迹吧
对比下票房
ps:pytesser更多的是用于验证码识别,验证码图片中存在很多干扰识别的噪点。因此需要对图片源进行更多处理。这里的图片没有噪点,其实是很容易识别的。。算是很简单的了
完整爬虫部分》》》》》》》》》》》》》》待续
之前不是有个人嚷嚷着说如果我能把猫眼电影实时票房爬出来就给我引荐工作的么?
跑哪去了?