前言

最近工作中遇到一个需求,需要将京东上图书的图片下载下来,假如我们想把京东商城图书类的图片类商品图片全部下载到本地,通过手工复制粘贴将是一项非常庞大的工程,此时,可以用Python网络爬虫实现,这类爬虫称为图片爬虫,接下来,我们将实现该爬虫。

实现分析

首先,打开要爬取的第一个网页,这个网页将作为要爬取的起始页面。我们打开京东,选择图书分类,由于图书所有种类的图书有很多,我们选择爬取所有编程语言的图书图片吧,网址为:https://list.jd.com/list.html?cat=1713,3287,3797&page=1&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main

如图:

进去后,我们会发现总共有251页。

那么我们怎么才能自动爬取第一页以外的其他页面呢?

可以单击“下一页”,观察网址的变化。在单击了下一页之后,发现网址变成了https://list.jd.com/list.html?cat=1713,3287,3797&page=2&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main。

我们可以发现,在这里要获取第几页是通过URL网址识别的,即通过GET方式请求的。在这个GET请求中,有多个字段,其中有一个字段为page,对应值为2,由此,我们可以得到该网址中的关键信息为:https://list.jd.com/list.html?cat=1713,3287,3797&page=2。接下来,我们根据推测,将page=2改成page=6,发现我们能够成功进入第6页。

由此,我们可以想到自动获取多个页面的方法:可以使用for循环实现,每次循环后,对应的网址中page字段加1,即自动切换到下一页。

在每页中,我们都要提取对应的图片,可以使用正则表达式匹配源码中图片的链接部分,然后通过urllib.request.urlretrieve()将对应链接的图片保存到本地。

但是这里有一个问题,该网页中的图片不仅包括列表中的商品图片,还包括旁边的一些无关图片,所以我们可以先进行一次信息过滤,第一次信息过滤将中间的商品列表部分数据留下,将其他部分的数据过滤掉。可以单击右键,然后查看网页的源代码,如图:

可以通过商品列表中的第一个商品名为“JAVA从入门到精通”快速定位到源码中的对应位置,然后观察其商品列表部分的特殊标识,可以看到,其上方有处“

进行了第一次信息过滤后,留下来的图片链接就是我们想爬取的图片了,下一步需要在第一次过滤的基础上,再将图片链接信息过滤出来。

此时,需要观察网页中对应图片的源代码,我们观察到其中两张图片的对应源码:

图片1:

图片2:

对比两张图片代码,发现其基本格式是一样的,只是图片的链接网址不一样,所以此时,我们根据该规律构造出提取图片链接的正则表达式:

刚开始到这里,我以为就结束了,后来在爬取的过程中我发现每一页都少爬取了很多图片,再次查看源码发现,每页后面的几十张图片又是另一种格式:

所以,完整的正则表达式应该是这两种格式的或:

|

到这里,我们根据该正则表达式,就可以提取出一个页面中所有想要爬取的图片链接。

所以,根据上面的分析,我们可以得到该爬虫的编写思路与过程,具体如下:

建立一个爬取图片的自定义函数,该函数负责爬取一个页面下的我们想爬取的图片,爬取过程为:首先通过urllib.request.utlopen(url).read()读取对应网页的全部源代码,然后根据上面的第一个正则表达式进行第一次信息过滤,过滤完成之后,在第一次过滤结果的基础上,根据上面的第二个正则表达式进行第二次信息过滤,提取出该网页上所有的目标图片的链接,并将这些链接地址存储的一个列表中,随后遍历该列表,分别将对应链接通过urllib.request.urlretrieve(imageurl,filename=imagename)存储到本地,为了避免程序中途异常崩溃,我们可以建立异常处理。

通过for循环将该分类下的所有网页都爬取一遍,链接可以构造为url='https://list.jd.com/list.html?cat=1713,3287,3797&page=' + str(i)

完整的代码如下:

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

import re

import urllib.request

import urllib.error

import urllib.parse

sum = 0

def craw(url,page):

html1=urllib.request.urlopen(url).read()

html1=str(html1)

pat1=r'

'

result1=re.compile(pat1).findall(html1)

result1=result1[0]

pat2=r'|'

imagelist=re.compile(pat2).findall(result1)

x=1

global sum

for imageurl in imagelist:

imagename='./books/'+str(page)+':'+str(x)+'.jpg'

if imageurl[0]!='':

imageurl='http://'+imageurl[0]

else:

imageurl='http://'+imageurl[1]

print('开始爬取第%d页第%d张图片'%(page,x))

try:

urllib.request.urlretrieve(imageurl,filename=imagename)

except urllib.error.URLError as e:

if hasattr(e,'code') or hasattr(e,'reason'):

x+=1

print('成功保存第%d页第%d张图片'%(page,x))

x+=1

sum+=1

