Python+BeautifulSoup抓取暴走漫画页面图片

    使用Python中的BeautifulSoup(bs4)包抓取暴走漫画网站中的热门帖子中的图片。

    首先附上参考资料,之前在OSC上有人写了个抓取豆瓣妹子图片的帖子,参考人家的代码,自己重新弄了一下,当然不能像豆瓣妹子那样直接搜索所有的<img>标签啦,因为网页中含有广告啊,头像啊,表情之类的,我只想抓取热门中的内容图片嘛。

    这时候就要充分的利用BeautifulSoup啦,先附上参考资料

    首先分析暴走漫画网站的html,发现所有的热门内容的<img>标签都在class为img-wrap的<div>中,这样就好办了,完全避免了抓取除了这个div之外的图片,首先需要获取页面中class为‘img-wrap’的所有<div>,使用以下代码:

my_girl = soup.find_all(‘div‘,class_=‘img-wrap‘)
    这时my_girl是一个list对象,我们需要的是遍历所有的class为img-wrap的<div>,找到其中的<img>标签,代码如下:

for girl in my_girl:
		jokes = girl.find(‘img‘)
		link = jokes.get(‘src‘)

    在这里要提醒以下,find_all与find是不同的,千万不要用混了,find_all是返回的list对象,而find只是返回第一个,找到了就返回,所以在find_all之后,一定要用for循环遍历一遍,这样就可以啦。


整体的实现思路如下:

1. 首先创建文件夹,取名“暴走漫画”,就在当前目录下,存在的话就不重新创建了

2. 然后写一个函数,def,起名叫page_loop,默认page是1

3. 定义url,page就是url中分页的参数,当然了,url也可以函数传进来或者是系统读取进来,后期改进吧,使用BeautifulSoup打开URL

4. 然后就是上面的找标签操作了,如果要获取其他的网页中的其他信息,一定要好好地分析下网页的结构

5. 获取<img>标签的<src>属性之后,把这个连接取出来,使用with,把链接中的图片存到文件夹中

6. page+1,递归函数,获取下一页的图片


短短的二三十行代码,很有效,4不4.你也可以使用py2exe将程序转成Windows上可执行的,然后发给盆友吧,我就是这么做的。


需要改进的地方:

1. Shao说,最好可以手输URL或者读取配置文件的URL,获取图片,要是文件夹名称可以自己定义就更好了,可以弄

2. 页面结束判断没有做啊,到时候页面不存在就会报404,程序也会退出了,需改进

3. 在存储图片的时候,取的是原图的7位名称(src中URL后11位),如果不够7位就会报错,我之前的做法是用当前时间+随机字母+文件名后一位作为新的图片的文件名,但是这么操作也有问题,就是如果我重新爬的话,图片会重复,有待商榷

4. 如果用上多线程抓取和分布式抓取,就更好了,效率更高

5. 抓取的频率也不要太快,如果被检测了,就抓不到了,最好写个延时


需要注意的地方:

Python对缩进是非常非常非常之敏感的,如果你的编码过程中出现以下提示


那就是说明你空格和Tab用混了,不要慌不要急,按照以下方法来:全选——Alt+F5,轻松搞定


然后附上豆瓣妹子和暴走漫画的抓取结果吧,暴漫的话,留着自己慢慢看,也可以放到自己的网站里,豆瓣妹子嘛,还在犹豫什么宅男们,赶快收藏吧:




最后的最后,附上豆瓣妹子和暴走漫画的代码:

暴走漫画:

# -*- coding:utf8 -*-
# 2013.12.36 19:41 wnlo-c209
# 抓取dbmei.com的图片。

from bs4 import BeautifulSoup
import os, sys, urllib2,time,random

# 创建文件夹,昨天刚学会
path = os.getcwd()   				     # 获取此脚本所在目录
new_path = os.path.join(path,u‘暴走漫画‘)
if not os.path.isdir(new_path):
	os.mkdir(new_path)


def page_loop(page=1):
	url = ‘http://baozoumanhua.com/all/hot/page/%s?sv=1389537379‘ % page
	content = urllib2.urlopen(url)
	soup = BeautifulSoup(content)

	my_girl = soup.find_all(‘div‘,class_=‘img-wrap‘)
	for girl in my_girl:
		jokes = girl.find(‘img‘)
		link = jokes.get(‘src‘)
		flink = link
		print flink
		content2 = urllib2.urlopen(flink).read()

		#with open(u‘暴走漫画‘+‘/‘+time.strftime(‘%H-%M-%S‘)+random.choice(‘qwertyuiopasdfghjklzxcvbnm‘)+flink[-5:],‘wb‘) as code:          #在OSC上现学的
		with open(u‘暴走漫画‘+‘/‘+flink[-11:],‘wb‘) as code:
			code.write(content2)

	page = int(page) + 1
	print u‘开始抓取下一页‘
	print ‘the %s page‘ % page
	page_loop(page)
	
page_loop()


豆瓣妹子:

# -*- coding:utf8 -*-
# 2013.12.36 19:41 wnlo-c209
# 抓取dbmei.com的图片。

from bs4 import BeautifulSoup
import os, sys, urllib2

# 创建文件夹,昨天刚学会
path = os.getcwd()   				     # 获取此脚本所在目录
new_path = os.path.join(path,u‘豆瓣妹子‘)
if not os.path.isdir(new_path):
	os.mkdir(new_path)


def page_loop(page=0):
	url = ‘http://www.dbmeizi.com/?p=%s‘ % page
	content = urllib2.urlopen(url)

	soup = BeautifulSoup(content)

	my_girl = soup.find_all(‘img‘)   

    # 加入结束检测,写的不好....
	if my_girl ==[]:
		print u‘已经全部抓取完毕‘
		sys.exit(0)

	print u‘开始抓取‘
	for girl in my_girl:
		link = girl.get(‘src‘)
		flink = ‘http://www.dbmeizi.com/‘ + link
		
		print flink
		content2 = urllib2.urlopen(flink).read()
		with open(u‘豆瓣妹子‘+‘/‘+flink[-11:],‘wb‘) as code:#在OSC上现学的
			code.write(content2)
	page = int(page) + 1
	print u‘开始抓取下一页‘
	print ‘the %s page‘ % page
	page_loop(page)
	
page_loop()





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。