Python爬虫——爬取网站的图片

news/2024/5/13 6:01:43/文章来源:https://iaiti.blog.csdn.net/article/details/49912815

  爬虫这东西最早出现在我大学计算机网络的课程上面,我们当时的老师人很好,期末不笔试,他说这东西笔试没什么用,对于一个年纪比较大的老师来讲,能提出这种方式,实在难得。当时在考虑做一个与网络有关的东西好,第一个想到的就是爬虫。想想也没想过用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的源代码。

<img class="250img" width="250" height="337" title="" alt="" 
showsrc="http://zonepic.quanjing.com/photo/p0/151112/151112-023836-ewvdeb.jpg" src="/image/grey.gif">
</a> </div></center></div>
<div class="favorite"><p class="title" title="跨界创意"><a href="http://www.quanjing.com/share/1160068">跨界创意</a>


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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: iaiti
# @Date:   2015-11-17 15:18:28
# @Last Modified by:   Administrator
# @Last Modified time: 2015-11-19 11:11:37import re
import requests
import sys
#设置编码
reload(sys)
sys.setdefaultencoding('utf-8')
circle = requests.get("http://zone.quanjing.com/share/design/")
#text和content的内容有不同
ccontent =  circle.text
#这里是正则的坑  括号的东西是分组的 外面没有括号之前 只会匹配到jpg和png不会匹配全部
#外面多一层括号才会匹配整个  但是特别的是 里面的括号也会匹配  所以
#真正findall的是整个list  list里面每个都是元组  元组里面有xxx.jpg和jpg
pattern = "(http:[^\s]*?(jpg|png|PNG|JPG))"
finder = re.findall(pattern, circle.text)#匹配到之后获取匹配开头和末尾位置
# finder = re.search(pattern, test)
# start = finder.start()
# end = finder.end()
# print test[start:end]
#匹配http 获取文件名
truepicture = ".*photo/p0.*"
#匹配图片网址
picpattern = "http:[^\s]*/"
#匹配标题
titlepattern = '<p class="title" title=".*?"'
imgfinder = re.findall(titlepattern, circle.text)
imglen = 0
for n in xrange(0,len(finder)):if re.match(truepicture, finder[n][0]):print finder[n][0]#p0改为r0后变成了大图目录的地址,bigpicture = finder[n][0].replace('photo/p0','photo/r0')newimg = requests.get(bigpicture)#替换掉无关的字符串temp = imgfinder[imglen].replace('<p class="title" title="','')newfinder = re.search(picpattern, finder[n][0])#截取titletemp = "G:/github/WebSpider_Python/img/"+temp[0:len(temp)-1]+'.jpg'#下载文件,超级简单 设定好目录  content的意义也在于这里 with open(temp,'wb') as newfile:newfile.write(newimg.content)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代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: iaiti
# @Date:   2015-11-18 10:41:10
# @Last Modified by:   Administrator
# @Last Modified time: 2015-11-19 14:55:01import re
import requests
import sys
import json
from urllib import unquotereload(sys)
sys.setdefaultencoding('utf-8')#获取到匹配字符的字符串
def find(pattern,test):finder = re.search(pattern, test)start = finder.start()end = finder.end()return test[start:end-1]#大图的网址为r0 小图为p0
picturepath = 'http://zonepic.quanjing.com/photo/r0/'#循环发送ajax请求 捉取大量图片
# for x in xrange(100,200):#ajax采用post请求,通过抓包可以看出具体请求的参数
#http://zone.quanjing.com/share/design/  post参数为此url下下拉加载ajax请求所需要的参数
formdata = {'pageindex':'','pagesize':'25','keywords':'','arttype':'7','isgame':''}#批量获取时,pageindex
#formdata['pageindex'] = x
formdata['pageindex'] = 2
#模拟post请求
circle = requests.post("http://zone.quanjing.com/share/ashx/WaterFallShowAsync.ashx",data=formdata)#匹配后缀为jpg和png的链接
pattern = "(http:[^\s]*?(jpg|png))"
finder = re.findall(pattern, circle.text)# 字典里面TableInfo的值是列表,列表中的每个值又是字典,title是url编码后的中文,FilePathe就是图片路径
# { "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"}]}
print circle.text#json串转字典,获取TableInfo的值
mydict = json.loads(circle.text)
tablekey  = mydict['TableInfo']
#print tablekey#由于http://zonepic.quanjing.com/photo/p0/151112/151112-040832-zxe6fZ.jpg   p0后面的
#文件夹命名为图片前面的数字命名,所以匹配此字符串
secondfile = '.*?-'
print len(tablekey)#遍历列表
for keyarray in tablekey:print str(keyarray['title'])#中文title的url解码imgfilename =unquote(str(keyarray['title'])).decode('utf8')#由于要把标题当做文件名,但是文件名不能包含*<>/\:这些特殊字符imgfilename =imgfilename.replace('>', '').replace('*', '').replace('<', '').replace('/', '').replace(':', '').replace('\\', '').replace('|', '')imgnametemp = "G:/github/WebSpider_Python/img/"+imgfilename+".jpg"print imgfilenamefilepath = keyarray['FilePath']print filepathprint picturepath+find(secondfile,keyarray['FilePath'])+'/'+keyarray['FilePath']#requests请求图片地址 newimg = requests.get(picturepath+find(secondfile,keyarray['FilePath'])+'/'+keyarray['FilePath'])with open(imgnametemp,'wb') as newfile:#获取图片内容并往磁盘写入,命名为匹配的中文title名加上后缀newfile.write(newimg.content)

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

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