for i in range(1,251):

url='https://list.jd.com/list.html?cat=1713,3287,3797&page='+str(i)

craw(url,i)

print('爬取图片结束,成功保存%d张图'%sum)

运行结果如下:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

python爬取京东图书_Python 3实战爬虫之爬取京东图书的图片详解相关推荐

  1. python中的json函数_python中装饰器、内置函数、json的详解

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...

  2. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...

  3. python海伦公式求三角形面积_python编程实战:海伦公式求取三角形的面积

    之前小编向大家介绍了在python中求取三角形面积的方法:三角形面积代码.大家对三角形面积的求取有了一定的了解,我们也知道计算机可以进行高精度的计算,那如果说在测量土地的面积的时候,不测三角形的高,只 ...

  4. python的pca计算累计贡献率_Python机器学习实战:维数约简之主成分分析(PCA)详解...

    机器学习实战:这里没有艰深晦涩的数学理论,我们将用简单的案例和大量的示例代码,向大家介绍机器学习的核心概念.我们的目标是教会大家用Python构建机器学习模型,解决现实世界的难题. 本文来自<数 ...

  5. python中主函数循环_python入门(三):分支、循环、函数详解

    1.分支 if循环格式: if condition_1: statement_block_1 elif condition_2: statement_block_2 else: statement_b ...

  6. python中x y表示_Python中表达式x += y和x = x+y 的区别详解

    前言 本文主要给大家介绍的是关于Python中表达式x += y和x = x+y 区别的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 直接看下面代码: x +=y In [66]: id( ...

  7. python合成gif动图_Python图像处理之gif动态图的解析与合成操作详解

    本文实例讲述了Python图像处理之gif动态图的解析与合成操作.分享给大家供大家参考,具体如下: gif动态图是在现在已经司空见惯,朋友圈里也经常是一言不合就斗图.这里,就介绍下如何使用python ...

  8. python获取当前线程名称_python使用标准库根据进程名如何获取进程的pid详解

    前言 标准库是Python的一个组成部分.这些标准库是Python为你准备好的利器,可以让编程事半功倍.特别是有时候需要获取进程的pid,但又无法使用第三方库的时候.下面话不多说了,来一起看看详细的介 ...

  9. python离线录音转文字_Python将文字转成语音并读出来的实例详解

    前言 本篇文章主要介绍,如何利用Python来实现将文字转成语音.将文字转成语音主要有两种不同的实现方法:先将文字转成语音,然后再通过读取语音实现发音.直接调用系统内置的语音引擎实现发音,后一种方法的 ...

  10. python中函数的调用_python函数的调用、函数中变量的使用之详解

    '''函数的工作原理:函数内部的变量都是临时的, 当你的函数返回以后,返回值可以被赋予一个变量. 这里是创建了一个新变量,用来存放函数的返回值. ''' def secret_formula(star ...

最新文章

  1. 阿里达摩院2020趋势第一弹:感知智能的“天花板”和认知智能的“野望”
  2. SQL SERVER 2008的元数据视图
  3. Python - 关于方法参数和字典更新(dict.update())方法
  4. java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet
  5. nginx-rtmp message
  6. 破环计算机系统的案件量刑,破坏计算机信息系统罪如何定罪量刑
  7. .NET Compact Framework 2.0 SP1 发布了
  8. UNIX/Linux系统结构
  9. 交友程序网站源码全套源码带APP源码+安装视频教程
  10. 项目中的门禁管理者贾维斯———关于 Shiro 框架的 基本使用和基础配置,以及工作流程的生动解释
  11. 如何将小程序代码上传到腾讯云服务器
  12. asp.net打开对话框选择文件路径
  13. 训练孩子思维能力的几种方法
  14. Docker常用基础命令
  15. php5 dm.dll,win10模块dll加载失败二进制怎么解决?
  16. 大学期间技术学习方面最有成就感的事?
  17. 从《乔布斯传》里得到的20条经验和教训
  18. (最简单)从MIT-BIH ECG 心电数据(.txt)详细的下载过程
  19. 精益六西格玛绿带应用培训(5天)
  20. Qt 雷达模拟仿真工具2.0

热门文章

  1. 一维码Code 128简介及其解码实现 zxing-cpp
  2. 数据中心的三种布线方式(EOR/MOR/TOR)
  3. 计算机组成原理第5版第六章答案,计算机组成原理第六章答案.docx
  4. IT行业常见职位英语缩写及中文释义
  5. 惠普HP CQ40 519TX XP系统安装以及XP驱动
  6. w ndows10怎么关闭启动项,Windows10系统移除启动项无用项目的三种方法
  7. 2019中国互联网应用基本发展状况
  8. 互联网系统应用架构基础分析
  9. 如何使用CodeSmith批量生成代码(原创系列教程)
  10. AspNetPager 存储过程