python编程scrapy简单代码实现搜狗图片下载器
程序员文章站
2022-03-09 19:24:03
学习任何编程技术,都要有紧有送,今天这篇博客就到了放松的时候了,我们学习一下如何用 scrapy 下载图片吧。目标站点说明这次要采集的站点为搜狗图片频道,该频道数据由接口直接返回,接口如下:https...
学习任何编程技术,都要有紧有送,今天这篇博客就到了放松的时候了,我们学习一下如何用 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
再次运行代码,图片保存之后,文件名就变得易识别了许多。
最后补全下一页的逻辑即可实现本案例啦,这一步骤留给你来完成。
以上就是使用python scrapy简单代码实现搜狗图片下载器的详细内容,更多关于python scrapy实现搜狗图片下载器的资料请关注其它相关文章!
上一篇: 字节告别“app”工厂和张一鸣