爬取汽车之家某品牌图片

需求

爬取汽车之家某品牌的汽车图片

目标url

https://car.autohome.com.cn/photolist/series/52880/6957393.html#pvareaid=3454450

页面分析

最开始出现的全景的图片不是爬取的范畴。每一页有90张图片,还要做一个翻页的处理。

找到一张图片,点右键,检查,可以发现每一张图片都存放在一个li标签内,所有的li标签都存放在ul标签内,图片的链接信息存放在li标签下a标签里的img标签内,复制src后面的地址,在新的网址中可以打开图片,说明存放的是图片的url地址。在打开图片的网址中,可以发现浏览器对图片地址进行了补全的操作。

下面要判断网页是动态还是静态加载出来的,对img标签进行判断,看是否存放在源码中,点击右键,检查网页源码,可以看到img里图片的url信息在源码中存在,所以目标url即为要爬取的url

下面进行翻页的处理。
第2页的url:https://car.autohome.com.cn/photolist/series/65/p2/
第3页的url:https://car.autohome.com.cn/photolist/series/65/p3/
这时我们把p3改为p1,发现也可以访问第1页
第1页的url:https://car.autohome.com.cn/photolist/series/65/p1/

实现步骤

创建scrapy框架,用https://car.autohome.com.cn/photolist/series/52880/6957393.html#pvareaid=3454450,作为目标url进行访问。

import scrapy
from pic.items import PicItemclass AutoSpider(scrapy.Spider):name = 'auto'allowed_domains = ['car.autohome.com.cn']start_urls = ['https://car.autohome.com.cn/photolist/series/52880/6957393.html#pvareaid=3454450']def parse(self, response):lis = response.xpath('//ul[@id="imgList"]/li')for li in lis:item = PicItem()item['src'] = 'http:' + li.xpath('./a/img/@src').get()print(item)

这里我们用xpath进行寻找,id="imgList"在源码中存在,可以直接对id后面的路径进行xpath。
可以得到第一页的图片信息,我们尝试用得到的第一页的url进行访问。https://car.autohome.com.cn/photolist/series/65/p1/,访问之后我们发现获取的最后几个图片的地址是一样的。

这时我们去源码中看一下。

我们发现有些图片的的地址在src2中,直接用src获取不到图片的真正地址。这个时候要进行一个判断。

        for li in lis:item = PicItem()# 如果有src2属性就直接获取,否则获取src的值try:item['src'] = 'http:' + li.xpath('./a/img/@src2').get()except:item['src'] = 'http:' + li.xpath('./a/img/@src').get()print(item)

先对src2进行判断,如果有就用里面的内容,否则就用src里的内容,这样得到图片的url就是正常的了。
在scrapy里有一种拼接的方法,但是在没有掌握规律之前,慎用。

class AutoSpider(scrapy.Spider):name = 'auto'allowed_domains = ['car.autohome.com.cn']start_urls = ['https://car.autohome.com.cn/photolist/series/65/p1/']def parse(self, response):page_url = '//car.autohome.com.cn/photolist/series/65/p2/'print(response.urljoin(page_url))

输出的结果为

https://car.autohome.com.cn/photolist/series/65/p2/

实现了url地址的拼接。
也可以用os模块实现路径的拼接

import os
path = os.path.join('D:\PycharmProjects\爬虫\day25\pic\images','xxx.jpg')
print(path)

拼接之后的结果为

D:\PycharmProjects\爬虫\day25\pic\images\xxx.jpg

也可以用当前系统的路径进行拼接

# 打印当前运行的py文件的完整路径
print(__file__)   # D:/PycharmProjects/爬虫/day25/pic/demo.py
#os.path.dirname() 返回文件的路径,简单理解为往上退了以及目录
print(os.path.dirname(__file__))  # D:/PycharmProjects/爬虫/day25/pic
# 再往上退一级目录
print(os.path.dirname(os.path.dirname(__file__)))

相当于从当前路径退了两级,运行的结果是

D:/PycharmProjects/爬虫/day25

第一种用pipelines保存图片

下面要对爬取的图片进行保存操作,在爬虫文件中把print(item) 改为 yield item,对pipelines进行保存图片程序的编写。

from urllib import request
import osclass PicPipeline:def process_item(self, item, spider):# print(item['src'])src = item['src']# 对图片进行保存的文件名,用__分割,取后面的字符,不会重复img_name = src.split('__')[-1]# 在pic下创建images文件夹用于保存图片# 现在要进行的操作是 把图片保存到images文件夹# 文件夹的路径file_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'images')# 图片的路径img_path = os.path.join(file_path, img_name)# print(img_path)# 保存图片,第一个参数为请求的url,第二个参数是保存的路径print(f"正在下载{img_name}图片")request.urlretrieve(src, img_path)return item

第二种用Images Pipeline下载图片

使用images pipeline下载文件步骤:

  1. 定义好一个Item,然后在这个item中定义两个属性,分别为image_urls以及images。image_urls是用来存储需要下载的文件的url链接,需要给一个列表
  2. 当文件下载完成后,会把文件下载的相关信息存储到item的images属性中。如下载路径、下载的url和图片校验码等
  3. 在配置文件settings.py中配置IMAGES_STORE,这个配置用来设置文件下载路径
  4. 启动pipeline:在ITEM_PIPELINES中设置scrapy.pipelines.images.ImagesPipeline:1

代码实施:

  1. item.py里增加
    image_urls = scrapy.Field()
    images = scrapy.Field()
  2. 爬虫文件中item[‘src’]改为item[‘image_urls’],后面的url加上列表
  3. 在setting里做配置
  ITEM_PIPELINES = {# 'pic.pipelines.PicPipeline': 300,'scrapy.pipelines.images.ImagesPipeline': 1
}
import os
# 文件夹的路径
file_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'images')
# 配置文件的下载路径(文件路径)
IMAGES_STORE = file_path