这个东西写完之后,找回了很多东西。

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

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

相关文章

谈谈建站心得(转载)[精华]

从事互联网行业已经7年了&#xff0c;有一些感悟在脑中盘旋。经历了很多教训以及狂热&#xff0c;工作与生活给了我一些教训与心得&#xff0c;遇到一事情时&#xff0c;经常有一种似曾相识的感觉&#xff0c;但真要说出所以然&#xff0c;似无法将他们高度概括。七年了&#x…

网站smtp服务器,SMTP服务器

认识SMTP服务器首先要知道SMTP&#xff0c;SMTP是“SimpleMailTransferProtocol”的缩写&#xff0c;即简单电子邮件传输协议&#xff0c;而SMTP服务器就是遵循SMTP协议发送电子邮件的服务器&#xff0c;用来发送或中转用户发出的电子邮件。SMTP协议是一个相对简单、高效的文本…

如何用自己电脑做服务器,绑定域名建一个个人网站

如何用自己电脑做服务器&#xff0c;绑定域名建一个个人网站 一、总结 一句话总结&#xff1a;搜索phpstudy 只有公网ip没有域名如何访问网站 二、如何用自己电脑做服务器&#xff0c;绑定域名建一个个人网站 使用自己的电脑&#xff0c;下载一个tomcat服务器&#xff0c;并将域…

YSlow-开源firefox插件,用来进行网站优化,有明确的提示为什么这么做

1、yslow介绍 什么是YSlow&#xff1f; YSlow是Yahoo发布的一款基于FireFox的插件。   YSlow有什么用&#xff1f;   YSlow可以对网站的页面进行分析&#xff0c;并告诉你为了提高网站性能&#xff0c;如何基于某些规则而进行优化。   YSlow可以分析任何网站&#xff0c;…

征婚网站php免费源码,php交友网站系统正式版php征婚网站模板

后台管理文件夹&#xff1a;http://jyadmin.wrzc.net/&#xff0c;管理员帐号:admin&#xff0c;密码:admin运行本程序&#xff0c;需要你的主机或者虚拟主机配置有phpmysqlzend optimizer的系统运行环境。本机调试可以自己配置系统运行环境&#xff0c;配置教程请下载PHP环境一…

windows 2008下IIS7发布网站失败

在WINDOWS2008下&#xff0c;用IIS7发布好网站后&#xff0c;却浏览不了&#xff0c;提示“对不起&#xff0c;您访问的空间不存在” 在已绑定IP 地址的情况下&#xff0c;同时绑定了一个域名abc.com。每次访问时&#xff0c;IE都是在外网寻找abc.com该域名&#xff0c;然后就显…

使用Github的 WebHooks 进行网站自动化部署

原理 利用Github在仓库进行操作时&#xff0c;可以通过配置webhook向服务器发送请求&#xff0c;在服务器端接到请求后&#xff0c;使用脚本来自动进行git pull操作。 图片来源&#xff1a;Github的webhook触发vps上的脚本 构建 Webhook 服务 通过执行 npm i -g github-webhook…

nginx详解反向代理、负载均衡、LNMP架构上线动态网站(week4_day1_part1)-技术流ken

nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx&#xff0c;它的发音为“engine X”&#xff0c;是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开…

java多方式登陆_Java 爬虫遇到需要登录的网站,该怎么办?

