大众点评评分爬取-图文识别ORC
大众点评评分爬取-图文识别ORC
十一了,没出去玩,因为老婆要加班,我陪着。
晚上的时候她说要一些点评的评分数据,我合计了一下scrapy request一下应该很好做,就答应下来了,感觉没什么难度嘛。
但是呢没那么简单。需要人验证的问题就不说了,我觉得这个我也解决不了,比较吸引我的是他的评分展现方式。
大众点评这块展示用的是图片,css offset方式
selector那套行不通
这里我使用的 tesseract 图片文字识别
下面是大概流程
爬取页面
这里是使用Selenium进行页面访问,然后截屏
代码片段
opt = Options() opt.add_argument('--headless') self.driver = webdriver.Chrome(executable_path='/Users/xiangc/bin/chromedriver', options=opt) self.wait = WebDriverWait(self.driver, 10) self.driver.get('http://www.dianping.com/shop/4227604') self.driver.save_screenshot('image{}.png'.format(url_id))
截屏页面
截取需要部分
代码片段如下,这里是hardcode,惭愧
cropped_img = im.crop((239, 500, 239 + 780, 500 + 63)) cropped_img.save('crop{}.png'.format(url_id))
图片预处理
图片预处理流程如下
- 清理噪点,如果一点四周只有一个非白点则为噪点,去掉
- 非空白点着色,色值大于200的点直接给白色
- 提高图片对比度
def get_color(image, x, y): if isinstance(image, type(Image.new('RGB', (0, 0), 'white'))): r, g, b = image.getpixel((x, y))[:3] else: r, g, b = image[x, y] return r, g, b def is_noise(image, x, y): white_count = 0 for i in range(0, x + 2): for j in range(0, y + 2): r, g, b = get_color(image, i, j) if (r, g, b) == (255, 255, 255): white_count += 1 return white_count >= 7 def clear_noise(image, new_pixels): w, h = image.size clear_count = 0 for i in range(w): for j in range(h): r, g, b = get_color(image, i, j) if r != g != b and is_noise(image, i, j): clear_count += 1 print(clear_count) new_pixels[i, j] = (255, 255, 255) else: new_pixels[i, j] = (r, g, b) return clear_count def clear_color(new_pixels, w, h): for i in range(w): for j in range(h): r, g, b = get_color(new_pixels, i, j) if np.average((r, g, b)) > 200: new_pixels[i, j] = (255, 255, 255) else: new_pixels[i, j] = (0, 0, 0) def pre_image(full_path): image = Image.open(full_path) w, h = image.size new_image = Image.new('RGB', (w, h), 'white') new_pixels = new_image.load() clear_count = clear_noise(image, new_pixels) while clear_count > 0: clear_count = clear_noise(new_pixels, new_pixels) print(clear_count) if clear_count == 0: break clear_color(new_pixels, w, h) # 对比度增强 enh_img = ImageEnhance.Contrast(new_image) contrast = 3 image_contrasted = enh_img.enhance(contrast) dir_name = os.path.dirname(full_path) file_name = os.path.basename(full_path) new_file_path = os.path.join(dir_name, 'sharped' + file_name) image_contrasted.save(new_file_path) return new_file_path
图片文字识别
文字识别是用tesseract
注意这里加了白名单提高准确率
chi为我自己训练的识别库,训练集为10个
new_file_path = imgutils.pre_image('crop{}.png'.format(url_id)) result = pytesseract.image_to_string( image=new_file_path, lang='chi', config='--psm 7 --oem 3 -c tessedit_char_whitelist=0123456789评论服务:费用设施环境条.元'
结果
还凑合哦
训练辅助脚本
下面是一些脚本集合
- 生成box文件
- 批量图片处理
- 批量训练生成训练结果文件
- 批量图片格式转换png->tiff
都是js和python脚本,比较简单哈~
爬虫代码就不放了哈~写的太丑~目前也没时间做代码优化。
由于python注释和Markdown的代码tag重复了,注释都去掉了,相信大家能看懂哈~
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java 函数式编程和 lambda 表达式
Java 函数式编程和 lambda 表达式 为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论。函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做。说白了,函数式编程是基于某种语法或调用API去进行编程。例如,我们现在需要从一组数字中,找出最小的那个数字,若使用用命令式编程实现这个需求的话,那么所编写的代码如下: publicstaticvoidmain(String[]args){ int[]nums=newint[]{1,2,3,4,5,6,7,8}; intmin=Integer.MAX_VALUE; for(intnum:nums){ if(num<min){ min=num; } } System.out.println(min); } 而使用函数式编程进行实现的话,所编写的代码如下: publicstaticvoidmain(String[]args){ int[]nums=newint[]{1,2,3,4,5,6,7,8}; intmin=IntStream...
- 下一篇
hdfs auditlog(审计日志)
hdfs审计日志(Auditlog)记录了用户针对hdfs的所有操作,详细信息包括操作成功与否、用户名称、客户机地址、操作命令、操作的目录等。对于用户的每一个操作,namenode都会将这些信息以key-value对的形式组织成固定格式的一条日志,然后记录到audit.log文件中。通过审计日志,我们可以实时查看hdfs的各种操作状况、可以追踪各种误操作、可以做一些指标监控等等。 hdfs的审计日志功能是可插拔的,用户可以通过实现默认接口扩展出满足自己所需的插件来替换hdfs默认提供的审计日志功能,或者与之并用。 启用审计日志 如果仅仅只启用默认的AuditLogger(DefaultAuditLogger),则在log4j.properties添加如下配置(hdfs.audit.logger必须配置为INFO级别)即可,审计日志会与namenode的系统日志独立开来保存,log4j.appender.RFAAUDIT.File可配置保存的位置及文件。 FSNamesystem根据log4j.properties中hdfs.audit.logger是否为INFO,以及是否配置了...
相关文章
文章评论
共有0条评论来说两句吧...