本篇文章小编给大家分享一下python编程scrapy实现搜狗图片下载器代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
目标站点说明
这次要采集的站点为搜狗图片频道,该频道数据由接口直接返回,接口如下:
https://pic.sogou.com/napi/pc/recommend?key=homeFeedData&category=feed&start=10&len=10 https://pic.sogou.com/napi/pc/recommend?key=homeFeedData&category=feed&start=20&len=10
其中只有start参数在发生变化,所以实现起来是比较简单的。
编写核心爬虫文件
import scrapy class SgSpider(scrapy.Spider): name = 'sg' allowed_domains = ['pic.sogou.com'] base_url = "https://pic.sogou.com/napi/pc/recommend?key=homeFeedData&category=feed&start={}&len=10" start_urls = [base_url.format(0)] def parse(self, response): json_data = response.json() if json_data is not None: img_list = json_data["data"]["list"] for img in img_list: yield {'image_urls': [_["originImage"] for _ in img[0]["picList"]]} else: return None
上述代码直接调用了第一页的接口数据,后续代码都是在对JSON数据中的图片地址进行提取。
其中最重要的一行代码如下:
yield {'image_urls': [_["originImage"] for _ in img[0]["picList"]]}
这里的image_urls是为了调用 scrapy 内置的图片下载中间件,固定的参数。
settings.py
该文件也需要进行修改,具体细节如下所示:
# 用户代理设置 USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36' # Obey robots.txt rules ROBOTSTXT_OBEY = False # 下载间隔设置为 3 秒 DOWNLOAD_DELAY = 3 # 默认请求头 DEFAULT_REQUEST_HEADERS = { 'Accept': 'application/json, text/plain, */*', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'HOST': 'pic.sogou.com', } # 开启 ImagesPipeline 图片保存管道 ITEM_PIPELINES = { 'scrapy.pipelines.images.ImagesPipeline': 1, } # 图片存储文件夹 IMAGES_STORE = "images"
运行代码图片就会自动进行下载,保存到images目录中,下载完毕输出如下信息,本次仅采集第一页数据,顾得到40张图片。
如果你代码运行之后,没有下载到目标图片,请确定是否出现如下BUG。
ImagesPipeline requires installing Pillow 4.0.0
解决办法非常简单,安装Pillow库即可。
还存在一个问题是文件名是动态的,看起来有点乱。
在pipelines.py文件中增加一个自定义文件名称的数据管道。
class SogouImgPipeline(ImagesPipeline): def get_media_requests(self, item, info): name = item["name"] for index, url in enumerate(item["image_urls"]): yield Request(url, meta={'name': name, 'index': index}) def file_path(self, request, response=None, info=None): # 名称 name = request.meta['name'] # 索引 index = request.meta['index'] filename = u'{0}_{1}.jpg'.format(name, index) print(filename) return filename
上述代码的主要功能是重新命名了图片文件名,下面同步修改SgSpider类中的相关代码。
def parse(self, response): json_data = response.json() if json_data is not None: img_list = json_data["data"]["list"] for img in img_list: yield { 'name': img[0]['title'], 'image_urls': [_["originImage"] for _ in img[0]["picList"]], } else: return None
再次运行代码,图片保存之后,文件名就变得易识别了许多。
最后补全下一页的逻辑即可实现本案例。
太极熊猫2百度版 安卓版v1.7.1
下载黎明觉醒应用宝版 安卓版v1.111.1
下载暗影格斗3国际版 (Shadow Fight 3)最新版v1.40.3
下载王者战魂华为版 安卓版v3.6.1
下载放置魔法学院免广告版 v2.9.5
放置魔法学院内置Mod菜单是游戏的破解版本,在该版本中为玩家
万乘之国qq版本 安卓版v1.0.5
万乘之国qq版本是一款极具魅力的策略游戏,玩家们可以通过不同
动物餐厅国际服无限内购版 v12.9
动物餐厅国际服免广告版是游戏的破解版本,在该版本中为玩家去除
欧洲卡车司机 安卓版v3.2
欧洲卡车司机是款模拟经营游戏,这款游戏的画面还是蛮逼真的,给
疯狂大酒店 (Grand Hotel Mania)最新中文版v4.10.0.20
疯狂大酒店(Grand Hotel Mania)是一款好玩的