使用Scrapy内置的ImagesPipeline可以非常方便地爬取网页上的图片资源。下面是完整的攻略和示例代码:
1. 在settings.py中设置ImagesPipeline
首先需要在项目的settings.py文件中进行一些配置。具体如下:
ITEM_PIPELINES = {
'scrapy.pipelines.images.ImagesPipeline': 1
}
IMAGES_STORE = '/path/to/your/images/directory'
- ITEM_PIPELINES中添加'scrapy.pipelines.images.ImagesPipeline': 1,表示该请求需要经过ImagesPipeline处理
- IMAGES_STORE设置图片存储的目录路径
2. 在Spider中使用item传递图片链接
在自己的Spider中,需要定义一个item,用于存储图片的链接地址和其他信息:
import scrapy
class MyItem(scrapy.Item):
image_urls = scrapy.Field()
images = scrapy.Field()
image_urls字段存储的是图片的链接地址,images字段会在下载完成后自动生成,存储图片的本地路径。
3. 在Spider中yield item并指定image_urls字段
在Spider中,需要在解析网页的流程中yield item,并在item中指定image_urls字段:
import scrapy
from myproject.items import MyItem
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = [
'http://www.example.com',
'http://www.example.com/page/2',
'http://www.example.com/page/3',
]
def parse(self, response):
item = MyItem()
item['image_urls'] = response.css('img::attr("src")').getall()
yield item
在这个示例中,我们从响应中获取所有图片的src属性,并存入item的image_urls中。
4. 运行spider并查看运行效果
在运行Spider之前,需要确保IMAGES_STORE设置的目录存在,并有写入权限。
接下来就可以运行我们的Spider,Scrapy会自动从指定的链接下载图片资源,保存至IMAGES_STORE设置的目录中。
可以在Spider运行时添加-v INFO参数,查看下载进度。
scrapy crawl myspider -v INFO
示例1:下载豆瓣读书封面图片
下面是下载豆瓣读书封面图片的示例代码:
import scrapy
from myproject.items import MyItem
class DoubanBooksSpider(scrapy.Spider):
name = 'doubanbooks'
start_urls = [
'https://book.douban.com/top250',
]
def parse(self, response):
for book in response.css('tr.item'):
item = MyItem()
item['title'] = book.css('div.pl2 a::text').get()
item['image_urls'] = [book.css('img::attr(src)').get()]
yield item
在这个示例中,我们可以获取豆瓣读书榜单的前250本图书的封面,保存在本地文件。
示例2:下载糗事百科用户头像图片
下面是下载糗事百科用户头像图片的示例代码:
import scrapy
from myproject.items import MyItem
class QSBKSpider(scrapy.Spider):
name = 'qsbk'
start_urls = [
'https://www.qiushibaike.com/',
]
def parse(self, response):
for user in response.css('div.article'):
item = MyItem()
item['username'] = user.css('div.header a::text').get()
item['user_url'] = user.css('div.header a::attr(href)').get()
item['image_urls'] = [user.css('img.avatar::attr(src)').get()]
yield item
在这个示例中,我们可以获取糗事百科上的用户头像,并保存在本地文件。
本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!