运行程序即可,爬取的图片保存在images文件夹下的full文件夹里,但是图片的名字是随机生成的。
我们可以尝试看一下原因。from scrapy.pipelines.images import ImagesPipeline,导入ImagesPipeline类,鼠标左键点击进入源码中,在178行左右有个file_path函数

    def file_path(self, request, response=None, info=None, *, item=None):# 哈希生成32位的十六进制数据作为图片的名字image_guid = hashlib.sha1(to_bytes(request.url)).hexdigest()# 返回文件夹下full文件夹内,图片的名字是哈希随机生成的return f'full/{image_guid}.jpg'

哈希的简单使用

import hashlib
h = hashlib.sha1()
print(h)  # 返回哈希对象 <sha1 HASH object @ 0x00000244B4A15760>
h.update('images'.encode('utf-8'))  # 对数据加密
# hexdigest()返回的是十六进制的字符串
print(h.hexdigest())  # 19f49d852660fe0a079cbf95c3efb34ba88de911

python爬虫(二十四)爬取汽车之家某品牌图片相关推荐

  1. python爬虫利用Scrapy框架爬取汽车之家奔驰图片--实战

    先看一下利用scrapy框架爬取汽车之家奔驰A级的效果图 1)进入cmd命令模式下,进入想要存取爬虫代码的文件,我这里是进入e盘下的python_spider文件夹内 C:\Users\15538&g ...

  2. python3爬虫系列16之多线程爬取汽车之家批量下载图片

    python3爬虫系列16之多线程爬取汽车之家批量下载图片 1.前言 上一篇呢,python3爬虫系列14之爬虫增速多线程,线程池,队列的用法(通俗易懂),主要介绍了线程,多线程,和两个线程池的使用. ...

  3. 爬虫入门经典(二十四) | 爬取当当网图书信息并进行数据清洗

      大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语-不温不火,本意是希望自己性情温和.作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己 ...

  4. python爬虫二十四:js逆向破解(一)

    1.环境搭建 通过python代码模拟js去生成加密数据完成数据破解,需要用到PyExecJS模块 ①安装模块pip install pyexecjs通过模块的方法来读取js代码,也可以用js2py( ...

  5. java爬虫入门--用jsoup爬取汽车之家的新闻

    概述 使用jsoup来进行网页数据爬取.jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuer ...

  6. 【python爬虫实战】批量爬取站长之家的图片

    概述: 站长之家的图片爬取 使用BeautifulSoup解析html 通过浏览器的形式来爬取,爬取成功后以二进制保存,保存的时候根据每一页按页存放每一页的图片 第一页:http://sc.china ...

  7. python爬取汽车之家图片,Python requests 爬取汽车之家全部品牌logo,urllib下载到本地...

    首先是汽车之家品牌页面的HTML 我们定位到图片那个位置,这个img标签的src加上https就是图片完整的地址 那么品牌名称就是下面那个p标签的text 接下来我们的目的就是从中取出src和text ...

  8. Python requests 爬取汽车之家全部品牌logo,urllib下载到本地

    首先是汽车之家品牌页面的HTML 我们定位到图片那个位置,这个img标签的src加上https就是图片完整的地址 那么品牌名称就是下面那个p标签的text 接下来我们的目的就是从中取出src和text ...

  9. python爬虫入门教程|爬取游民福利,大量妹子图片,源码 + 多张福利

    点赞再看,养成习惯 文章目录 分析一下 步骤 源码 一键运行下载本地 待解决 难点 有这样一个网站,对它做了一下爬取,先看看效果,这样. 上图是一小部分,目测大概有 260*20*66+ ,下面就授人 ...

最新文章

  1. 学习 Message(17): WM_SYSCOMMAND 消息[一]
  2. 有关Non-cacheable,,Cacheable, non-shareable,inner-shareable,outer-shareable的理解
  3. 关于眼界、眼光、眼前的哪些....
  4. react 网易云音乐实战项目笔记
  5. android外部sd卡,Android 操作外部SD卡问题
  6. 基础管理薄弱服装企业如何实施ERP
  7. 刘强东震怒:疑不满内部拉帮结派人浮于事!
  8. POJ 3624 Charm Bracelet【01背包】
  9. 20200727每日一句
  10. 视频教程-2021软考网络工程师--基础知识视频教程-软考
  11. 给Ubuntu配置静态IP地址
  12. php smarty extends,php封装的smarty类完整实例
  13. 破解中小企业“生产、设计、销售”三大痛点,网易推出“时尚工业互联网”
  14. 引入ant组件分页时显示英文问题
  15. 解决方案:yarn 出现error An unexpected error occurred错误的解决办法
  16. 不容忽视的细节——线面积分中的奇点
  17. 你可能没听过的11个Python库
  18. 从初级晋级高级UI设计师学习路线+全套视频
  19. Android Gatekeeper
  20. 怎样使用jquery UI模板详解

热门文章

  1. linux拷贝文件大小不一样,关于拷贝或远程拷贝文件后大小不一致的问题分析
  2. CentOS7环境下MySQL定时备份
  3. 绩效面谈中的优质提问(一)
  4. Pyhton学习笔记第一天(Python基本语句)
  5. 中文顿号怎么输入_键盘上顿号怎么打出来 顿号用键盘打出来的两种方法
  6. Html5调用摄像头拍照
  7. 2018年传智播客黑马训练营JAVAEE49期培训最新分享
  8. 可选链操作符( ?. )
  9. getActionBar()为null的解决方法总结(引用他人)
  10. python画玫瑰花带名字_Python 画一朵玫瑰给你