• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

每天一个小程序—0013题(爬图片+正则表达式orBeautifulSoup)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-)

 

关于python3的urllib模块,可以看这篇博客:传送门

首先是用urlopen打开网站并且获取网页内容,通过查看网页源代码,可以很容易的发现图片的格式都是差不多的,所以用正则表达式来匹配即可。

 

 1 from urllib import request
 2 import re
 3 
 4 def get_pic():
 5     web = request.urlopen(r'http://tieba.baidu.com/p/2166231880')
 6     page = web.read()
 7     page = page.decode()
 8 
 9     regex = re.compile(r'<img.*?class="BDE_Image" src="(.*?)".*?>')
10     pic = re.findall(regex, page)
11     return pic
12 
13 def save(save_pic):
14     path = 'D:\python\project\爬虫结果'
15     count = 0
16     for pic in save_pic:
17         request.urlretrieve(pic, '%s/%s.jpg' % (path, count))
18         count += 1
19 
20 pic = get_pic()
21 save(pic)

 

之后我又用BeautifulSoup模块来进行了爬图,这个方法确实简单多了。这位博主对于BeautifulSoup的介绍十分不错:传送门

 1 from bs4 import BeautifulSoup
 2 from urllib import request
 3 
 4 url = 'http://tieba.baidu.com/p/2166231880'
 5 path = 'D:\python\project\爬虫结果'
 6 
 7 page = request.urlopen(url).read()
 8 page = page.decode()
 9 
10 soup = BeautifulSoup(page, 'lxml')
11 count = 0
12 
13 pic_list = soup.findAll("img", class_ = 'BDE_Image')
14 for pic in pic_list:
15     pic = pic['src']   #获取列表中的src内容
16     request.urlretrieve(pic, '%s/%s.jpg' % (path, count))
17     count += 1

引用一下该博客中的一段话:

函数原型:

findAll(tag,attributes,recursive,text,limit,keywords);

find(tag,attributes,recursive,text,keywords);

参数:

tag:标签参数tag前面我们已经看到过很多次了,你可以传一个标签的名称或者多个标签名称组成的python列表作为标签参数。

         例如此代码是返回HTML文档中所有标题标签的列表:.findAll({"h1","h2","h3","h4","h5","h6"})

attributes:属性参数attributes是用一个python字典封装一个标签的若干个属性和对应的属性值。

        例如此代码会返回HTML文档里红色和绿色两种颜色的span标签:.findAll("span",{"class":{"green","red"}})

recursive:递归参数recursive是一个布尔变量。你想抓取HTML文档标签结构里多少层的信息?如果recursive设为True,findAll函数就会根据你的要求去查找标签参数中的所有子标签,以及子标签的子标签。如果recursive设置为False,findAll函数就只查找文档的一级标签。findAll函数默认是支持递归查找的(recursive默认值是True),一般情况下这个参数不需要设置,除非你真正想要了解自己需要哪些信息,而且抓取速度非常重要,那时你可以设置递归参数。

text:文本参数text有点不同,它是用标签的文本内容去匹配,而不是用标签的属性。假如我们想查找前面网页中包含“the prince”内容的标

签数量,我们可以用这个代码:                      

nameList=bsObj.findAll(text="the prince")

 print (len(nameList))

limit:范围限制参数limit,显然只用于findAll方法。find其实等价于findAll的limit等于时的情形。如果你只对网页中获取的前n项结果感兴趣,就可以设置它。但是需要注意,这个参数设置之后,获得的前几项结果按照网页上的 顺序排序的,未必是你想要的那前几项。

keyword:这个参数可以让你选择那些具有特定属性的标签。

         例如:allText=bsObj.findAll(),这个代码可以让你获得所有id为text的标签的内容。

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
小程序组件scroll-view滑动发布时间:2022-07-18
下一篇:
微信小程序(wx:for)遍历对象发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap