用Python爬取网站的图片

news/2024/5/11 1:18:34/文章来源:https://blog.csdn.net/xixi20200/article/details/109504573

 爬虫这东西最早出现在我大学计算机网络的课程上面,我们当时的老师人很好,期末不笔试,他说这东西笔试没什么用,对于一个年纪比较大的老师来讲,能提出这种方式,实在难得。当时在考虑做一个与网络有关的东西好,第一个想到的就是爬虫。想想也没想过用Java写过这种东西,所以当时是一般看一本爬虫的书一边敲代码,现在想起来有很多东西是没有想明白的——我当时爬的是刘末鹏的博客,把全部文章用分类爬了下来,在本地可以打开。

 

后面老师评价的时候就说,你这个只能爬这个,其实你应该让他智能些,让他可以爬图片,可以爬特定的内容,我想想也是,不过知道的,后续有别的东西就没再去弄了。

 

而后知道写爬虫还可以用Python写,前面草草看了Python的一点东西,不系统。

后面看了《Learn Python in hard way》,嗯,这本书其实是为了连没有编程基础的人也学会,有编程基础的英文却不好的,可以练练英文,其实书到后面的跨度是比较大的,包括那个课后的习题游戏,自己不理清思路还是很难写出来。

有了大概的基础之后,你会发现,python有好多好多API。

 

《The Python Standard Library by Example》是一本大厚书,这种书更像查字典,官网的Python library的例子有点蛋疼。这本书超级详细,包括正则表达式。

 

学这门语言的时候遇到很多有趣的事情。

 

当年那位在圣诞无聊开发了一门编程语言的人就是Python的作者。

 

用自带的库也能写爬虫,但是有一个第三方库用起来很方便——requests,这个库不有趣,有趣的是他的作者——Kenneth Reitz。很年轻。为什么说有趣,是因为我看了之后上一个减肥的问题。

减肥前,他长——

                                                          

 

减肥后,他长——

                                                          

 

他爱好好像也是摄影,GitHub上的粉丝也是多。无论从编程还是减肥,他都是一个励志的例子。

 

回来正题:

当你要做点什么东西的时候,你还是需要想清楚你要获取什么,不然你很难写下去。像我刚开始模拟登录知乎的时候,登录完成后很高兴,后面也不知道怎么去爬,也没思路。后面有同事想获取一个网站上的图片,他花了好多钱买了一个php上传图片的工程,不禁感叹淘宝的钱真好赚。而他要下载图片,想想自己最近学的requests库还有其他东西。决定帮他爬。

 

要爬的是http://zone.quanjing.com这个网站。首先我先找了设计这个分类下的照片,分析了下html的源代码。

 

 
  1. <img class="250img" width="250" height="337" title="" alt=""

  2. showsrc="http://zonepic.quanjing.com/photo/p0/151112/151112-023836-ewvdeb.jpg" src="/image/grey.gif">

  3. </a> </div></center></div>

  4. <div class="favorite"><p class="title" title="跨界创意"><a href="http://www.quanjing.com/share/1160068">跨界创意</a>


