头歌:Scrapy爬虫之网站图片爬取

该文章已生成可运行项目,

头歌:Scrapy爬虫之网站图片爬取

第1关:爬取网站实训图片的链接

  1. 编程要求
    • 通过审查元素,观察图片链接的代码规律。
    • 点击代码文件旁边的三角符号,选择文件 eduSpider.py
    • Begin-End 区间补充代码,使函数 parse 能够爬取图片链接,并保存到本地文件 images.txt 中。
  2. 测试说明
    • 平台会对编写的代码进行测试(本次测试无输入)。
    • 预期输出:爬取成功。
  3. 代码示例
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
import scrapy


class EduspiderSpider(scrapy.Spider):
   name = 'eduSpider'
   allowed_domains = ['127.0.0.1']
   start_urls = ['http://127.0.0.1:8080/imgs/']

   def parse(self, response):
       #********** Begin **********#
        with open('images.txt','w') as f:
           img = response.xpath("//div[@class='box']/div/a/img/@src")
           f.write("{}\n".format(img))
       #********** End **********#

第2关:爬取网站实训图片并下载

  1. 编程要求
    • 通过审查元素,观察图片链接的代码规律。
    • 点击代码文件旁边的三角符号,分别选择 items.pypipelines.py 和主爬虫 imgspier.py 三个文件,补充 Begin-End 区间的代码,最终能成功将网站的图片下载到 images 文件夹,并且将图片命名为对应的数字。
  2. 测试说明
    • 代码完成后点击测评,当评测出现 Django 启动失败时,重新评测即可。
    • 爬虫运行完成后,会在根目录下生成 images 文件夹,在本平台进入命令行,找到相应目录:cd /images,通过命令 ls,可以查看 images 文件夹的内容。
    • 预期输出:爬取成功。
  3. 代码示例
    • step2/ImgProject/ImgProject/items.py
#items.py
import scrapy

class ImgprojectItem(scrapy.Item):
   #********** Begin **********#
   img_urls=scrapy.Field() #保存图片链接   
   images=scrapy.Field()  #保存图片名字      
   #********** End **********#
- `step2/ImgProject/ImgProject/pipelines.py`
#pipelines.py
import os,requests
from ImgProject import settings

class ImgprojectPipeline(object):
   def process_item(self, item, spider):
       #********** Begin **********#
       dir_path='{}'.format(settings.IMAGES_STORE)  #文件夹路径:从配置文件settings中导入定义好的路径
       if not os.path.exists(dir_path):
           os.makedirs(dir_path)
       name=item['images']
       img_url=item['img_urls']
       img_path=dir_path+'/'+name+'.jpg'  #图片的最终存储路径
       img=requests.get(img_url,headers=settings.DEFAULT_REQUEST_HEADERS)  #对图片的url发出请求,准备下载
       with open(img_path,'wb') as f:  #使用wb方式保存图片
           f.write(img.content)
       #********** End **********#
- `step2/ImgProject/ImgProject/spiders/imgspier.py`
#imgspider.py
#-*- coding: utf-8 -*-
import scrapy
from ImgProject.items import ImgprojectItem

class ImgspierSpider(scrapy.Spider):
   name = 'imgspier'
   allowed_domains = ['127.0.0.1']
   start_urls = ['http://127.0.0.1:8080/imgs/']

   def parse(self, response):
       #********** Begin **********#
       img_srcs = response.xpath('//div/a/img/@src').extract()
       for img_src in img_srcs:  #for循环遍历列表
           name=img_src.split('/')[-1].split('.')[0]    #提取图片名字
           item=ImgprojectItem()  #实例化类
           item['img_urls']="http://127.0.0.1:8080"+img_src  #把图片链接拼贴完整放到img_urls中
           #127.0.0.1后加:8080
           item['images']=name  #把图片名字放到images中
           yield item  #把得到的item返回到pipelines.py中
       #********** End **********#
本文章已经生成可运行项目
### 如何爬取网站上的图片链接 #### 使用Scrapy框架进行图片链接抓取 为了有效地从目标网站上获取图片链接,可以采用PythonScrapy框架。此方法不仅高效而且易于扩展。 在`settings.py`中配置下载器中间件和其他必要的选项以支持媒体管道处理图像下载[^2]: ```python ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1} IMAGES_STORE = './downloaded_images' DOWNLOAD_DELAY = 0.5 # 设置访问间隔时间防止过快请求造成服务器压力 ROBOTSTXT_OBEY = True # 尊重robots协议 ``` 接着,在`items.py`里定义用于存储图片信息的数据结构,这里主要注两个字段:一个是用来保存待下载的图片链接列表(`image_urls`);另一个是用来记录已成功下载后的本地文件路径列表(`images`): ```python import scrapy class ImgprojectItem(scrapy.Item): image_urls = scrapy.Field() images = scrapy.Field() ``` 最后一步是在主爬虫脚本`imgspider.py`内编写具体的逻辑来解析HTML文档并提取所需的图片资源地址。这通常涉及到发送HTTP GET请求给定的目标网址,并利用XPath或CSS选择器定位到包含图片标签的地方,进而读取出其`src`属性作为实际的网络位置[^3]: ```python from scrapy import Spider, Request from ..items import ImgprojectItem from urllib.parse import urljoin class ImageSpider(Spider): name = "image_spider" allowed_domains = ["example.com"] start_urls = ['http://www.example.com'] def parse(self, response): item = ImgprojectItem() relative_image_paths = response.css('.box img::attr(src)').getall() # 获取所有匹配的选择器下的src值 absolute_image_urls = [] for path in relative_image_paths: full_url = urljoin(response.url, path.strip()) absolute_image_urls.append(full_url) item['image_urls'] = absolute_image_urls yield item ``` 上述代码片段展示了如何构建一个基本的工作流,它能够自动遍历指定站点内的特定区域(即具有`.box`类名的容器),从中挑选出所有的`<img>`标记并将它们对应的源文件URL收集起来供后续操作使用。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值