爬虫python下载网站所有图片_[记录][python]python爬虫,下载某图片网站的所有图集...

news/2024/5/8 20:19:45/文章来源:https://blog.csdn.net/weixin_39864387/article/details/110084316

随笔仅用于学习交流,转载时请注明出处,http://www.cnblogs.com/CaDevil/p/5958770.html

该随笔是记录我的第一个python程序,一个爬去指定图片站点的所有图集,现在还是一个非常简陋的单线程程序。下一步是改写成多线程,虽然python多线程被诋毁得一塌糊涂。同时加上异常处理。

近来练习python程序,仿照别人的爬虫写一个自己的爬虫来练练手。在编写的过程中遇到各种问题,中文编码、请求不到html等问题。撰写该随笔的目的是将所遇到的问题记录下来,并提供相应的解决方法。当然这些解决方法是参照其他人提供的,东抄抄西抄抄,^_^。

先大致描述下代码过程中遇到的问题: 随笔仅用于学习交流,转载时请注明出处,http://www.cnblogs.com/CaDevil/p/5958770.html

html中文解码

虽然beautifulsoup默认的编码方式是utf-8,而且国内部分站点的编码方式是utf-8。还是需要手工设置一下中文的编码方式。

在BeautifulSoup中手工设置编码方式如下所示

encoding = "gb18030"soup= BeautifulSoup(html,from_encoding=encoding)

list的append和extend使用 随笔仅用于学习交流,转载时请注明出处,http://www.cnblogs.com/CaDevil/p/5958770.html

查询相关资料,list中的append是向list插入一个值,extend则是将一个list插入另一个list中;

若要将list1并入list2中,则使用list2.extend(list1);

若向list中插入值的话,使用list.append(vale)

beautifulsoup返回的值,可以直接查找符合条件的节点

beautifulsoup返回的值是一颗语法树,结果与html dom结构差不多[这个地方有些保留,我目前不是太了解dom结构],通过find和find_all去查找相应的标签。前者返回一个标签的对象,后者返回list,该list的值是多个对象。

将urllib.urlretrieve()尽量伪装成一个用户。

使用 urlretrieve之前,将发送的http请求做些简单的伪装,尽量伪装成为一个用户,避免站点不响应下载请求。若不设置的话,通过wireshark,可以查看到下载请求的user-agent的值与python有关,服务器可能会将下载请求给忽略掉。同时还可以添加上referer,有些站点通过referer来判断盗链。若不设置的话,下载的图片全是防盗链提示图片。 随笔仅用于学习交流,转载时请注明出处,http://www.cnblogs.com/CaDevil/p/5958770.html

#伪装一下下载的http请求,否则有些站点不响应下载请求。

#不设置的话,下载请求中的user-agent为python+版本号

urllib.URLopener.version = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0'

#下载图片到指定目录中,保留图片在服务器上的文件名

urllib.urlretrieve(imgurl,downloadpath)

废话有些多,上代码。为了避免宣传图片站点的嫌疑,不放该站点的链接。 代码仅用于学习交流。

ContractedBlock.gif

ExpandedBlockStart.gif

importurllib2importioimportrandomimporturllibfrom bs4 importBeautifulSoupimportreimportosimportsys

reload(sys)

sys.setdefaultencoding('utf8')defgetHtml(url):#尽可能让爬虫显示为一个正常用户。若不设置,则发送的请求中,user-agent显示为Python+版本

user_agent =['Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30','Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)','Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.9.168 Version/11.50','Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)']#设置网页编码格式,解码获取到的中文字符

encoding = "gb18030"

#构造http请求头,设置user-agent

header = {"User-Agent":random.choice(user_agent)}#构造发送请求

request = urllib2.Request(url,headers=header)#发送请求,获取服务器响应回来的html页面

html =urllib2.urlopen(request).read()#使用beautifulSoup处理的html页面,类似dom

soup = BeautifulSoup(html,from_encoding=encoding)returnsoup#获取整个站点所有图集的页码

