如何抓取各种网页上的图片

1、普通网页图片,如何抓取

要抓取普通网页上的图片,可以使用Python编写代码。以下是一个示例代码片段,可以帮助你了解如何开始编写此类代码:

```python
import requests
from bs4 import BeautifulSoup
import os

# 网页URL
url = 'https://example.com'

# 发送请求
response = requests.get(url)

# 创建BeautifulSoup对象
soup = BeautifulSoup(response.content, 'html.parser')

# 查找所有图像标签
img_tags = soup.find_all('img')

#create folder to save images in your current directory.
if not os.path.exists('images'):
    os.makedirs('images')

# 下载每张图片
for img_tag in img_tags:
    img_url = img_tag['src']
    if not img_url.startswith('http'):
        img_url = url + img_url
    
    #get the image name
    img_name = img_url.split('/')[-1]
    
    #save the image to your directory
    with open(f"images/{img_name}", "wb") as f:
        response = requests.get(img_url)
        f.write(response.content)
        
print('Images saved successfully.')
```

在这个简单的Python脚本中,我们使用requests库向指定的URL发送HTTP GET请求。然后,我们使用BeautifulSoup解析HTML响应,并使用find_all方法查找所有图片标记。之后我们遍历找到的链接,下载每个链接指向的图片,将它保存在 images 文件夹内。

2、网页图片延迟加载,如何抓取

如果网页中的图片是延迟加载,通常需要使用JavaScript来触发加载。因此,使用Python代码抓取这些图片可能会有所不同。可以考虑使用Selenium WebDriver库,这个库可以模拟浏览器行为,包括页面滚动和点击来触发图片加载。

以下是一个示例代码片段,可以帮助您开始编写此类代码:

```python
from selenium import webdriver
import urllib.request
import time

# 创建浏览器驱动,本教程是以Chrome作为浏览器示例
driver = webdriver.Chrome()
driver.get('https://example.com')

# 模拟滚动窗口以触发图像加载
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3) #等待3s以确保图像加载完全
    
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:    #没有发现新图像
        break
    last_height = new_height

# 查找并保存所有图像
img_srcs = [img.get_attribute('src') for img in driver.find_elements_by_tag_name('img')]
for src in img_srcs:
    filename = src.split('/')[-1]
    urllib.request.urlretrieve(src, filename)

print('Images saved successfully.')
driver.quit()
```

这个代码片段假设你已经抓取了需要捕获的延迟加载图片的HTML页面,并创建了一个Selenium Webdriver对象。然后,我们模拟了一个滚动窗口的操作,以此来触发图片的加载。使用 JavaScript 将页面滚动到底部,等待3秒钟,然后再次获取页面的 scrollHeight,如果发现高度发生了变化,则认为有新的图片加载,反复执行之 until 高度不再改变。

一旦所有需要捕获和保存的图像都被识别并可用,就可以通过使用 Python 库 urllib.request 的 urlretrieve() 方法将所有图像保存到本地文件系统中。

3、网页图片地址不存放在src属性中,如何抓取

如果网页图片的地址不在 `src` 属性中,可能在其他属性或者标签上,例如 CSS 样式表或者 JavaScript 脚本里。这种情况下,我们需要进一观察网页代码和文件来找到图片的详细信息。

以下是一些常见的图片地址存储方式及相应的抓取方法:

1) 图片地址存放在 `data-src`、`data-original`、`data-lazy-src` 等自定义属性中, 可以通过Beautiful Soup解析HTML文档,在页面中查找这些属性并获取属性值,进而获取这些图片的地址。

   例如:
   ```python
   import requests
   from bs4 import BeautifulSoup
   import urllib.parse
   
   url = "https://example.com"
   response = requests.get(url)
   html_doc = response.text
   soup = BeautifulSoup(html_doc, 'html.parser')
   
   #查找存在"data-src"属性的img元素,并获取对应属性值
   imgs = soup.find_all('img', {'data-src': True})
   for img in imgs:
       img_url = img['data-src']
       #根据需要组合成完整的图片地址
       full_img_url = urllib.parse.urljoin(url, img_url)
       
       #下载图片
       img_data = requests.get(full_img_url).content
       with open('image_name.jpg', 'wb') as handler:
           handler.write(img_data)
   ```

