使用Selenium和Python进行网页搜刮!
机器学习助长了当今的技术奇迹,例如无人驾驶汽车,太空飞行,图像和语音识别。但是,一位数据科学专业人员将需要大量数据来构建针对此类业务问题的健壮且可靠的机器学习模型。
网络刮硒
数据挖掘或收集数据是数据科学生命周期中非常原始的一步。根据业务需求,可能必须从SAP服务器,日志,数据库,API,在线存储库或Web等来源收集数据。
诸如Selenium之类的用于Web抓取的工具可以在相对较短的时间内抓取大量数据,例如文本和图像。
目录: -
什么是网页抓取
为什么要进行网页爬虫
Web爬网如何有用
什么是硒
设置和工具
使用Selenium Python实现图像Web报废
无头Chrome浏览器
放在一起
尾注
什么是网页抓取?:-
Web爬网(也称为“爬网”或“蜘蛛”)是一种通常从网站上的在线资源自动收集数据的技术。Web爬网是在相对较短的时间内获取大量数据的简便方法,但它给托管源的服务器增加了压力。
这也是许多网站不允许在其网站上抓取所有内容的主要原因之一。但是,只要不破坏在线资源的主要功能,就可以接受。
为什么要进行网页爬虫?–
人们可以利用网络上的大量数据来满足业务需求。因此,需要一种工具或技术来从Web收集此信息。这就是Web爬网概念发挥作用的地方。
Web爬网如何有用?–
网络抓取可以帮助我们提取有关客户,产品,人员,股票市场等的大量数据。
人们可以利用从电子商务门户网站,求职门户网站,社交媒体渠道等网站收集的数据来了解客户的购买模式,员工的流失行为和客户的情绪,然后再继续进行下去。
Python中用于Web的最流行的库或框架-报废是BeautifulSoup,Scrappy和Selenium。
在本文中,我们将讨论在Python中使用Selenium进行Web爬网。最重要的是,我们将看到如何从网络上收集图像,您可以使用这些图像来为深度学习项目构建训练数据。
什么是硒:–
Selenium是基于Web的开源自动化工具。硒主要用于工业测试,但也可以用于卷材刮削。我们将使用Chrome浏览器,但您可以在任何浏览器上试用,几乎是一样的。
图片来源
现在让我们看看如何使用硒进行Web爬取。
设置和工具:-
安装:
使用pip安装Selenium
点安装硒
使用conda安装Selenium
conda install -c conda-forge硒
下载Chrome驱动程序:
要下载网络驱动程序,您可以选择以下任意一种方法-
您可以从以下链接直接下载chrome驱动程序-https
: //chromedriver.chromium.org/downloads
或者,您可以使用下面的代码行直接下载驱动程序= webdriver.Chrome(ChromeDriverManager()。install())
您可以在此处找到有关硒的完整文档。文档非常不言自明,因此请务必阅读文档以利用Python中的硒元素。
以下方法将帮助我们在网页中查找元素(这些方法将返回列表):
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
现在,让我们编写一个Python代码从网络上抓取图像。
使用Selenium Python实现图像Web报废:–
步骤1: –导入库
导入操作系统
进口硒
从硒导入webdriver
导入时间
从PIL导入图片
进口io
汇入要求
从webdriver_manager.chrome导入ChromeDriverManager
从selenium.common.exceptions导入ElementClickInterceptedException
步骤2: –安装驱动程序
#Install Driver
driver = webdriver.Chrome(ChromeDriverManager()。install())
步骤3:– 指定搜索网址
#Specify Search URL
search_url =“ https://www.google.com/search?q= {q}&tbm = isch&tbs = sur%3Afc&hl = zh-CN&ved = 0CAIQpwVqFwoTCKCa1c6s4-oCFQAAAAAdAAAAABAC&biw = 1251&bih = 568 “
driver.get(search_url.format(q ='Car'))
我使用了这个特定的网址,因此您在使用许可或带有版权的图像时不会遇到麻烦。否则,您也可以将https://google.com用作搜索URL。
然后,在搜索URL中搜索Car。将链接粘贴到driver.get(“ Your Link Here”)函数中并运行单元格。这将为该链接打开一个新的浏览器窗口。
步骤4:– 滚动到页面末尾
#滚动到页面末尾
driver.execute_script(“ window.scrollTo(0,document.body.scrollHeight);”)time.sleep
(5)#sleep_between_interactions
这行代码将帮助我们到达页面的结尾。然后我们给睡眠时间5秒钟,这样我们就不会出现问题,我们试图从页面中读取尚未加载的元素。
步骤5:– 找到要从页面上抓取的图像
#找到要从当前页面抓取的图像
imgResults = driver.find_elements_by_xpath(“ // img [包含(@ class,'Q4LuWd')]”)
totalResults = len(imgResults)
现在,我们将获取特定页面上存在的所有图像链接。我们将创建一个“列表”来存储这些链接。因此,要执行此操作,请转到浏览器窗口,右键单击页面,然后选择“检查元素”或使用Ctrl + Shift + I启用开发工具。
现在,确定所有属性,例如class,id等。这在所有这些图像中都是通用的。
在我们的例子中,在所有这些图像中,类=“'Q4LuWd”是通用的。
步骤6:–提取每个图像的相应链接
尽我们所能,页面上显示的图像仍然是缩略图,而不是原始图像。因此,要下载每个图像,我们需要单击每个缩略图并提取与该图像相对应的相关信息。
#单击每个图像以提取其相应的链接以进行下载
img_urls = set()
对于我在 范围(0,LEN(imgResults)):
img = img结果尝试:
img.click()
time.sleep(2)
actual_images = driver.find_elements_by_css_selector('img.n3VNCb')
用于actual_image在actual_images:
如果actual_image.get_attribute( 'SRC')和'https'时在actual_image.get_attribute( 'SRC'):
img_urls.add(actual_image.get_attribute('src'))
除了ElementClickInterceptedException或ElementNotInteractableException作为err:
打印(错误)
因此,在上面的代码片段中,我们正在执行以下任务:
遍历每个缩略图,然后单击它。
使我们的浏览器进入休眠状态2秒钟(:P)。
查找与该图像相对应的唯一HTML标签以在页面上找到它
对于特定的图像,我们仍然可以获得不止一个结果。但是,我们对下载该图像的链接都感兴趣。
因此,我们遍历该图像的每个结果并提取其“ src”属性,然后查看“ src”中是否存在“ https”。通常,网络链接以“ https”开头。
步骤7:–下载并保存每个图像到目标目录
os.chdir('C:/ Qurantine / Blog / WebScrapping / Dataset1')
baseDir = os.getcwd()
对于我,URL在枚举(img_urls):
file_name = f“ {i:150} .jpg”
尝试:
image_content = requests.get(url).content
除外例外为E:
print(f“错误-无法下载{url} - {e} ”)
尝试:
image_file = io.BytesIO(image_content)
图片= Image.open(图片文件).convert('RGB')
file_path = os.path.join(baseDir,file_name)
使用open(file_path,'wb')as f:
image.save(f,“ JPEG”,质量= 85)
print(f“ SAVED- {url} -AT:{file_path} ”),
但例外为e:
print(f“错误-无法保存{url} - {e} ”)
现在终于为您的项目提取了图像 ??
注意:–一旦编写了正确的代码,那么浏览器就不再重要,您可以在没有浏览器的情况下收集数据,这被称为无头浏览器窗口,因此将以下代码替换为上一个。
无头Chrome浏览器
#Headless Chrome浏览器
从硒进口的webdriver
opts = webdriver.ChromeOptions()
opts.headless = True
驱动程序= webdriver.Chrome(ChromeDriverManager()。install())
在这种情况下,浏览器将不会在后台运行,这对于在生产环境中部署解决方案非常有帮助。
让我们将所有这些代码放入一个函数中,以使其更具可组织性,并实现相同的思想,为每个类别(例如汽车,马匹)下载100张图像。
这次我们将使用无头铬的想法编写代码。
放在一起:
步骤1 –导入所有必需的库
进口OS
进口硒
的硒进口webdriver的
进口时间
从PIL进口图片
进口的IO
进口要求
从webdriver_manager.chrome进口ChromeDriverManager
os.chdir('C:/ Qurantine / Blog / WebScrapping')
第2步–安装Chrome驱动程序
#安装驱动程序
opts = webdriver.ChromeOptions()
opts.headless =真实
driver = webdriver.Chrome(ChromeDriverManager()。install(),options = opts)
在此步骤中,我们将安装Chrome驱动程序,并使用无头浏览器进行网络抓取。
步骤3 –指定搜寻网址
search_url =“ https://www.google.com/search?q= {q}&tbm = isch&tbs = sur%3Afc&hl = zh-CN&ved = 0CAIQpwVqFwoTCKCa1c6s4-oCFQAAAAAdAAAAABAC&biw = 1251&bih = 568 ”
driver.get(search_url.format(q ='Car'))
我使用了这个特定的网址来抓取无版权的图像。
步骤4 –编写一个函数以将光标移到页面的末尾
def scroll_to_end(驱动程序):
driver.execute_script(“ window.scrollTo(0,document.body.scrollHeight);”)time.sleep
(5)#sleep_between_interactions
该代码段将向下滚动页面
第五步 编写函数以获取每个图像的URL
#没有许可证问题
def getImageUrls(name,totalImgs,driver):
search_url =“ https://www.google.com/search?q= {q}&tbm = isch&tbs = sur%3Afc&hl = zh-CN&ved = 0CAIQpwVqFwoTCKCa1c6s4-oCFQAAAAAdAAAAABAC&biw = 1251&bih = 568 ”
driver.get(search_url.format(q = name))
img_urls = set()
img_count = 0
results_start = 0
while(img_count
scroll_to_end(驱动程序)
thumbnail_results = driver.find_elements_by_xpath(“ // img [包含(@ class,'Q4LuWd')]”)
totalResults = len(thumbnail_results)
打印(F “值:{}使用totalResults搜索结果中提取从链接{results_start} :{使用totalResults} ”)
为IMG在thumbnail_results [results_start:使用totalResults]:
img.click()
time.sleep(2)
actual_images = driver.find_elements_by_css_selector('img.n3VNCb')
用于actual_image在actual_images:
如果actual_image.get_attribute( 'SRC')和'https'时在actual_image.get_attribute( 'SRC'):
img_urls.add(actual_image.get_attribute('src'))
img_count = len(img_urls)
如果img_count> = totalImgs:
print(f“ Found:{img_count}图片链接”)
打破
其他:
print(“ Found:”,img_count,“寻找更多图像链接...”)
load_more_button = driver.find_element_by_css_selector(“。mye4qd”)
driver.execute_script(“ document.querySelector('。mye4qd')。click();”)
results_start = len(缩略图结果)
返回img_urls
此函数将返回每个类别(例如汽车,马匹等)的URL列表。
步骤6:编写一个功能来下载每个图像
def downloadImages(文件夹路径,文件名,URL):
尝试:
image_content = requests.get(url).content
除外例外为E:
print(f“错误-无法下载{url} - {e} ”)
尝试:
image_file = io.BytesIO(image_content)
图片= Image.open(图片文件).convert('RGB')
file_path = os.path.join(文件夹路径,文件名)
使用open(file_path,'wb')as f:
image.save(f,“ JPEG”,质量= 85)
print(f“ SAVED- {url} -AT:{file_path} ”),
但例外为e:
print(f“错误-无法保存{url} - {e} ”)
此代码段将从每个URL下载图像。
步骤7:–编写函数以将每个图像保存在目标目录中
高清saveInDestFolder(searchNames,DESTDIR,totalImgs,驱动程序):
为名称的列表(searchNames):
path = os.path.join(destDir,name)
如果不是os.path.isdir(path):
os.mkdir(路径)
打印('当前路径',路径)
totalLinks = getImageUrls(名称,totalImgs,驱动程序)
打印('totalLinks',totalLinks)
如果totalLinks为None:
打印('找不到图像:',名称)
继续
else:
对于i,在enumerate(totalLinks)中链接:
file_name = f“ {i:150} .jpg”
downloadImages(路径,文件名,链接)
searchNames = ['汽车','马']
destDir = f'./ Dataset2 /'
totalImgs = 5
saveInDestFolder(searchNames,destDir,totalImgs,驱动程序)
此代码段会将每个图像保存在目标目录中。
题库