其实知道自己获取这些数据之后,接下来要做的就是知道用正则如何去匹配到。思路有了,实现就简单了。
然后你知道怎么用requests库,python的一些基础,正则表达式就可以爬取到首页的图片了。

 

 

 
  1. #!/usr/bin/env python

  2. # -*- coding: utf-8 -*-

  3. # @Author: iaiti

  4. # @Date: 2015-11-17 15:18:28

  5. # @Last Modified by: Administrator

  6. # @Last Modified time: 2015-11-19 11:11:37

  7.  
  8. import re

  9. import requests

  10. import sys

  11. #设置编码

  12. reload(sys)

  13. sys.setdefaultencoding('utf-8')

  14. circle = requests.get("http://zone.quanjing.com/share/design/")

  15. #text和content的内容有不同

  16. ccontent = circle.text

  17. #这里是正则的坑 括号的东西是分组的 外面没有括号之前 只会匹配到jpg和png不会匹配全部

  18. #外面多一层括号才会匹配整个 但是特别的是 里面的括号也会匹配 所以

  19. #真正findall的是整个list list里面每个都是元组 元组里面有xxx.jpg和jpg

  20. pattern = "(http:[^\s]*?(jpg|png|PNG|JPG))"

  21. finder = re.findall(pattern, circle.text)

  22.  
  23. #匹配到之后获取匹配开头和末尾位置

  24. # finder = re.search(pattern, test)

  25. # start = finder.start()

  26. # end = finder.end()

  27. # print test[start:end]

  28. #匹配http 获取文件名

  29. truepicture = ".*photo/p0.*"

  30. #匹配图片网址

  31. picpattern = "http:[^\s]*/"

  32. #匹配标题

  33. titlepattern = '<p class="title" title=".*?"'

  34. imgfinder = re.findall(titlepattern, circle.text)

  35. imglen = 0

  36. for n in xrange(0,len(finder)):

  37. if re.match(truepicture, finder[n][0]):

  38. print finder[n][0]

  39.  
  40. #p0改为r0后变成了大图目录的地址,

  41. bigpicture = finder[n][0].replace('photo/p0','photo/r0')

  42. newimg = requests.get(bigpicture)

  43.  
  44. #替换掉无关的字符串

  45. temp = imgfinder[imglen].replace('<p class="title" title="','')

  46. newfinder = re.search(picpattern, finder[n][0])

  47.  
  48. #截取title

  49. temp = "G:/github/WebSpider_Python/img/"+temp[0:len(temp)-1]+'.jpg'

  50. #下载文件,超级简单 设定好目录 content的意义也在于这里

  51. with open(temp,'wb') as newfile:

  52. newfile.write(newimg.content)

  53.  
  54. imglen = imglen+1


先上代码,其实爬虫这东西的文章,很多跨度太大,但是要给自己信心,不要别人可以爬的你也可以,看了一些基本的之后,自己动手写才是最重要的。我在这里写这篇,也是给个思路那样。

 

 

其实爬了首页之后,发现就那么几张图片。当你你鼠标往下拉,会自动加载东西。所以,万能的抓包出现了,和wireshark抓包不同的是,wireshark抓的包比较详细,包括tcp三次握手等等,嗯,前辈跟我说的,它带有很多路由信息。我们只需要分析http请求,所以chrome自带的调试工具,足矣。

 

按下F12。往下拉,然后请求都会被捕获。

 

 

现在想想我想起了以前面试的时候面试官问我的东西,get和post的区别,我答的是get提交的数据会被捕捉到,post不会,想想当时懂的还是不多。

不过学习中也找到了问题的答案。

 

从捕获的东西上看出,网站后台用了.net。然后post了这些参数。

再看看js文件。

 

其实从这里我发现到和我写的系统惊人的相似,这就是前后端分离的结果。

前端可以写的完全一模一样,但是后台可以使用.net,也可以使用java。嗯,用requests模拟请求这个,得到的是:

 

{ "TableInfo":[ { "id":"1123130","FilePath":"141118-121609-fVwIzH.jpg","userid":"974767",
"title":"%e4%b8%8d%e8%8a%b1%e9%92%b1%e7%b3%bb%e5%88%97%e6%b5%b7%e6%8a%a5",
"Height":"255","UserName":"广州合丰","headpic":"default.jpg"},{ "id":"1123129","FilePath":"141118-121233-LxISqc.jpg","userid":"974767","title":"%e5%8d%93%e8%b6%8a%e6%b2%83%e6%9c%8d%e5%8a%a1%e7%b3%bb%e5%88%97%e6%b5%b7%e6%8a%a5","Height":"1374","UserName":"广州合丰","headpic":"default.jpg"}]}

 

字典里面TableInfo的值是列表,列表中的每个值又是字典,title是url编码后的中文,FilePathe就是图片路径。

 

返回后的json串通过js的处理后拼接,再放入到前面那个页面的div里面,做到滚动显示。

 

其实基本的玩法也就是这样,嗯,我还被前辈批实战经验不足,确实要多搞搞才行。

 