defgetPageNum(url):

soup=getHtml(url)#直接在站点首页获取所有图集的总页码

nums=soup.find_all('a',class_='page-numbers')#除掉“下一页”的链接,并获取到最后一页

totlePage = int(nums[-2].text)returntotlePage#获取指定页面下图集名称和链接

defgetPicNameandLink(url):

soup=getHtml(url)

meun=[]#类似html dom对象,直接查找id为“pins”的ul标签,返回的结果是一个dom对象

targetul = soup.find("ul",id="pins")iftargetul:#获取该ul下所有的超链接,返回值的类型是list,find_all中第二个参数表示某个指定标签的属性

pic_list = targetul.find_all("a",target="_blank")ifpic_list:#遍历所有指定的标签a

for pic inpic_list:#获取图集的链接

link = pic["href"]

picturename= ""

#找到标签a中,“class”为“lazy”的img标签。

#find中,第二个参数表示某个指定标签的属性。

#在python中class是保留字,所有标签的class属性的名称为“class_”

img = pic.find("img",class_='lazy')ifimg:#保证中文字符能够正常转码。

picturename = unicode(str(img["alt"]))else:continue

#插入图集名称和对应的url

meun.append([picturename,link])returnmeunreturnNone#function获取所有的图集名称

defgetallAltls(url):

totalpage=getPageNum(url)#获取首页中所有的图集名称。首页的url和其他页面不同,没有page

meun =getPicNameandLink(url)#循环遍历所有的图集页面,获取图集名称和链接

for pos in range(2,totalpage):

currenturl= url + "/page/" +str(pos)#getPicNameandLink()返回的值是一个list。

#当一个list插入到另一个list中时,使用extend。

#若是插入一个值时,可以用append

meun.extend(getPicNameandLink(currenturl))returnmeun#获取从首页到指定页面所有的图集名称和链接

defgetparAltls(url,page):

meun=getPicNameandLink(url)for pos in range(2,page):

currenturl= url + "/page/" +str(pos)

meun.extend(getPicNameandLink(currenturl))returnmeun#获取单个相册内图片页码

defgetSinglePicNum(url):

soup=getHtml(url)#pagenavi还是一个对象(Tag),可以通过find_all找出指定标签出来

pagenavi = soup.find("div",class_="pagenavi")

pagelink= pagenavi.find_all("a")

num= int(pagelink[-2].text)returnnum#下载单个相册中的所有图片

defgetSinglePic(url,path):

totalPageNum=getSinglePicNum(url)#从第一页开始,下载单个图集中所有的图片

#range()第二个参数是范围值的上限,循环时不包括该值

#需要加1以保证读取到所有页面。

for i in range(1,totalPageNum + 1):

currenturl= url + "/" +str(i)

downloadpic(currenturl,path)#下载单个页面中的图片

defdownloadpic(url,path):

soup=getHtml(url)#找出指定图片所在父容器div

pageimg = soup.find("div",class_="main-image")ifpageimg:#找出该div容器中的img,该容器中只有一个img

img = pageimg.find("img")#获取图片的url

imgurl = img["src"]#获取图片的文件名

restring = r'[A-Za-z0-9]+\.jpg'reimgname=re.findall(restring,imgurl)#将图片保存在指定目录下

path =str(path)if path.strip() == "":

downloadpath=reimgname[0]else:

downloadpath= path + "/" +reimgname[0]#伪装一下下载的http请求,否则有些站点不响应下载请求。

#不设置的话,下载请求中的user-agent为python+版本号

urllib.URLopener.version = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0'

#下载图片到指定目录中,保留图片在服务器上的文件名

urllib.urlretrieve(imgurl,downloadpath)def downimgofsite(url,path = ""):

path=str(path)#获取所有图集的名称和链接

meun_list =getallAltls(url)

directorypath= ""

for meun inmeun_list:

directoryname=meun[0]if path.strip() != "":

directorypath= path + "/" +directorynameelse:

directorypath= os.getcwd + "/" +directorynameif notos.path.exists(directorypath):

os.makedirs(directorypath)

getSinglePic(meun[1], directorypath)if __name__ == "__main__":#page = 8

url = "XXXXX"menu=getallAltls(url)#menu = getparAltls(url, page)

f= open("tsts.txt","a")for i inmenu:

f.write(str(unicode(i[0]))+"\t"+str(i[1])+"\n")

f.close()

View Code

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

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

相关文章

服务器打不开centos系统,u盘装centos无法进入系统怎么办?_网站服务器运行维护,centos...

win10任务栏没有网络图标怎么办_网站服务器运行维护win10任务栏没有网络图标的解决方法是:1、点击windows图标,接着点击【设置】;2、进入系统设置,找到【通知和操作】;3、点击【选择在任务栏上显示哪些图标】&#xff…

go 根据输入类型执行对应的方法_从0开始Go语言-用Golang搭建网站(无依赖)

实践是最好的学习方式-零基础通过开发Web服务学习Go语言本文适合有一定编程基础,但是没有Go语言基础的同学。也就是俗称的“骗你”学Go语言系列。这是一个适合阅读的系列,我希望您能够在车上、厕所、餐厅都阅读它,涉及代码的部分也是精简而实…

php做seo优化,php做seo优化能力有哪些

现在百度搜索引擎的快速发展,希望在某些百度搜索引擎中网站页面关键字有一个不错排名,php做seo优化变得格外重要,php做seo优化能力有哪些?大家都掌握php做seo优化知识了吗?废话说完了步入主题长沙搜遇网络给我们大家谈…

.php后缀的url_网站运营必看干货——URL优化技巧分享

大家在做网站优化时除了要优化tkd之外,url的优化也是非常重要的,网站url的结构将会直接关系到百度蜘蛛对网站的抓取,今天小编整理归纳了一些优化技巧,希望能帮助到大家。一、网站URL的类型1) 动态url顾名思义指的是动态页面、动态…

html网站页面上字体改变,如何设置网页字体样式

CSS布局HTML小编今天和大家分享网页的字体样式,这个只要平时最普通,最常用,最实用的网页字体样式font-family:Microsoft YaHei。网页字体样式华文黑体:STHeiti网页字体样式华文楷体:STKaiti网页字体样式华文宋体&#…

js映射 nginx_企业级电商网站使用Nginx+Lua(OpenResty)实现高性能Web应用

简介OpenResty是一款基于Nginx的高性能负载均衡服务器容器,简单来说是NginxLua。结合了Lua语言来对Nginx进行扩展,使得在Nginx上具有web容器功能。使得可以使用lua脚本来进行web的开发。有了lua,我们可以借助于nginx的异步非阻塞的功能&#…

电脑服务器系统进入安全模式,win7系统开机按F8键不能进入安全模式怎么办_网站服务器运行维护,win7,F8,安全模式...

win10系统关机后仍然耗电怎么办_网站服务器运行维护win10系统关机后仍然耗电的解决方法:1、首先打开电源选项;2、然后依次点击【选择电源按钮的功能】、【更改当前不可用的设置】;3、最后取消勾选【启用快速启动】选项。解决方法:…

网站同时出现网站内容和html源码是什么原因_十分钟小白就能搭建好一个属于自己的个人网站...

很多人觉得搭建一个网站很难,因为自己不懂代码,在这里教你不需要懂代码也能搭建一个属于自己的网站搭建一个网站必备2条件1.服务器2.域名简单的来说服务器就是跟你个人的电脑一样,只不过是用来做访问服务的那么服务器能搭建网站, 个人电脑也是可以的, 无论是服务器还是个人电脑…

可以发外链的网站_到哪里发外链比较好

不管是软文外链,还是网站的外链,或者是网页的外链,增加外链的目的就好像是你开了一个店,需要不断的去做广告别人才能知道在这个地方你开了一个店,你的店里卖什么东西?对于开店而言,你所做的广告…

