Python抓取图片的3种方式


抓取图片的3种方式

方案一利用urlretrieve()函数链接到 图片url 直接储存图片

urlretrieve是urllib库中的一个函数 urllib库是python的内置包,不需要下载安装 urllib包含了四个模块分别是: request:基本的http请求模块,用来模拟发送请求。 error:异常处理模块,捕获请求中的异常,然后进行重试或其他的操作以保证程序不会意外终止。 parse:一个根据模块,提供了如拆分、解析、合并等的许多URL处理方法。 robotparser:主要用来识别网站的robots.txt文件,然后判断哪些网站可以爬,哪些不能。

例1获取图片

# img_url为图片链接,
# file_name为文件储存路径及文件名
img_url= 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1569317945346&di=0f7ee951fdbe8a9949a491757dfe2141&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201707%2F24%2F20170724020822_JwihM.jpeg'
file_name = '我的女神周冬雨.jpeg'

#如果没有传入file_name,则urlretrieve会在Temp文件夹中生成一个临时文件。
urlretrieve(img_url, file_name)

例2:获取验证码图

#coding:utf-8
# SY_5_1_GET_IMAGE_URLRETRIEVE.py
from urllib.request import urlretrieve
import requests                                   # 导入Requests库
from PIL import Image                             # 导入PIL库的Image模块
from lxml import etree

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/65.0.3325.181'}
url = 'http://bigdata.hddly.cn/wp-login.php'
rqg = requests.get(url, headers=headers)
cont = rqg.content.decode('utf-8')
html = etree.HTML(cont,parser=etree.HTMLParser(encoding='utf-8'))
code_elment=html.xpath('//*[@id="loginform"]/img') # //*[@id="loginform"]/img
img_url = code_elment[0].attrib['src']
file_name = 'captcha.jpeg'
# #如果没有传入file_name,则urlretrieve会在Temp文件夹中生成一个临时文件。
urlretrieve(img_url, file_name)
img = Image.open(file_name)                        # 创建image对象
img.show()                                        # 显示图片,会在电脑上自动弹出
captcha = input('请输入验证码: ')
print(captcha)
exit()

方案二通过requests直接写入图片

例1获取图片

import requests

# img_url为图片链接,
# file_name为文件储存路径及文件名
img_url= 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1569317945346&di=0f7ee951fdbe8a9949a491757dfe2141&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201707%2F24%2F20170724020822_JwihM.jpeg'
file_name = '我的女神周冬雨.jpeg'

res=requests.get(img_url)
with open(file_name ,'wb') as f:
    f.write(res.content)

例2获取验证码

#coding:utf-8
# SY_5_1_GET_IMAGE_URLRETRIEVE.py
from urllib.request import urlretrieve
import requests                                   # 导入Requests库
from PIL import Image                             # 导入PIL库的Image模块
from lxml import etree

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/65.0.3325.181'}
url = 'http://bigdata.hddly.cn/wp-login.php'
rqg = requests.get(url, headers=headers)
cont = rqg.content.decode('utf-8')
html = etree.HTML(cont,parser=etree.HTMLParser(encoding='utf-8'))
code_elment=html.xpath('//*[@id="loginform"]/img') # //*[@id="loginform"]/img
img_url = code_elment[0].attrib['src']
file_name = 'captcha.jpeg'

res=requests.get(img_url)
with open(file_name ,'wb') as f:
    f.write(res.content)

img = Image.open(file_name)                        # 创建image对象
img.show()                                        # 显示图片,会在电脑上自动弹出
captcha = input('请输入验证码: ')
print(captcha)
exit()

方案三利用selenium截图获取图片

和上面两种方法不同的是,这种方法主要是为了针对反爬(例如由无数小图拼接而成的验证码)而进行的物理手段获取。

例1获取图片

from selenium import webdriver
from PIL import Image
from io import BytesIO

# img_url为图片链接,
# file_name为文件储存路径及文件名,这里注意图片文件必须以 png 格式保存,
# 如果需要以jpeg的格式保存需逐行写入(类似方案二)
img_url= 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1569317945346&di=0f7ee951fdbe8a9949a491757dfe2141&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201707%2F24%2F20170724020822_JwihM.jpeg'
filename = '女神周冬雨.png'

driver = webdriver.Chrome()
driver.get(img_url)
# 网页中图片的定位(也可用其他方式定位)
img = driver.find_element_by_tag_name('img')
# 获取图片位子和宽高
location = img.location
size = img.size
# 返回左上角和右下角的坐标
top,bottom,left,right = location['y'], location['y']+size['height'], location['x'], location['x']+size['width']
# 截取整张网页图片
screenshot = driver.get_screenshot_as_png()
screenshot = Image.open(BytesIO(screenshot))
# 将网页中需要的图片通过坐标裁剪出来
screenshot = screenshot.crop((left, top, right, bottom))
screenshot.save(file_name)
driver.close()

例2获取验证码

#coding:utf-8
# SY_5_1_GET_IMAGE_SELENIUM.py
import time
from io import BytesIO
from PIL import Image                             # 导入PIL库的Image模块
from selenium import webdriver

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/65.0.3325.181'}
url = 'http://bigdata.hddly.cn/wp-login.php'
file_name = 'captcha.png' #file_name为文件储存路径及文件名,这里注意图片文件必须以 png 格式保存,
driver = webdriver.Chrome()
driver.get(url)
# 网页中图片的定位(也可用其他方式定位)
# img = driver.find_element_by_tag_name('img')
img = driver.find_element_by_xpath('//*[@id="loginform"]/img') #/html/body/img
# 获取图片位子和宽高
location = img.location
size = img.size
# 返回左上角和右下角的坐标
top,bottom,left,right = location['y'], location['y']+size['height'], location['x'], location['x']+size['width']
# 截取整张网页图片
driver.fullscreen_window()
screenshot = driver.get_screenshot_as_png()
screenshot = Image.open(BytesIO(screenshot))
# 将网页中需要的图片通过坐标裁剪出来
# screenshot = screenshot.crop((left, top, right, bottom))
# 不裁剪直接保存
screenshot.save(file_name)
driver.close()

img = Image.open(file_name)                        # 创建image对象
img.show()                                        # 显示图片,会在电脑上自动弹出
# captcha = input('请输入验证码: ')
# print(captcha)
time.sleep(5)

exit()