python代码:

 

 
  1. #!/usr/bin/env python

  2. # -*- coding: utf-8 -*-

  3. # @Author: iaiti

  4. # @Date: 2015-11-18 10:41:10

  5. # @Last Modified by: Administrator

  6. # @Last Modified time: 2015-11-19 14:55:01

  7.  
  8. import re

  9. import requests

  10. import sys

  11. import json

  12. from urllib import unquote

  13.  
  14. reload(sys)

  15. sys.setdefaultencoding('utf-8')

  16.  
  17. #获取到匹配字符的字符串

  18. def find(pattern,test):

  19. finder = re.search(pattern, test)

  20. start = finder.start()

  21. end = finder.end()

  22. return test[start:end-1]

  23.  
  24. #大图的网址为r0 小图为p0

  25. picturepath = 'http://zonepic.quanjing.com/photo/r0/'

  26.  
  27.  
  28. #循环发送ajax请求 捉取大量图片

  29. # for x in xrange(100,200):

  30.  
  31. #ajax采用post请求,通过抓包可以看出具体请求的参数

  32. #http://zone.quanjing.com/share/design/ post参数为此url下下拉加载ajax请求所需要的参数

  33. formdata = {'pageindex':'','pagesize':'25','keywords':'','arttype':'7','isgame':''}

  34.  
  35. #批量获取时,pageindex

  36. #formdata['pageindex'] = x

  37. formdata['pageindex'] = 2

  38. #模拟post请求

  39. circle = requests.post("http://zone.quanjing.com/share/ashx/WaterFallShowAsync.ashx",data=formdata)

  40.  
  41. #匹配后缀为jpg和png的链接

  42. pattern = "(http:[^\s]*?(jpg|png))"

  43. finder = re.findall(pattern, circle.text)

  44.  
  45. # 字典里面TableInfo的值是列表,列表中的每个值又是字典,title是url编码后的中文,FilePathe就是图片路径

  46. # { "TableInfo":[ { "id":"1123130","FilePath":"141118-121609-fVwIzH.jpg","userid":"974767",

  47. # "title":"%e4%b8%8d%e8%8a%b1%e9%92%b1%e7%b3%bb%e5%88%97%e6%b5%b7%e6%8a%a5",

  48. # "Height":"255","UserName":"广州合丰","headpic":"default.jpg"},

  49. # { "id":"1123129","FilePath":"141118-121233-LxISqc.jpg","userid":"974767",

  50. # "title":"%e5%8d%93%e8%b6%8a%e6%b2%83%e6%9c%8d%e5%8a%a1%e7%b3%bb%e5%88%97%e6%b5%b7%e6%8a%a5",

  51. # "Height":"1374","UserName":"广州合丰","headpic":"default.jpg"}]}

  52. print circle.text

  53.  
  54. #json串转字典,获取TableInfo的值

  55. mydict = json.loads(circle.text)

  56. tablekey = mydict['TableInfo']

  57. #print tablekey

  58.  
  59. #由于http://zonepic.quanjing.com/photo/p0/151112/151112-040832-zxe6fZ.jpg p0后面的

  60. #文件夹命名为图片前面的数字命名,所以匹配此字符串

  61. secondfile = '.*?-'

  62. print len(tablekey)

  63.  
  64. #遍历列表

  65. for keyarray in tablekey:

  66. print str(keyarray['title'])

  67. #中文title的url解码

  68. imgfilename =unquote(str(keyarray['title'])).decode('utf8')

  69.  
  70. #由于要把标题当做文件名,但是文件名不能包含*<>/\:这些特殊字符

  71. imgfilename =imgfilename.replace('>', '').replace('*', '').replace('<', '').replace('/', '').replace(':', '').replace('\\', '').replace('|', '')

  72. imgnametemp = "G:/github/WebSpider_Python/img/"+imgfilename+".jpg"

  73. print imgfilename

  74. filepath = keyarray['FilePath']

  75. print filepath

  76. print picturepath+find(secondfile,keyarray['FilePath'])+'/'+keyarray['FilePath']

  77. #requests请求图片地址

  78. newimg = requests.get(picturepath+find(secondfile,keyarray['FilePath'])+'/'+keyarray['FilePath'])

  79. with open(imgnametemp,'wb') as newfile:

  80. #获取图片内容并往磁盘写入,命名为匹配的中文title名加上后缀

  81. newfile.write(newimg.content)

  82.  

 

