十一了,沒出去玩,由於老婆要加班,我陪着。
晚上的時候她說要一些點評的評分數據,我合計了一下scrapy request一下應該很好作,就答應下來了,感受沒什麼難度嘛。
可是呢沒那麼簡單。須要人驗證的問題就不說了,我以爲這個我也解決不了,比較吸引個人是他的評分展示方式。
大衆點評這塊展現用的是圖片,css offset方式 css
selector那套行不通
這裏我使用的 tesseract 圖片文字識別
下面是大概流程python
這裏是使用Selenium進行頁面訪問,而後截屏
代碼片斷git
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))
截屏頁面web
代碼片斷以下,這裏是hardcode,慚愧chrome
cropped_img = im.crop((239, 500, 239 + 780, 500 + 63)) cropped_img.save('crop{}.png'.format(url_id))
圖片預處理流程以下less
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個scrapy
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評論服務:費用設施環境條.元'
還湊合哦優化
下面是一些腳本集合url
都是js和python腳本,比較簡單哈~3d
爬蟲代碼就不放了哈~寫的太醜~目前也沒時間作代碼優化。 因爲python註釋和Markdown的代碼tag重複了,註釋都去掉了,相信你們能看懂哈~