
头歌:Scrapy爬虫之网站图片爬取
第1关:爬取网站实训图片的链接
-
编程要求
- 通过审查元素,观察图片链接的代码规律。
- 点击代码文件旁边的三角符号,选择文件
eduSpider.py。
- 在
Begin-End 区间补充代码,使函数 parse 能够爬取图片链接,并保存到本地文件 images.txt 中。
-
测试说明
- 平台会对编写的代码进行测试(本次测试无输入)。
- 预期输出:爬取成功。
- 代码示例
# -*- 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关:爬取网站实训图片并下载
-
编程要求
- 通过审查元素,观察图片链接的代码规律。
- 点击代码文件旁边的三角符号,分别选择
items.py、pipelines.py 和主爬虫 imgspier.py 三个文件,补充 Begin-End 区间的代码,最终能成功将网站的图片下载到 images 文件夹,并且将图片命名为对应的数字。
-
测试说明
- 代码完成后点击测评,当评测出现 Django 启动失败时,重新评测即可。
- 爬虫运行完成后,会在根目录下生成
images 文件夹,在本平台进入命令行,找到相应目录:cd /images,通过命令 ls,可以查看 images 文件夹的内容。
- 预期输出:爬取成功。
-
代码示例
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 **********#