这样,我跟我同事完美地交了差,同时吐槽他这网站很多图片没有标题。

上面的代码有些写得不符合规范,也没有用到多线程去捉取,解析html也没有用Beautiful soup这些。后面慢慢补上。

 

方便大家探讨学习,欢迎加q裙 467604262,python学习资料领取,直播课程链接都有的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_837025.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片上传使用post_关于规范上传及使用网站图片的通知

由于各委员会在发布文章时没有按规定上传并使用图片&#xff0c;导致上传的图片得不到重复的利用&#xff0c;使工作效率不高&#xff0c;并浪费协会官方平台流量的问题&#xff0c;特发布本通知。请所有工作团队成员在发布新闻时按本通知要求执行。一、上传图片前要求图片在上…

html中怎么写导航栏线框,用CSS美化网站 -- 导航栏和输入框

在上一次用HTML做了一个简单的网站之后&#xff0c;小编决定用CSS来优化网站的结构并且**增添导航栏和输入框最终效果页面修改版大家可以看到在网页的左上方&#xff0c;新增加了导航栏&#xff0c;网页的左下方新增加了输入框。我们将一步一步说明这是如何实现的。导航栏CSS定…

网站云服务器清理,云服务器内存怎么清理

云服务器内存怎么清理 内容精选换一换您可以通过本节内容解决如下问题&#xff1a;用户在管理控制台执行弹性云服务器相关操作后出现异常&#xff0c;针对管理控制台提示的异常信息&#xff0c;应该如何处理&#xff1f;用户参见《弹性云服务器接口参考》调用云服务器相关的API…

网站全局变黑白灰!只需一行代码!

全国性哀悼&#xff0c;很多网站都变为灰色。 到底怎么设置的&#xff1f; 在CSS样式中添加 html {filter: grayscale(100%); } 网上很多资料都是下面这样设置的 html {filter: gray;filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale1);filter: grayscale…

VS“新建网站”与“新建Asp.Net Web 应用程序”的区别

新建网站有两种方法。 1.原来一直用的是直接新建---网站 然后添加后解决方案的项目名称是路径的名称 2.还有一种是新建--项目&#xff0c;然后选web--新建asp.net.web 项目名称是&#xff1a; 新建网站与新建Asp.Net Web 应用程序的区别&#xff1a;VS2010打sp1后&#xff0c;在…

Excel通过网站页面导入数据

选择来自XML数据导入 之后将XML文件改成所有文件就可以看到有.htm的文件&#xff0c;将htm文件打开 在一个HTML页面中选择好表格&#xff0c;之后点击确认&#xff0c;就可以将网页的表格导入Excel

搭建网站速成(1)—hello koa2

强烈安利廖雪峰老师的 koa - 廖雪峰的官方网站 (liaoxuefeng.com) 1.简单的koa2代码 -1.hello koa代码 const Koa require(koa);const app new Koa();app.use(async (ctx, next) > {await next();ctx.response.body "hello koa"; });app.listen(8000); cons…

python爬虫自学网站_Python爬虫学习——获取网页

通过GET请求获取返回的网页&#xff0c;其中加入了User-agent信息&#xff0c;不然会抛出"HTTP Error 403: Forbidden"异常&#xff0c;因为有些网站为了防止这种没有User-agent信息的访问&#xff0c;会验证请求信息中的UserAgent(它的信息包括硬件平台、系统软件、…

搜索引擎更容易识别html,什么样的网站更容易被百度搜索引擎抓取?

搜索引擎友好的网站要具备哪些条件&#xff1f;搜索引擎友好的网站要怎么做呢&#xff1f;要想做好一个让搜索引起喜欢的网站&#xff0c;小编建议你要学会换位思考&#xff0c;从搜索引擎蜘蛛的角度去思考&#xff0c;搜索引擎蜘蛛是如何看待一个网站的页面结构的&#xff1f;…

html怎么转换成app,快速把html、手机网站打包成APP的工具和步骤流程

