下面我将详细讲解“Python爬虫之教你利用Scrapy爬取图片”的完整攻略。
标题
简介
在介绍爬虫之前,我们先介绍下Scrapy。Scrapy是一个Python编写的爬虫框架,它提供了一套完整的爬虫工具链,可用于从网站上提取结构化数据(例如,爬取图片、爬取文字信息等)。
安装Scrapy
要使用Scrapy,需要先将其安装,可以使用以下命令进行安装:
pip install scrapy
创建Scrapy工程
Scrapy的工程由多个组件组成,包括爬虫、中间件、下载器和管道等。我们可以使用Scrapy提供的命令行工具创建工程,命令如下:
scrapy startproject project_name
其中,project_name代表你的工程名称。
运行上述命令后,会生成一个名为project_name的文件夹,它包含了所有的Scrapy工程文件。
创建爬虫
创建爬虫是Scrapy工程开发的重点。我们需要在工程下新建一个爬虫文件,在该文件中编写爬虫的逻辑。
Scrapy提供了一个命令行工具用于创建爬虫:
scrapy genspider spider_name domain
其中,spider_name代表你的爬虫名称,domain代表你需要爬取的域名。
打开爬虫文件后,可以编写爬虫的逻辑。例如,如果我们需要爬取豆瓣电影首页的海报图像:
import scrapy
class DoubanSpider(scrapy.Spider):
name = "douban"
allowed_domains = ["douban.com"]
start_urls = ["https://www.douban.com/"]
def parse(self, response):
# 获取所有的海报图片
for img in response.css("img.poster"):
yield {
"image_url": img.xpath("@src").get()
}
在上述代码中,我们定义了一个名为douban的爬虫。使用allowed_domains属性指定我们需要爬取的域名。使用start_urls属性指定我们需要爬取的起始页面。在parse函数中,我们使用了CSS选择器来获取所有的海报图片,并把图片URL保存在字典中。
定义下载器中间件
定义下载器中间件可以实现在下载图片时添加代理、超时处理等功能。
import requests
class MyDownloaderMiddleware:
def process_request(self, request, spider):
proxies = {
"http": "http://127.0.0.1:1087",
"https": "http://127.0.0.1:1087"
}
response = requests.get(request.url, headers=request.headers, proxies=proxies, timeout=5)
content_type = response.headers.get("content-type", "").lower()
if "image" not in content_type:
raise Exception("download failed")
return scrapy.http.HtmlResponse(url=request.url, body=response.content, request=request, encoding="utf-8")
在上述代码中,我们定义了一个名为MyDownloaderMiddleware的下载器中间件。在process_request函数中,我们使用requests库发送请求,并设置了代理和超时时间。在请求返回后,我们判断响应的content-type是否为图片类型,如果是则返回一个包含图片内容的HtmlResponse对象。
我们需要将该中间件添加到Scrapy的下载器中间件中:
DOWNLOADER_MIDDLEWARES = {
"myproject.downloadermiddlewares.MyDownloaderMiddleware": 543,
}
定义图片管道
定义管道是Scrapy工程开发的另一个重点。在管道中可以定义图片保存的路径、命名规则、文件格式等。
class MyImagesPipeline(ImagesPipeline):
def file_path(self, request, response=None, info=None):
return "images/" + request.url.split("/")[-1]
def item_completed(self, results, item, info):
if not results[0][0]:
raise Exception("download failed")
return item
在上述代码中,我们定义了一个名为MyImagesPipeline的管道。在file_path函数中,我们定义了图片保存的路径和命名规则。在item_completed函数中,我们判断图片是否下载成功,如果下载成功则返回原始下载项,否则抛出异常。
我们需要将该管道添加到Scrapy工程的ITEM_PIPELINES中:
ITEM_PIPELINES = {
"myproject.pipelines.MyImagesPipeline": 1,
}
运行爬虫
在编写完爬虫、下载器中间件和管道后,我们可以使用以下命令运行爬虫:
scrapy crawl spider_name
其中,spider_name代表你的爬虫名称。Scrapy会自动进行抓取、解析、下载和保存图片等操作,并将结果输出到命令行。
示例1:爬取妹子图网站的图片
我们可以使用Scrapy爬虫爬取妹子图网站的图片。
首先,我们需要创建一个Scrapy工程:
scrapy startproject meizitu
然后,我们需要创建一个名为meizitu的爬虫:
scrapy genspider meizi www.mzitu.com
接下来,在爬虫文件中添加以下代码:
class MeiziSpider(scrapy.Spider):
name = "meizi"
allowed_domains = ["www.mzitu.com"]
start_urls = ["https://www.mzitu.com/xinggan/"]
def parse(self, response):
for href in response.css("ul#pins>li>a::attr(href)").getall():
yield scrapy.Request(url=href, callback=self.parse_detail)
def parse_detail(self, response):
title = response.css("h2.main-title::text").get()
for img in response.css("div.main-image img"):
yield {
"image_url": img.xpath("@src").get(),
"title": title
}
上述代码中,我们定义了一个名为MeiziSpider的爬虫。在parse函数中,我们使用CSS选择器获取妹子图各个页面上的图片链接,并在获取到链接后调用parse_detail函数进行处理。在parse_detail函数中,我们获取该页面的图片标题和图片链接,然后返回一个字典。
接下来,我们需要定义下载器中间件和管道:
ITEM_PIPELINES = {
"meizitu.pipelines.MyImagesPipeline": 1,
}
DOWNLOADER_MIDDLEWARES = {
"meizitu.downloadermiddlewares.MyDownloaderMiddleware": 543,
}
然后,我们可以运行爬虫进行图片抓取:
scrapy crawl meizi
图片将会保存在meizi文件夹下。
示例2:爬取Google图片搜索结果
我们可以使用Scrapy爬虫爬取Google图片搜索结果的图片。
首先,我们需要创建一个Scrapy工程:
scrapy startproject googleimage
然后,我们需要创建一个名为googleimage的爬虫:
scrapy genspider google www.google.com
接下来,在爬虫文件中添加以下代码:
class GoogleSpider(scrapy.Spider):
name = "google"
allowed_domains = ["www.google.com"]
start_urls = ["https://www.google.com/search?q=cats&tbm=isch"]
def start_requests(self):
headers = {
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
}
for url in self.start_urls:
yield scrapy.Request(url=url, headers=headers)
def parse(self, response):
data = response.css("[data-ved]")
for img in data.css("img"):
src = img.xpath("@src")
if src:
yield {
"image_url": src.get()
}
上述代码中,我们定义了一个名为GoogleSpider的爬虫。在start_requests函数中,我们设置user-agent请求头。在parse函数中,我们使用CSS选择器获取Google图片搜索结果的图片链接,并将链接保存在字典中返回。
接下来,我们需要定义下载器中间件和管道:
ITEM_PIPELINES = {
"googleimage.pipelines.MyImagesPipeline": 1,
}
DOWNLOADER_MIDDLEWARES = {
"googleimage.downloadermiddlewares.MyDownloaderMiddleware": 543,
}
然后,我们可以运行爬虫进行图片抓取:
scrapy crawl google
图片将会保存在googleimage文件夹下。
这就是利用Scrapy爬取图片的攻略了,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫之教你利用Scrapy爬取图片 - Python技术站