进入页面,发现图片是动态加载的。通过Ajax加载json文件。所以对request header的url进行观察,发现start参数每次加15。所以爬取过程并不难解决,关键是图片的存储


爬的过程还是会有坑的
先看items.py,这个没啥

import scrapyclass SougouphotoItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()file_name = scrapy.Field()# 获取文件的名字picture_link = scrapy.Field()image_results = scrapy.Field()image_paths = scrapy.Field()

sougou.py

# -*- coding: utf-8 -*-
import scrapy
import demjson
from ..items import SougouphotoItemclass SougouSpider(scrapy.Spider):name = 'sougou'allowed_domains = ['pic.sogou.com']# 不是sougou是sogou。。。我醉了start_urls = ['https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=壁纸&tag=全部&start=0&len=15']def parse(self, response):# 此处巨坑content = demjson.decode(response.body.decode('gbk'))datas = content['all_items']for data in datas:file_name = data['title']picture_link = data['thumbUrl']item = SougouphotoItem()item['file_name'] = file_nameitem['picture_link'] = [picture_link] # 打死都要记住此处是列表yield itemurls = ['https://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=壁纸&tag=全部&start={}&len=15'.format(str(i)) for i in range(15,225,15)]for url in urls:request = scrapy.Request(url,callback=self.parse)yield request

注意

  • 首先,搜狗的英文是sogou,我被这个害惨了,发现一只只能爬出15张。。后来才缓过神。

  • 在获取json数据后,对json数据进行处理,此处如果用json.loads(response.body)会出现UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb1 in position,后来经过多种查询和尝试,发现解决办法是用demjson库,需要pip一下,然后decode()方法解析json数据,而且response.body还有decode(‘gbk’)即content = demjson.decode(response.body.decode(‘gbk’))这样才可以正确转换为python对象

  • 要注意一个data里面有很多个url,thumbUrl、pic_url、orgin_url等,并不是每一个都可以请求并获取到相应,很可能会出现404.。。即报错[scrapy.pipelines.files] WARNING: File (code: 404): Error downloading file from <GET…所以最好取多个image的url,那一个行要哪个,这里偷懒了

  • 要注意,item返回的图片的url一定要是列表的形式,不然会出现ValueError: Missing scheme in request url: h

下面是piplines.py

import os
import scrapy
from sougouphoto.settings import IMAGES_STORE as images_store
from scrapy.pipelines.images import ImagesPipelineheaders = {'Referer': 'https://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD&from=category','User-Ageny':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}class SougouphotoPipeline(ImagesPipeline):# 继承ImagesPipline并重写两个方法def get_media_requests(self, item, info):# image_link = item['picture_link']for image_link in item['picture_link']:# 正如用不用框架实现下载图片一样,对图片的url要发起请求yield scrapy.Request(image_link,headers=headers)def item_completed(self, results, item, info):# 可以知道results的结构# 提取results里面的路径并改为自己的文件存储路径image_path = [x['path'] for ok,x in results if ok]item['image_paths'] = image_pathtry:#此处对图片进行重命名os.rename(images_store + image_path[0], images_store + item['file_name'] + '.jpg')except:passreturn item

先是重写ImagePiline里面的get_media_request方法,用来对图片url发送请求并获取相应,第二个函数获取对应的results,results长这样

[(True,{'checksum': '2b00042f7481c7b056c4b410d28f33cf','path': 'full/7d97e98f8af710c7e7fe703abc8f639e0ee507c4.jpg','url': 'http://www.example.com/images/product1.jpg'}),(True,{'checksum': 'b9628c4ab9b595f72f280b90c4fd093d','path': 'full/1ca5879492b8fd606df1964ea3c1e2f4520f076f.jpg','url': 'http://www.example.com/images/product2.jpg'}),(False,Failure(...))]

可以看到是列表里面套元祖再套字典,所以用列表推导式提取里面的path,先是判断第一个元素是否为True,是True的话就提取里面的path固有这一条列表推导式

image_path = [x['path'] for ok,x in results if ok]

关于列表推导式,最左边的那个元素就代表是这个列表里面的元素,然后这个最左边的东西是要经过一个循环得到的,这个循环又要满足某个条件才会进行循环。

在这里的话,意思就是:序列解包,取出第一个元素是True还是False并赋值给ok,如果ok是True,就取出后面的字典并提取出名为‘path’的键作为值,这个值就作为这个列表里面的元素。

后面用os.rename()方法对图片进行重命名,这里的话需要从settings里面导入一下IMAGE_STORE这位兄台。

settings.py

LOG_LEVEL = 'WARNING'
ROBOTSTXT_OBEY = False
IMAGES_STORE = 'D:\\yourphoto/'# 必须要写
DEFAULT_REQUEST_HEADERS = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36','Referer': 'https://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD&from=category','Cookie': 'SUID=9E6888751620940A000000005C3C5D91; SUV=1547459988264723; IPLOC=CN4420; usid=9D9D1C74E609990A000000005C446306; sct=1; CXID=AFE813F02B1F31E306F131BC626E5180; ad=tUxlylllll2tvh@9lllllVeaHuDllllltUO$kyllll9lllllp6xll5@@@@@@@@@@; ld=llllllllll2tvjlQlllllVeU@4clllllKqhDcZllll9llllllklll5@@@@@@@@@@; LSTMV=260%2C204; LCLKINT=2323; JSESSIONID=aaasiP55egOwC6sRlHQJw; tip_show_home_search=20190214; SNUID=F0288185F4F07420E30A9B41F5D7C678; SNUID=5F872E2A5B5FDA8F4D4BB9A15B2B3BDC',
}
ITEM_PIPELINES = {# 'scrapy.contrib.pipeline.images.ImagesPipeline': 1,'sougouphoto.pipelines.SougouphotoPipeline': 300,
}