开心app平台是我们开发的一个打包网站的工具&#xff0c;可以非常方便的把一个手机网站做成APP&#xff0c;也可以直接打包h5代码&#xff0c;免费使用&#xff01;下面介绍使用开心app平台怎么将网站快速打包成APP分七步进行1、注册开心app平台账号2、创建APP、配置基本信息3、…

php网站和asp上传方法,PHP/ASP上传漏洞探究

一、写在前面***这个上传漏洞利用的原理只是针对form格式上传的asp和php脚本***nc(netcat)用于提交数据包dos界面下运行:nc -vv www.***.com 80<1.txt-vv: 回显80: www端口1.txt: 就是你要发送的数据包(更多使用方法请查看本区的帖子)wse(wsockexpert)对本机端口的监视,抓取…

flask专题-小说网站开发一

在比较了诸多python web框架之后&#xff0c;笔者选择选择了flask框架&#xff0c;因为笔者要做推荐系统&#xff0c;收集实验数据&#xff0c;决定开发一个小型网站&#xff0c;收集信息以作后续的推荐系统&#xff0c;对于我来说flask框架完全够用。 网站网址&#xff1a;htt…

flask专题-小说网站开发二(数据准备)

在确定使用flask开发小说网站之后&#xff0c;就要准备数据了&#xff0c;数据是活的灵魂&#xff0c;没有数据就是个空架子&#xff0c;我自己不可能去写小说了&#xff0c;只能从网站采集了&#xff0c;爬虫就是利器&#xff0c;先准备一下小说数据库&#xff0c;以及整个网站…

flask专题-小说网站开发三(注册,登录)

前面几篇准备好了数据库&#xff0c;数据&#xff0c;现在开始往后开发&#xff0c;部分可能与网上他人使用方式不同&#xff0c;本人第一次做&#xff0c;功能都实现了&#xff0c;这一篇开发注册与登录&#xff0c;先贴样式 前端 登录&#xff1a; 注册&#xff1a; 前端样…

flask专题-小说网站开发四(完结)

之前断更了&#xff0c;小说网站改成基于协同过滤的图书推荐系统了&#xff0c;并已经写完&#xff0c;传到gitee了 链接 实现的功能 推荐一块使用协同过滤的思想&#xff0c;计算物品之间的相似度 web框架使用Flask&#xff0c;小说还支持在线看的 主要功能截图 用户基本模…

帝国CMS7.5开发的小说源码自适应网站源码

全网第一版帝国内核CMS7.5开发的小说源码站自适应网站源码 源码介绍 前期没有章节数据 自带采集火车头采集规则 演示地址 演示地址&#xff1a;http://www.txtzn.com

软件工程课程设计-ch小说网站

CH小说网站 [软件开发计划书、需求分析] 作者&#xff1a;陈春旭&#xff0c;习志鹏 目录 1&#xff0e;引言&#xff08;Introduction&#xff09; 4 1.1 背景&#xff08;Background&#xff09; 4 1.2 目的&#xff08;Purpose&#xff09; 4 1.3 范围&#xff08;Scope&am…

HBuilderX打包web网站之wap2app设置底部菜单tabBar

上面是真实案例&#xff0c;首页、在看、我的就是我设置的菜单&#xff0c;还可以设置图标&#xff0c;填写图片网络地址就行。 下面是代码&#xff0c;可以直接用&#xff1a; 第一步&#xff0c;先下载2个文件或者复制也行&#xff0c;那就新建吧: 分别新建一个css文件&am…

小说站源码(带自动采集开源小说网站源码)

小说网站源码是一套文本自动聚合搜索和展示构建系统&#xff0c;设计用于编写由许多较小的文本文档组合而成的小说网站。它使用了受Markdown启发的最小格式语法&#xff0c;并添加了用于注释、概要和交叉引用的元数据语法。它被设计成一个简单的文本编辑器&#xff0c;允许轻松…

SpringBoot+ Mybatis 开发一个读书网站

项目描述 本项目为javaweb课程设计作业&#xff0c;开发了一个类似于豆瓣读书的书友交流网站。 效果图 项目结构 mapper和pojo可以用generator自动生成&#xff0c;我们只需编写controller就可以了 贴一个userController的代码&#xff0c;其他的都大同小异 package com.te…