文章目录
一、项目概述
1.项目背景
一天,一个朋友给我发来一条链接https://ssr.163.com/cardmaker/#/,让我帮他看看怎么能获取到网页中所有的图片链接。我打开链接一看,页面的标题是阴阳师:百闻牌,下面有选择栏,再下边就是各种奇奇怪怪的看不懂的图片,我就问他这是什么呀?他说是一个游戏阴阳师里边的卡牌。怪不得我没听过,因为我不玩游戏,一个准程序猿不玩游戏一定有很多人不相信 ,但是确实如此,我从未玩过游戏 。
但是这并不影响我来分析网页得到图片,网页如下:

但是你右键查看网页源代码会发现源代码中无任何图片链接的信息,除了一堆HTML整体布局代码和极端JS,什么都没有,显然,图片是动态加载生成的,用常规的requests库是请求不到链接的,这个时候最简单也最直接的办法就是使用selenium模拟自动化来动态操作并抓取图片链接,很快就得到了所有图片链接。
代码如下:
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://ssr.163.com/cardmaker/#/')
time.sleep(3)
while True:
try:
driver.find_element_by_class_name('load-more')
ActionChains(driver).key_down(Keys.END).perform()
time.sleep(1)
except:
break
# 通过xpath定位所有图片
imgs = driver.find_elements_by_xpath('/html/body/div[3]/div[4]/div/div[3]/ul/li/img')
print('共计有%d张卡牌' % len(imgs))
for img in imgs:
print('已获取到图片链接:', img.get_attribute('src'))
driver.quit()
测试效果如下:
阴阳师卡牌下载文字识别simple_test
但是一个项目不应该也不可能止于此,可以做一些更多的事,我可以使用请求到的链接来下载图片,再将其中的文字识别出来。虽然不知道文字具体是什么意思,是角色?还是技能?或者大招? 不管那么多了,先识别出来再说吧。
2.环境配置
这个小项目不需要太多的配置,只需要安装两个Python库:
- selenium
使用pip install selenium命令安装,同时需要下载webdriver驱动,可以点击https://download.youkuaiyun.com/download/CUFEECR/12193208下载Google浏览器最新版对应版本,或点击http://chromedriver.storage.googleapis.com/index.html下载与Google对应版本,并(解压)放入Python对应安装路径下的Scripts目录下。 - baidu-aip
直接使用命令pip install baidu-aip安装即可。
除此之外,还需要在百度云https://login.bce.baidu.com/?redirect=http%3A%2F%2Fcloud.baidu.com%2Fcampaign%2FAnnualceremony-2020%2Findex.html创建自己的文字识别应用,示例如下:

最后可以在应用列表中看到:

即可获得AppID、API Key和Secret Key,后边会用到。
二、项目实施
1.项目分析
该项目的重点和难点有3个,分别是滚动加载所有图片、调用百度文字识别SDK定位角色、描述和技能的位置和实现多线程,下面一一进行讲解:
selenium模拟滚动加载所有图片
通常,网页在展示较多的内容时,一般不是直接在一个页面全部展示的,而是通过不同的方式分成不同的部分,常见的有3种:
(1)分页
即将内容分到多页中,每页展示固定数量的内容,各页之间的网页结构类似,这类的网站如淘宝,如下:
阴阳师卡牌下载文字识别taobao_page
这类网页要实现获取到所有数据据,可以通过selenium模拟点击页码或者调整URL中与页数相关的参数实现。
通过selenium模拟点击的示例代码如下:
next_page = driver.find_element_by_class_name('//*[@id="mainsrp-pager"]/div/div/div/ul/li[8]/a/span[1]')
next_page.click()
通过URL中的参数实现示例如下:
url = 'https://s.taobao.com/search?q=Python&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.1000386.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset=0&ntoffset=6&p4ppushleft=1%2C48&s={}'.format(44 * (i - 1)) # i为页数
(2)手动下滑并点击加载更多
这种方式是手动向下滚动加载,加载了一i的那个数量后需要点击加载更多或者类似的按钮,点击之后在同一网页继续向下加载,到了一定数量需要再次点击以加载更多…,如简书就是这种浏览方式:

这类网页要实现爬取所有数据或者尽可能多的数据需要模拟点击按钮以实现动态加载,所以需要使用selenium,示例如下:
while True:
try:
driver.find_element_by_xpath('load-more')

本文介绍如何使用selenium模拟滚动加载并抓取网页上的所有图片链接,再利用百度OCR进行文字识别,分类并保存。项目涉及自动化网页抓取、图片下载和多线程处理。
最低0.47元/天 解锁文章
3000





