python爬取网上图片

本文介绍了一个简单的Python爬虫程序,用于从指定网页抓取图片并保存到本地。程序分为三个主要步骤:获取网页源码、用正则表达式匹配图片URL以及保存图片。
部署运行你感兴趣的模型镜像

       

       在网上看到一个使用python爬虫的小程序,自己学习了一下,下面来看一下这个程序实现的过程:

目的:抓取网页上的图片。

步骤:1、拿到网页的源码

            2、用正则表达式匹配出网页上图片的URL

            3、把图片保存到电脑中

一、获取网页源码的程序为:

import urllib #urllib是python进行网络访问的基础模块

#比如获取贴吧上一网页源码

page = urllib.urlopen("http://tieba.baidu.com/p/3205263090") 

#.urlopen()函数是打开一个URL,返回一个文件对象,然后可以进行类似文件对象的操作

html = page.read()

print html #这时候输出,就能显示出这个网页的源码

二、用正则表达式匹配图片URL

      找出网页中图片的地址进行正则表达式匹配,可以理解为,网页中每个图片的地址都不一样,找出它们的规律,用一个正则表达式匹配它们。

在页面的图片上点击右键,点击“查看元素”,找到这个图片对应的源码。找到所有这些图片源码的规律,写出匹配它们的正则表达式,就这个例子而言,

正则表达式为reg=r'src="([.\S]*\.jpg)" pic_ext="jpeg"

      这里需注意:正则表达式中小括号()是为了提取匹配的字符串。若没有加小括号,则提取出的URL就会包含src=.....pic_ext="jpeg",这不是图片的源码,

最后下载到本地就会出错。

      符号(.)为通配符,\S为非空白字符,*为匹配前一个字符0次或无限次。

imagereg = re.compile(reg)

#re.compile()将正则表达式(以字符串形式书写的)转化为模式对象
imgurls = re.findall(imagereg, html)

#以列表的形式返回所有能匹配到的字符串。也就是说imguris是一个列表,里边包含了所有匹配到的字符串,每条字符串就是每个图片的源码

三、保存图片

urllib.urlretrieve(url,"E:\手机\sd卡\%s.jpg" % “name”)

urllib.urlretrieve()方法是将URL定位到的html文件下载到本地,第一个参数是要下载的url,第二个参数是要保存的地址和文件名

四、 最后看一下整个程序

import urllib
import re


def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

html =  getHtml('http://tieba.baidu.com/p/3205263090') 
reg = r'src="([.\S]*\.jpg)" pic_ext="jpeg"'

imagereg = re.compile(reg)
imgurls = re.findall(imagereg, html)
x = 1
for imgurl in imgurls:
    urllib.urlretrieve(imgurl, 'E:\手机\sd卡\%s.jpg' % x)
    x +=1