这是 Java 网络爬虫系列博文的第二篇&#xff0c;在上一篇Java 网络爬虫&#xff0c;就是这么的简单中&#xff0c;我们简单的学习了一下如何利用 Java 进行网络爬虫。在这一篇中我们将简单的聊一聊在网络爬虫时&#xff0c;遇到需要登录的网站&#xff0c;我们该怎么办&#x…

200佳优秀的国外创意设计作品网站推荐(系列十七)

这个系列将向大家200佳非常有用的创意设计作品网站&#xff0c;包括网页设计、名片设计、LOGO设计和包装设计等等&#xff0c;设计师们可通过这些网站收集的优秀设计作品来获取灵感&#xff0c;进而设计出更具有创意的作品&#xff0c;设计师们也可以把自己得意的作品提交到这些…

网站App平台注册用户分析(从MySQL中导入数据)

导入MySQL数据 运行MySQL&#xff0c;输入密码登录进去&#xff0c;然后使用CREATE DATABASE命令创建数据库。 CREATE DATABASE test;&#xff08;该命令创建了一个空的数据库test&#xff09; 2.导入数据到刚刚创建的空数据库中。 source D:/user.sql(此处source后面的文件路…

python爬虫爬取某网站全站图片案列(源码全给可白漂,仅供学习使用,切勿用作非法用途)

爬取后保存的图片效果图 步骤入下&#xff08;三步&#xff09;&#xff1a; 先去要爬取的目标网站&#xff08;https://pixabay.com/&#xff09;去注册一个账号。 2.注册后登录&#xff0c;浏览器右键鼠标&#xff0c;打开检查&#xff0c;找到登录后的cookies值。 3.运行源…

9月第2周国内新闻网站:中国网覆盖数半年翻4番

根据国际统计机构Alexa公布的最新数据显示&#xff0c;9月第2周&#xff08;2013-09-09至2013-09-15&#xff09;新闻类网站/频道排行首位是QQ新闻&#xff0c;其用户覆盖数为13200&#xff0c;第二位是覆盖数为9920的新浪新闻&#xff0c;第三位是9287的网易新闻。下面是具体情…

25个最新的免费的创意和美丽的CSS网站模板

对于HTML或超文本标记语言的理解&#xff0c;是Internet Explorer或Mozilla Firefox网页浏览器所使用的编码语言。所有的网页设计使用这种语言。HTML是网页设计当中一些简单的标记元素&#xff0c;但如果你想要展现出更好看的东西&#xff0c;那么你应该选择CSS。可以说&#x…

什么是闭包(Groovy) - flyleave - ITeye技术网站

什么是闭包(Groovy) - flyleave - ITeye技术网站什么是闭包(Groovy) 博客分类&#xff1a;Grails & GroovyGroovyJavaCCC# Groovy的闭包就像一个代码段或者说方法指针。它是一段被定义并在稍后的时点上运行的代码。Simple ExampleJava代码 def clos { println "hell…

大型网站技术架构(二)架构模式

2019独角兽企业重金招聘Python工程师标准>>> 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样&#xff0c;你就能一次又一次地使用该方案而不必做重复工作。 所谓网站架构模式即为了解决大型网站面临的高并发访问、海量数据、高可靠…

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书&#xff0c;就应该有所收获&#xff0c;有所总结&#xff0c;最近把《大型网站技术架构》一书给看完了&#xff0c;给人的印象实在深刻&#xff0c;再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…

大型网站系统架构分析[转]

千万级的注册用户&#xff0c;千万级的帖子&#xff0c;nTB级的附件&#xff0c;还有巨大的日访问量&#xff0c;大型网站采用什么系统架构保证性能和稳定性&#xff1f; 首先讨论一下大型网站需要注意和考虑的问题。 数据库海量数据处理&#xff1a;负载量不大的情况下select、…

SEO完全手册之title优化

在我的博客发布了《花钱最少的推广方式之SEO》文章后&#xff0c;受到了很多看官的关注&#xff0c;再次万分感谢大家&#xff01;从今天开始&#xff0c;我会每天更新一篇SEO优化的东西&#xff0c;也希望大家喜欢。在这里&#xff0c;我就不阐明搜索引擎工作的原理了&#xf…

从graphis链接到我的网站?

今天早上登陆Google分析&#xff0c;发现昨天的网站点击来源里居然有这么一项……有没有人能解释一下这是为什么&#xff1f;