在这个日新月异的科技时代,数据是驱动各种商业决策的重要因素。近些年,电商网站如淘宝、京东、亚马逊等的兴起,使得大量的商品信息、客户购买记录、商品评价等数据得以积累。这些数据为电商带来了无与伦比的竞争优势,但也对数据处理提出了更高的要求,因此,电商数据采集就显得尤为重要。
今天,我将与大家分享一份我编写的电商数据采集代码,该代码采用Python编程语言,通过自动化脚本,可以模拟人为操作,实现淘宝商品信息的自动抓取和保存。
前置接口
在您使用这段代码之前,需要安装一些Python库。这些库包括pyautogui(用于模拟鼠标键盘操作)、pyperclip(用于剪贴板操作)、cnocr(一个轻量级、高性能的中英文OCR库)和json(处理json数据)。
import pyautogui as pg import pyperclip as pc from cnocr import CnOcr import time import json
一、 自动化开启淘宝网站
首先,代码会弹出一个输入框让用户输入要打开的网址,默认为淘宝的网址。然后,通过识别屏幕上的Google Chrome图标,自动双击打开浏览器,输入网址并搜索。
# 自动化开启手机界面 try: users_input = pg.prompt(title="请输入您要打开的网址:", text="网址", default="https://www.taobao.com/") # print(users_input) #r"C:\Users\du'xiao'nan\Pictures\2024\Google.png"为我的Google Chrome图标图片放置地址,想正常使用,应选择自己的路径 google_cente=pg.locateCenterOnScreen(r"C:\Users\du'xiao'nan\Pictures\2024\Google.png",confidence=0.8) pg.click(x=google_cente.x,y=google_cente.y,clicks=2) time.sleep(5) pg.write(users_input,interval=0.01) pg.press("enter") time.sleep(5) # 自动化输入 搜索内容 pc.copy("手机") pg.hotkey("ctrl","v") pg.press("enter") except: print("程序出错,请重新运行")
注意:因为脚本是通过识别屏幕上的Google Chrome图标,自动双击打开浏览器,所以脚本启动时应把应用快捷方式露出来
二、抓取商品图片并进行OCR识别
接下来,代码通过鼠标模拟点击和滚轮滚动,自动搜素并获取商品信息。然后,代码会自动截取屏幕上的商品信息区域,并通过cnocr库进行OCR识别,提取出商品的文本信息。
如果有多页商品,代码还可以通过模拟滚轮滚动实现翻页,反复进行上述操作,使得能够获取尽可能多的商品信息。
#基础版截一张 try: # 截图 # 下拉界面 time.sleep(1) pg.scroll(-450) img_phon =r"E:\b.webp" pg.screenshot(img_phon,region=(200,272,400,620)) time.sleep(1) img_fp = r"E:\b.webp"
三、数据筛选和保存
最后,截图识别的文字会被转化为列表形式,经过筛选后会被写入到一个data.json文件中。筛选主要是去除识别结果不佳的文字,提高数据的准确性。
这份代码实现了一个简单的电商数据采集模型,它具有良好的扩展性和适应性。对于其他电商网站,只需稍作修改,就可以使用这套源码获取所需的数据。此外,你也可以根据自己的需要,修改和完善这份代码,使其更加适应你的需求。
# 创建CnOcr对象 ocr = CnOcr() # 读取图像 out = ocr.ocr(img_fp) # print(out) #筛选数据,写到data.json文件中 with open("data.json","w",encoding="utf-8") as f: single_text = [i['text'] for i in out if i['score']>0.5] json.dump(single_text,f,ensure_ascii=False) print(single_text) except: print("程序出错,请重新运行")
总的来说,这是一个实用的电商数据采集工具,它体现了Python在数据采集和处理方面的优势。使用Python进行数据采集,不仅可以节省大量的人力和时间,还可以提高数据处理的效率和准确性,相信对于广大的数据工作者来说,这将会是一个很好的帮手。
四、升级版
在基础版中,仅对页面上的一个固定区域进行截图和OCR识别。而在升级版中,程序对8个固定区域进行抓取,获取更多的数据。同时,由于无需遍历整个页面,效率也得到一定保障。
它主要由两个函数构成:
1. ocr_write()函数
该函数首先定义了8个商品截图区域的坐标。然后创建一个CnOcr对象用于对截图进行OCR识别。在循环过程中,它会依次对8个区域进行截图,并保存到特定的文件路径。然后使用OCR进行识别,如果识别的准确度超过50%,则将识别的文字信息添加到结果列表中。最后,将获取的所有文字信息保存到"data.json"文件中,并返回截图区域的坐标信息。
def ocr_write(): # 截图 # 下拉界面 time.sleep(1) pg.scroll(-450) regions= [ [200,272,400,620], [630,272,400,620], [1060,272,400,620], [1490,272,400,620], [200, 890, 400, 620], [630, 890, 400, 620], [1060, 890, 400, 620], [1490, 890, 400, 620], ] # 创建CnOcr对象 ocr = CnOcr() # 读取图像 # 筛选数据,写到data.json文件中 all_test= [] for index,region in enumerate(regions): filepath = r"E:\tupian\b"+str(index)+".webp" screen_fun(region,filepath) out = ocr.ocr(filepath) single_text = [i['text'] for i in out if i['score']>0.5] all_test.append(single_text) with open("data.json","w",encoding="utf-8") as f: json.dump(all_test,f,ensure_ascii=False) print(all_test) return regions
2. screen_fun(region,filepath)函数
该函数用于将指定区域的商品信息截图保存到指定路径。如果截图成功,则返回True,如果截图失败,则打印"截图失败"并返回False。
最后,通过调用ocr_write()函数,执行上述的截图、识别和保存的过程。
def screen_fun(region,filepath): try: pg.screenshot(filepath,region=region) return True except: print("截图失败") return False
这段代码实现了自动化截图并进行文字识别的过程,但需要注意的是,它目前只适用于特定的页面布局和分辨率,如果要应用到其他网页或电脑,可能需要对截图区域的坐标进行相应的调整。
#升级版截8张 #封装两个函数 #函数ocr_write():功能:保存八张图的截屏区域[[],[]] #函数ocr_write_json():功能:保存八张图的截图区域到data.json文件中 def ocr_write(): # 截图 # 下拉界面 time.sleep(1) pg.scroll(-450) regions= [ [200,272,400,620], [630,272,400,620], [1060,272,400,620], [1490,272,400,620], [200, 890, 400, 620], [630, 890, 400, 620], [1060, 890, 400, 620], [1490, 890, 400, 620], ] # 创建CnOcr对象 ocr = CnOcr() # 读取图像 # 筛选数据,写到data.json文件中 all_test= [] for index,region in enumerate(regions): filepath = r"E:\tupian\b"+str(index)+".webp" screen_fun(region,filepath) out = ocr.ocr(filepath) single_text = [i['text'] for i in out if i['score']>0.5] all_test.append(single_text) with open("data.json","w",encoding="utf-8") as f: json.dump(all_test,f,ensure_ascii=False) print(all_test) return regions def screen_fun(region,filepath): try: pg.screenshot(filepath,region=region) return True except: print("截图失败") return False ocr_write()
五、完整版
我们看到在脚本的最后部分,代码通过循环结构自动进行了多次的页面滚动和信息抓取。特别的,每个大循环中都包含了一个小循环,小循环中进行了5次页面滚动和信息抓取。这样做能够最大程度地扩大信息抓取的范围。
最后,在所有信息抓取完成后,通过pg.alert()函数弹出一个提示框,提示用户程序已完成。
# 电商数据采集-淘宝 import pyautogui as pg import pyperclip as pc from cnocr import CnOcr import time import json # 自动化开启手机界面 try: users_input = pg.prompt(title="请输入您要打开的网址:", text="网址", default="https://www.taobao.com/") # print(users_input) google_cente=pg.locateCenterOnScreen(r"C:\Users\du'xiao'nan\Pictures\2024\Google.png",confidence=0.8) pg.click(x=google_cente.x,y=google_cente.y,clicks=2) time.sleep(5) pg.write(users_input,interval=0.01) pg.press("enter") time.sleep(5) # 自动化输入 搜索内容 pc.copy("手机") pg.hotkey("ctrl","v") pg.press("enter") except: print("程序出错,请重新运行") #完整版截所有 #封装两个函数 #函数ocr_write():功能:保存八张图的截屏区域[[],[]] #函数ocr_write_json():功能:保存八张图的截图区域到data.json文件中 #思路与升级版一至 def ocr_write(): # 截图 # 下拉界面 time.sleep(1) pg.scroll(-450) regions= [ [200,272,400,620], [630,272,400,620], [1060,272,400,620], [1490,272,400,620], [200, 890, 400, 620], [630, 890, 400, 620], [1060, 890, 400, 620], [1490, 890, 400, 620], ] # 创建CnOcr对象 ocr = CnOcr() # 读取图像 # 筛选数据,写到data.json文件中 all_test= [] for index,region in enumerate(regions): filepath = r"E:\tupian\b"+str(index)+".webp" screen_fun(region,filepath) out = ocr.ocr(filepath) single_text = [i['text'] for i in out if i['score']>0.5] all_test.append(single_text) with open("data.json","w",encoding="utf-8") as f: json.dump(all_test,f,ensure_ascii=False) print(all_test) return regions def screen_fun(region,filepath): try: pg.screenshot(filepath,region=region) return True except: print("截图失败") return False for i in range(100): time.sleep(1) ocr_write() for i in range(5): pg.scroll(-1000) ocr_write() pg.click(x=1394,y=681,clicks=2) arr1 = pg.alert(title='项目进程',text='程序完成',button='ok')
总的来说,相比于升级版,这个版本的代码实现了更大范围的信息抓取,同时也增加了整个过程的自动化程度。不过,由于代码中包含了大量的循环和滚动操作,因此程序的运行时间可能会较长。