python爬取网页图片
㈠ 一个爬取wallhaven图片的爬虫
暑假在家闲来无事,自学了一番python编程,花上几天时间,亲手制作了一个爬虫。
具体实现上,这个爬虫的核心是使用了三个主要函数:mainControl、GetHtmlPack 和 downLoad。它们分别负责控制程序流程、解析网页内容以及下载图片。
起始步骤,从wallhaven.cc网站入手,查看链接结构,注意到搜索关键词后跟在q后面,每翻一页,page参数后跟着页数。
由此构建出特定链接格式,进一步深入观察图片链接,发现href为'https://wallhaven.cc/w/{}'。但该链接并非最终图像地址。深入剖析,得知最终图像链接由'https://w.wallhaven.cc/full/{图片id前两位}/wallhaven-{图片id}'加上png或jpg组成。
因此,首先通过'https://wallhaven.cc/search?q={}&page={}'进行链接解析,利用BeautifulSoup的find_all方法检索所有包含a标签的html文本,并设置attrs参数筛选条件。利用re.compile生成Pattern对象匹配所需图片id,遍历所有链接并进行解析。
使用downLoad函数解析出最终图片链接并完成下载,同时,通过checkHttps函数判断文件后缀,确保下载的图片格式正确。
编写完成的爬虫颇有成就感,但尚有改进空间,例如多线程下载功能等。尝试制作爬虫,不仅能够学习编程技能,还能获得实际应用的成就感。
㈡ python爬图片最多可以下载多少张(利用Python批量爬取网页图片)
导读:本篇文章首席CTO笔记来给大家介绍有关python爬图片最多可以下载多少张的相关内容,希望对大家有所帮助,一起来看看吧。
python:爬图并下载到本地指定文件夹(爬图片简易版)
环境:python3IDLE
(ps:其他网站注意图片懒加载与分页等问题)
python多线程作用总结起来,使用多线程编程具有如下几个优点:
进程之间不能共享内存,但线程之间共享内存非常容易。
操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。因此,使用多线程来实现多任务并发执行比使用多进程的效率高。
Python语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了Python的多线程编程。
在实际应用中,多线程是非常有用的。比如一个浏览器必须能同时下载多张图片;一个Web服务器必须能同时响应多个用户请求;图形用户界面(GUI)应用也需要启动单独的线程,从主机环境中收集用户界面事件……总之,多线程在实际编程中的应用是非常广泛的。
怎样用python爬新浪微博大V所有数据
我是个微博重度用户,工作学习之余喜欢刷刷timeline看看有什么新鲜事发生,也因此认识了不少高质量的原创大V,有分享技术资料的,比如好东西传送门;有时不时给你一点人生经验的,比如石康;有高产的段子手,比如银教授;有黄图黄段子小能手,比如阿良哥哥?木木萝希木?初犬饼…
好吧,我承认,爬黄图黄段子才是我的真实目的,前三个是掩人耳目的…(捂脸,跑开)
另外说点题外话,我一开始想使用SinaWeiboAPI来获取微博内容,但后来发现新浪微博的API限制实在太多,大家感受一下:
只能获取当前授权的用户(就是自己),而且只能返回最新的5条,WTF!
所以果断放弃掉这条路,改为‘生爬’,因为PC端的微博是Ajax的动态加载,爬取起来有些困难,我果断知难而退,改为对移动端的微博进行爬取,因为移动端的微博可以通过分页爬取的方式来一次性爬取所有微博内容,这样工作就简化了不少。
最后实现的功能:
输入要爬取的微博用户的user_id,获得该用户的所有微博
文字内容保存到以%user_id命名文本文件中,所有高清原图保存在weibo_image文件夹中
具体操作:
首先我们要获得自己的cookie,这里只说chrome的获取方法。
用chrome打开新浪微博移动端
option+command+i调出开发者工具
点开Network,将Preservelog选项选中
输入账号密码,登录新浪微博
找到m.weibo.cn-Headers-Cookie,把cookie复制到代码中的#yourcookie处
cookie
然后再获取你想爬取的用户的user_id,这个我不用多说啥了吧,点开用户主页,地址栏里面那个号码就是user_id
将python代码保存到weibo_spider.py文件中
定位到当前目录下后,命令行执行pythonweibo_spider.pyuser_id
当然如果你忘记在后面加user_id,执行的时候命令行也会提示你输入
最后执行结束
iTerm
小问题:在我的测试中,有的时候会出现图片下载失败的问题,具体原因还不是很清楚,可能是网速问题,因为我宿舍的网速实在太不稳定了,当然也有可能是别的问题,所以在程序根目录下面,我还生成了一个userid_imageurls的文本文件,里面存储了爬取的所有图片的下载链接,如果出现大片的图片下载失败,可以将该链接群一股脑导进迅雷等下载工具进行下载。
另外,我的系统是OSXEICapitan10.11.2,Python的版本是2.7,依赖库用sudopipinstallXXXX就可以安装,具体配置问题可以自行stackoverflow,这里就不展开讲了。
下面我就给出实现代码(严肃脸)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
??
#-*-coding:utf8-*-
importre
importstring
importsys
importos
importurllib
importurllib2
frombs4importBeautifulSoup
importrequests
fromlxmlimportetree
reload(sys)
sys.setdefaultencoding('utf-8')
if(len(sys.argv)=2):
user_id=(int)(sys.argv[1])
else:
user_id=(int)(raw_input(u"请输入user_id:"))
cookie={"Cookie":"#yourcookie"}
url='d?filter=1page=1'%user_id
html=requests.get(url,cookies=cookie).content
selector=etree.HTML(html)
pageNum=(int)(selector.xpath('//input[@name="mp"]')[0].attrib['value'])
result=""
urllist_set=set()
word_count=1
image_count=1
printu'爬虫准备就绪...'
forpageinrange(1,pageNum+1):
#获取lxml页面
url='hu/%d?filter=1page=%d'%(user_id,page)
lxml=requests.get(url,cookies=cookie).content
#文字爬取
selector=etree.HTML(lxml)
content=selector.xpath('//span[@class="ctt"]')
foreachincontent:
text=each.xpath('string(.)')
ifword_count=4:
text="%d:"%(word_count-3)+text+" "
else:
text=text+" "
result=result+text
word_count+=1
#图片爬取
soup=BeautifulSoup(lxml,"lxml")
urllist=soup.find_all('a',href=re.compile(r'^mblog/oripic',re.I))
first=0
forimgurlinurllist:
urllist_set.add(requests.get(imgurl['href'],cookies=cookie).url)
image_count+=1
fo=open("/Users/Personals/%s"%user_id,"wb")
fo.write(result)
word_path=os.getcwd()+'/%d'%user_id
printu'文字微博爬取完毕'
link=""
fo2=open("/Users/Personals/%s_imageurls"%user_id,"wb")
foreachlinkinurllist_set:
link=link+eachlink+" "
fo2.write(link)
printu'图片链接爬取完毕'
ifnoturllist_set:
printu'该页面中不存在图片'
else:
#下载图片,保存在当前目录的pythonimg文件夹下
image_path=os.getcwd()+'/weibo_image'
ifos.path.exists(image_path)isFalse:
os.mkdir(image_path)
x=1
forimgurlinurllist_set:
temp=image_path+'/%s.jpg'%x
printu'正在下载第%s张图片'%x
try:
urllib.urlretrieve(urllib2.urlopen(imgurl).geturl(),temp)
except:
printu"该图片下载失败:%s"%imgurl
x+=1
printu'原创微博爬取完毕,共%d条,保存路径%s'%(word_count-4,word_path)
printu'微博图片爬取完毕,共%d张,保存路径%s'%(image_count-1,image_path)
??
Python3.xx中写爬虫,下载图片除了urlretrieve方法,还有什么库的什么方法呢?Part1.urllib2
urllib2是Python标准库提供的与网络相关的库,是写爬虫最常用的一个库之一。
想要使用Python打开一个网址,最简单的操作即是:
your_url=""html=urllib2.urlopen(your_url).read()12
这样所获得的就是对应网址(url)的html内容了。
但有的时候这么做还不够,因为目前很多的网站都有反爬虫机制,对于这么初级的代码,是很容易分辨出来的。例如本文所要下载图片的网站,上述代码会返回HTTPError:HTTPError403:Forbidden错误。
那么,在这种情况下,下载网络图片的爬虫(虽然只有几行代码,但一个也可以叫做爬虫了吧,笑),就需要进一步的伪装。
要让爬虫伪装成浏览器访问指定的网站的话,就需要加入消息头信息。所谓的消息头信息就是在浏览器向网络服务器发送请求时一并发送的请求头(RequestHeaders)信息和服务器返回的响应头(ResponseHeaders)信息。
例如,使用FireFox打开时所发送的RequestHeaders的部分内容如下:
Host:"publicdomainarchive.com/"User-Agent:"Mozilla/5.0(WindowsNT10.0;WOW64;rv:50.0)Gecko/20100101Firefox/50.0"Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"...1234
还有一些其他属性,但其中伪装成浏览器最重要的部分已经列出来了,即User-Agent信息。
要使用Headers信息,就不能再仅仅向urlopen方法中传入一个地址了,而是需要将HTTPRequest的Headers封装后传入:
headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64;rv:50.0)Gecko/20100101Firefox/50.0'}req=urllib2.Request(url=url,headers=headers)content=urllib2.urlopen(req).read()123
这样,就获得了网站的html内容。
接下来,就需要从html去获取图片的链接。
Part2.HTMLParser
HTMLParser是Python提供的HTML解析库之一。
但Python提供的这个类中很多方法都没有实现,因而基本上这个库只负责进行解析,但解析完了什么都不做。所以如果需要对HTML中的某些元素进行加工的话,就需要用户自己去实现其中的一些方法。本文仅实现其中的handle_starttag方法:
classMyHTMLParser(HTMLParser):#继承HTMLParser类
def__init__(self):#初始化
HTMLParser.__init__(self)defhandle_starttag(self,tag,attrs):
#参数tag即由HTMLParser解析出的开始标签,attrs为该标签的属性
iftag=="img":#下载图片所需要的img标签
iflen(attrs)==0:pass
else:for(variable,value)inattrs:#在attrs中找到src属性,并确定其是我们所要下载的图片,最后将图片下载下来(这个方法当然也有其他的写法)
ifvariable=="src"andvalue[0:4]=='http'andvalue.find('x')=0:
pic_name=value.split('/')[-1]printpic_name
down_image(value,pic_name)123456789101112131415
Part3.下载图片
从handle_starttag方法中,我们已经获得了图片的url,那么,最后一步,我们要下载图片了。
当然,要获得网络上的图片,自然也需要向服务器发送请求,一样需要用到urllib2这个库,也需要用到上面所用到的请求头。
以下是down_image()方法的主要代码:
binary_data=urllib2.urlopen(req).read()
temp_file=open(file_name,'wb')
temp_file.write(binary_data)
temp_file.close()1234
因为这次打开的网址是个图片,所以urllib2.urlopen(req).read()所获取的就是图片的数据,将这些数据需要以二进制的方式写入本地的图片文件,即将图片下载下来了。
因为图片的url的最后一部分是图片的名字,所以可以直接用做本地的文件名,不用担心命名冲突,也不用担心后缀不符,很是方便。
Part4.getFreeImages.py
这个下载图片的脚本的完整代码如下:
importurllib2,
classMyHTMLParser(HTMLParser):
def__init__(self):
HTMLParser.__init__(self)#self.links={}
defhandle_starttag(self,tag,attrs):
#print"Encounteredthebeginningofa%stag"%tag
iftag=="img":iflen(attrs)==0:pass
else:for(variable,value)inattrs:ifvariable=="src"andvalue[0:4]=='http'andvalue.find('x')=0:
pic_name=value.split('/')[-1]printpic_name
down_image(value,pic_name)defdown_image(url,file_name):
globalheaders
req=urllib2.Request(url=url,headers=headers)
binary_data=urllib2.urlopen(req).read()
temp_file=open(file_name,'wb')
temp_file.write(binary_data)
temp_file.close()if__name__=="__main__":
img_dir="D:\Downloads\domainimages"
ifnotos.path.isdir(img_dir):
os.mkdir(img_dir)
os.chdir(img_dir)printos.getcwd()
url=""
headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64;rv:50.0)Gecko/20100101Firefox/50.0'}
all_links=[]
hp=MyHTMLParser()foriinrange(1,30):
url=''+str(i)+'/'
req=urllib2.Request(url=url,headers=headers)
content=urllib2.urlopen(req).read()
hp.feed(content)
hp.close()041424344454647484950
有大神知道怎么使用python往ftp服务器上连续上传下载多张图片吗?例:下载、上传文件
#?coding:?utf-8
from?ftplib?import?FTP
import?time
import?tarfile
import?os
#?!/usr/bin/python
#?-*-?coding:?utf-8?-*-
from?ftplib?import?FTP
def?ftpconnect(host,?username,?password):
????ftp?=?FTP()
????#?
????(host,?21)
????(username,?password)
????return?ftp
#从ftp下载文件
def?downloadfile(ftp,?remotepath,?localpath):
????bufsize?=?1024
????fp?=?open(localpath,?'wb')
????('RETR?'?+?remotepath,?fp.write,?bufsize)
????
????fp.close()
#从本地上传文件到ftp
def?uploadfile(ftp,?remotepath,?localpath):
????bufsize?=?1024
????fp?=?open(localpath,?'rb')
????('STOR?'?+?remotepath,?fp,?bufsize)
????
????fp.close()
if?__name__?==?"__main__":
????ftp?=?ftpconnect("113.105.139.xxx",?"ftp***",?"Guest***")
????downloadfile(ftp,?"Faint.mp4",?"C:/Users/Administrator/Desktop/test.mp4")
????#调用本地播放器播放下载的视频
????os.system('start?"C:Program?FilesWindows?Media?Playerwmplayer.exe"?"C:/Users/Administrator/Desktop/test.mp4"')
????uploadfile(ftp,?"C:/Users/Administrator/Desktop/test.mp4",?"test.mp4")
????
Python爬虫爬坑路(二)——B站图片,咸鱼的正确GET姿势昨天在写完入门级爬虫之后,马上就迫不及待的着手开始写B站的图片爬虫了,真的很喜欢这个破站呢(? ̄△ ̄)?
这里不涉及到Python爬虫的高级技
㈢ 如何用Python做爬虫
在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材。
我们最常规的做法就是通过鼠标右键,选择另存为。但有些图片鼠标右键的时候并没有另存为选项,还有办法就通过就是通过截图工具截取下来,但这样就降低图片的清晰度。好吧其实你很厉害的,右键查看页面源代码。
我们可以通过python来实现这样一个简单的爬虫功能,把我们想要的代码爬取到本地。下面就看看如何使用python来实现这样一个功能。