2) 图片地址存放在CSS样式表背景图中。在此情况下,需要先解析HTML文件,然后通过解析CSS样式表文件,找到相关的样式规则及其对应的图片地址,最后再根据地址下载图片。

   例如:

   ```python
   import requests
   from bs4 import BeautifulSoup
   import re
   
   url = "https://example.com"
   response = requests.get(url)
   html_doc = response.text
   soup = BeautifulSoup(html_doc, 'html.parser')
   
   #解析CSS文件,并查找背景图样式规则
   css_url = "https://example.com/style.css"
   css_response = requests.get(css_url)
   css_doc = css_response.text
   bg_urls = re.findall(r'url\((.*?)\)', css_doc)
   
   for bg_url in bg_urls:
       # 根据需要组合成完整的图片地址
       full_bg_url = urllib.parse.urljoin(url, bg_url.strip("'\""))
     
       # 下载图片
       img_data = requests.get(full_bg_url).content
       with open('image_name.jpg', 'wb') as handler:
           handler.write(img_data)
   ```

3) 图片地址可能在 JavaScript 脚本中动态生成。 一般情况下,我们可以通过分析 JavaScript 脚本代码找到图片地址及对应的数据格式,进而下载图片。

如果图片地址存放在其他地方或者有其它规律,可以类似以上方式进行查找和获取。总的来说,这种情况需要通过仔细观察HTML代码和文件,根据实际的情况进行逐步定位,最终实现下载图片的操作。

4、反爬虫网页图片,如何抓取

反爬虫技术是指网站为了防止爬虫程序访问和采集网页数据而采取的技术手段。其中,一些常见的反爬虫技术包括 IP 封禁、验证码识别、浏览器指纹识别、数据加密和隐藏等等。

针对反爬虫的网站,我们需要特别注意以下几点以提高抓取成功率:

1. 伪装请求头:网站可以通过 User-Agent 字段等信息判断请求是否为爬虫。因此在编写抓取代码时,可以设置一个常见的浏览器 User-Agent 来模拟用户的请求。

2. 使用代理IP:如果同一IP地址请求频繁,则会被网站识别为爬虫,此时可以使用代理IP来避免被封禁。

3. 破解验证码:部分网站使用了验证码来识别是否为人类访问,这种情况下需要使用机器学习等技术进行验证码识别,从而完成抓取。但是需要注意,法律法规或者网站协议中对于验证码的使用可能存在限制,因此在使用验证码识别之前需要先获取网站授权或者认真阅读协议。

下面是一个基于`requests`和`Pillow`库的抓取反爬虫网页的图片的示例代码:

```python
import requests
from PIL import Image
from io import BytesIO
from random import randint
import time

# 伪装请求头
headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}

# 使用代理IP
proxies = {"http": "http://127.0.0.1:1080", "https": "https://127.0.0.1:1080"}

# 网站URL
url = "https://example.com"

session = requests.Session()

# 访问网站
response = session.get(url, headers=headers, proxies=proxies)

# 解析出图片地址和验证码信息等内容
img_url = "https://example.com/image.jpg"
code_info = {'id': 'abcd1234', 'challenge': 'efgh5678'}

# 下载验证码图片,破解验证码
img_response = session.get(img_url, headers=headers, proxies=proxies, verify=False)
img = Image.open(BytesIO(img_response.content))
code = CRACK_THE_CAPTCHA(img) # 使用相关库或算法破解验证码,这里用"CRACK_THE_CAPTCHA"代替

# 构造提交的表单数据,包括验证码信息等
payload = {}
payload['id'] = code_info['id']
payload['code'] = code
payload['challenge'] = code_info['challenge']

# 提交表单
response = session.post(url, data=payload, headers=headers, proxies=proxies, verify=False)
time.sleep(randint(2,4)) # 随机等待一段时间,模拟人的行为

# 获取图片等信息
response = session.get(img_url, headers=headers, proxies=proxies, verify=False)
image_data = response.content
with open('image_name.jpg', 'wb') as handler:
    handler.write(image_data)

# 关闭 session
session.close()
```

上面的代码展示了如何使用代理、伪装请求头和破解验证码等技术应对常见的反爬虫手段,以实现成功抓取反爬虫网页的图片。需要注意的是,针对不同的反爬虫技术,需要采用不同的策略进行应对,因此在编写代码时需要综合考虑并根据实际情况进行相应的优化。

如何觉得直接开发太繁琐可使用一些现成的工具软件,可参考这篇文章:抓取网页图片项目的一些感悟_SF引流的博客-CSDN博客

你可能感兴趣的:(抓取网页图片,抓取网站图片,下载网页图片,下载网站图片,下载图片,抓取图片)