仿小蚂蚁门户网站 php,仿小蚂蚁大气地方门户模版Discuz! X2.5

下面我们对仿小蚂蚁大气地方门户模版Discuz! X2.5文件阐述相关使用资料和仿小蚂蚁大气地方门户模版Discuz! X2.5文件的更新信息。仿小蚂蚁大气地方门户模版Discuz! X2.51. 基本文件说明:template (风格文件)、fgoo_static(风格需要的图片和JS文件)、PSD分层文件、fg…

网站信息泄漏防护篇

网站信息泄漏防护篇simeon每天您是否收到数封垃圾邮件,每天您是否接到无数“骚扰”电话,每天您是否会收到数条垃圾短信,也许三个也许中都是肯定,这一切毫无例外都会耗费您生命中的时间,可是您是否曾经深入思考过为什么…

12个网站帮你制作个性化的卡通形象

从QQ秀的流行程度我们可以看出国内网友对卡通形象的热爱.我们在大部分可以自定义个人资料的网站上一般不会上传真实的图片,一个独具个性的卡通形象也许会更加具有吸引力.我之前介绍过一个新兴的网站Befunky,从索要邀请的人数来看,这的确是一个非常有人气的服务.下面介绍的11个卡…

UML辅助网站规划和设计指南/1

概述 Web网站往往具有复杂与高度动态的特点。为了让Web应用在短时间之内开始运作,开发周期应该尽量地短。许多时候,开发者直接进入编写代码这一阶段,却不去仔细考虑自己想要构造的是什么样的网站以及准备如何构造:服务器端代码往往…

网站优化的几个方面

充分利用网页标题这适用于网页本身的主标题,也适用于浏览器标题栏中出现的标题。无论何时,要尽可能确保每一张网页都带有独一无二、可描述网页特征的标题。举例说明,如果您的网站是"Buffy 沙发商店",访问者或许希望将您…

在浏览器中输入网站域名并按下回车的详细过程

主要有以下几个部分: 1 DNS解析,获取Web服务器IP 2 建立TCP连接 3 向Web服务器发送HTTP请求 4 Web服务器收到请求并处理 5 Web服务器返回响应 6 浏览器对响应解码,并显示数据 7 页面显示完成后,浏览器发送异步请求 8 关闭TCP连接 …

【web标准设计】学习、提高、欣赏网站推荐

警告文章包含的一些粗俗、庸俗、恶心的言语可能造成您阅读后的不适感,请谨慎选择是否阅读。如你自愿阅读本文,因粗俗、庸俗、恶心的言语给您所造成的任何后果,本文作者不负任何责任。 华丽的中指基础知识的学习 XHTML、CSS、JavaScript的基础…

30个让人兴奋的视差滚动(Parallax Scrolling)效果网站

视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验。作为今年网页设计的热点趋势,越来越多的网站应用了这项技术。今天这篇文章就与大家分享30个视差滚动效果的…

向网页设计师推荐15个很棒的网站

网络上各种各样的社区网站数不胜数,但专注于创意设计的很少。今天这篇文章收集了15个非常好的专注于设计的网站推荐给设计师们,不管是学习先进的设计理念,还是寻找免费资源与工具,这些网站都是很不错的去处,记得推荐和…

【转载】Asp.Net MVC3网站并成功的连接了MongoDB

http://www.cnblogs.com/leo_wl/archive/2012/02/10/2345890.html 我们已经创建了一个简单的Asp.Net MVC3网站并成功的连接了MongoDB。但只实现了创建和显示的功能。本回实现了完整的增删改查。 创建的部分,上次的代码中存在一些错误,造成了每个属性都会…

关于window2003服务器网站访问缓慢!

2019独角兽企业重金招聘Python工程师标准>>> 最近几天发现网站访问缓慢,有时会出现超时,检查后发现没有受到攻击,ping tracert 都很正常,最好发现需要磁盘整理,经过整理后正常了,待观察!!!!!!!! 转载于:https://my.oschina.net/yangalbert/blog/64684