然后 scrapy crawl sougou就完事了。。
看一哈结果

Scrapy定制图片管道爬取搜狗图片(Ajax接口)相关推荐

  1. 爬虫实践:爬取搜狗图片

    前言 本文中,将通过爬取搜狗图片为例,分析Ajax请求来抓取网页数据 (通过传入关键字,已达到爬取不同类型图片的目的) AJAX引擎其实是一个JavaScript对象,全写是 window.XMLHt ...

  2. python爬取搜狗图片

    python爬取搜狗图片 cond(`""" 对于动态加载的网站图片的获取,我们需要去分析js内容一定要让网页发生加载后去分析,分析network 里的XHR,可以看到需 ...

  3. 进军Json,以战养战 -- 爬取搜狗图片代码分析

    爬取搜狗图片代码分析 代码 代码功能 代码 代码解析 总结 代码 代码功能 从搜狗网页下载 n 张指定分类的图片并保存到指定的文件夹. 代码 # 导入相关的库 import requests impo ...

  4. 使用python爬虫爬取搜狗图片无法获得图片网址

    错误原因 找页面网址时:我是打开一张图片,从上方搜索栏复制的,然后发现了规律 xxxx#did=0 这个0一直往后增加,我把它作为页面规律.试验了一下,这些网址能进入到对应的图片. 然后打开了F12, ...

  5. Python爬虫实战 | (9) 爬取搜狗图片

    本篇博客我们将爬取百度图片,输入搜索词,爬取与搜索词相关的图片. 首先打开搜狗图片https://pic.sogou.com/,比如搜索"猫",此时的URL如下: https:// ...

  6. 利用requests库爬取搜狗图片并存入文件夹下

    看了一篇帖子,https://www.cnblogs.com/dearvee/p/6558571.html 这篇帖子作为一个引导,摸索着完成了第一个爬虫,现在将过程总结如下. 搜狗图片地址为 http ...

  7. python爬虫百度图片_python3爬取百度图片(2018年11月3日有效)

    最终目的:能通过输入关键字进行搜索,爬取相应的图片存储到本地或者数据库 首先打开百度图片的网站,搜索任意一个关键字,比如说:水果,得到如下的界面 分析: 1.百度图片搜索结果的页面源代码不包含需要提取 ...

  8. scrapy框架 crawl spider 爬取.gif图片

    创建项目: scrapy startproject qiumeimei 建立爬虫应用: scrapy genspider -t crawl meimei www.qiumeimei.com 爬虫文件 ...

  9. 不上浏览器也可以下载美图了(python 批量爬取搜狗图片)

    批量下载搜狗图片 -  操作步骤:  - (1)复制代码到本地,打开python项目  - (2)运行项目,根据提示输入搜索信息,即可下载图片到相应文件夹 # -*- coding:utf-8 -*- ...

最新文章

  1. 函数式编程语言python-函数式编程初探
  2. 判断输入的字符串是否为回文_刷题之路(九)--判断数字是否回文
  3. 页面某个模块的文字内容是动态的,可能是几个字,也可能是一句话。然 后,希望文字少的时候居中显示,文字超过一行的时候居左显示。该如何实现?...
  4. gridview不显示bit_色彩要求高?这款27寸2K +10.7亿色的显示器工作娱乐都适合
  5. 近 5 亿人的隐私,毁于一位程序员之手?
  6. 【leetcode】Permutations
  7. Linux操作系统下/etc/hosts文件
  8. latex 基本用法(三)
  9. 开源许可协议了解这些就够了
  10. Dubbo/ Spring Cloud 分布式事务管理 LCN方式
  11. 【报告分享】 百度2021国潮骄傲搜索大数据报告-百度x人民网(附下载)
  12. 代码分析工具 - SonarQube
  13. 三轴加速度传感器和六轴惯性传感器_六轴传感器和三轴传感器的区别在哪
  14. python毕业设计题目推荐飞机票销售订票系统
  15. tkinter运行时出现无响应问题
  16. 服务器虚拟化实施方案可研报告,服务器虚拟化实施方案可研可行报告报告(2017word资料).doc...
  17. draftsight linux 32,DraftSight停止提供Linux版:所有免费版将于2019年12月31日后停止运行...
  18. 混迹在腾讯微博的知名站长名单(截至4月28日)
  19. Unity_物体旋转方法归纳
  20. 研修平台展示页-sun鹏飞

热门文章

  1. Flash Pro CS5无法跳过注册Adobe ID的问题
  2. 初中学业水平计算机考不及格,初中学业水平考试不及格能毕业吗?初中学业水平考试重不重要?...
  3. UE4将图片数据读到贴图中
  4. (附源码)spring boot校园二手销售网站 毕业设计161417
  5. LeetCode 2065. Maximum Path Quality of a Graph(最大化一张图中的路径价值)
  6. TabLayout和Fragment实现点击和滑动切换
  7. 电子工程师也有“鄙视链”!软件硬件无一幸免!
  8. python读二进制格点雷达基数据_对numpy中二进制格式的数据存储与读取方法详解...
  9. cdh 之 HDFS集群优化篇003
  10. GPIO模拟红外发射