运行看一下结果

      最后说一下正则表达式的学习方法:个人认为正则表达式学习起来还是挺困难的,网上介绍正则表达式的内容一看就是一大堆,看着就头疼,所以最好的学习方法还是每次只学习一部分,特别是在项目中学习,查找满足特定任务需要的那部分内容,久而久之,就能熟练运用正则表达式了。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮助用户解决如何使用编程语言或工具爬取网页中的图片的问题。首先,我得回顾用户提供的引用内容,看看有没有相关的信息。用户提到了引用3中的Python代码,使用requests和urllib来下载图片,还有引用4提到的Requests、BeautifulSoup、Scrapy和Selenium这些库。引用5也提到Python爬虫的基础知识。 用户的主要需求是获取爬取图片的方法和工具,可能需要具体的步骤和示例代码。我应该结合这些引用中的信息,给出一个结构清晰的回答。首先,可能需要介绍基本的流程,比如分析网页结构、发送请求、解析内容、下载图片。然后分步骤详细说明,每个步骤使用哪些工具,比如Requests获取页面,BeautifulSoup解析HTML,或者Selenium处理动态内容。 还要注意用户提到的引用3中的代码示例,可以将其整理得更清晰,比如使用Requests获取图片链接,然后下载。同时,引用4提到的工具如Scrapy和Selenium也需要涵盖,以覆盖不同场景,比如静态页面和动态加载的图片。 另外,用户可能关心如何处理不同网站的反爬机制,比如设置请求头、使用代理等,这些在引用4和5中也有提及,需要适当加入。还要注意代码的规范,比如使用try-except处理异常,以及保存图片时的路径管理。 最后,生成相关问题,可能涉及性能优化、反爬策略、动态内容处理等,这些都需要根据引用中的信息来设计。例如,引用2提到Scrapy的教程,可以生成相关问题关于Scrapy的进阶使用。</think>以下是使用Python爬取网页图片的完整技术指南,结合代码示例和工具说明: ### 一、基础爬取流程(静态网页) #### 1. 分析网页结构 打开目标网页按F12进入开发者工具,在Network面板筛选图片请求[^1],定位图片URL的存储位置(一般在`<img>`标签的src属性中) #### 2. 发送HTTP请求 使用Requests库获取网页内容: ```python import requests headers = {'User-Agent': 'Mozilla/5.0'} # 模拟浏览器请求头 response = requests.get(url, headers=headers) html = response.text ``` #### 3. 解析HTML内容 使用BeautifulSoup提取图片链接: ```python from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') img_tags = soup.find_all('img') img_urls = [img['src'] for img in img_tags if 'src' in img.attrs] ``` #### 4. 下载图片文件 改进引用[3]的下载代码: ```python from urllib.parse import urljoin def download_images(url_list, save_dir): for i, url in enumerate(url_list): try: # 处理相对路径 full_url = urljoin(base_url, url) res = requests.get(full_url, stream=True, timeout=10) with open(f"{save_dir}/image_{i}.jpg", 'wb') as f: for chunk in res.iter_content(1024): f.write(chunk) except Exception as e: print(f"下载失败 {url}: {str(e)}") ``` ### 二、动态内容处理(JavaScript渲染) 当遇到动态加载的图片时,使用Selenium模拟浏览器操作: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless") # 无头模式 driver = webdriver.Chrome(options=chrome_options) driver.get(url) # 等待内容加载 driver.implicitly_wait(10) # 获取渲染后的页面源码 dynamic_html = driver.page_source driver.quit() ``` ### 三、高效爬虫框架(Scrapy) 创建Scrapy爬虫项目: ```bash scrapy startproject image_crawler ``` 修改items.py: ```python import scrapy class ImageItem(scrapy.Item): image_urls = scrapy.Field() images = scrapy.Field() ``` 编写爬虫文件: ```python import scrapy from image_crawler.items import ImageItem class ImageSpider(scrapy.Spider): name = 'img_spider' start_urls = ['目标网站URL'] def parse(self, response): item = ImageItem() item['image_urls'] = response.xpath('//img/@src').getall() return item ``` 在settings.py中配置: ```python ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1} IMAGES_STORE = '/path/to/save' ``` ### 四、反爬策略应对 1. IP轮换:使用代理池 ```python proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080' } requests.get(url, proxies=proxies) ``` 2. 请求频率控制 ```python import time import random time.sleep(random.uniform(0.5, 1.5)) # 随机延时 ``` 3. 浏览器指纹模拟(使用selenium-wire): ```python from seleniumwire import webdriver driver = webdriver.Chrome() driver.header_overrides = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'} ``` ### 五、完整案例(爬取壁纸网站) ```python import os import requests from bs4 import BeautifulSoup def crawl_wallpaper(keyword, pages=3): save_path = f'./{keyword}_wallpapers' os.makedirs(save_path, exist_ok=True) for page in range(1, pages+1): url = f'https://wallhaven.cc/search?q={keyword}&page={page}' res = requests.get(url, headers={'Referer': 'https://wallhaven.cc/'}) soup = BeautifulSoup(res.text, 'lxml') previews = soup.select('img[data-src]') for img in previews: img_url = img['data-src'].replace('th.wallhaven.cc', 'w.wallhaven.cc').replace('small', 'full') img_name = img_url.split('/')[-1] try: with open(f"{save_path}/{img_name}", 'wb') as f: f.write(requests.get(img_url).content) print(f"已下载: {img_name}") except: print(f"下载失败: {img_url}") crawl_wallpaper('landscape', pages=2) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值