zoukankan      html  css  js  c++  java
  • 每天一个小程序—0013题(爬图片+正则表达式 or BeautifulSoup)

    第 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:pythonproject爬虫结果'
    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:pythonproject爬虫结果'
     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"),这个代码可以让你获得所有id为text的标签的内容。

  • 相关阅读:
    页面存在多个setInterval
    ios 常见兼容问题
    微信开发常用代码
    jq右侧划出
    常用 css rem 根字体
    weinre使用教程
    CSS属性大全
    微信H5页面前端开发,大多数人都会遇到的几个兼容性坑
    后台管理系统页面欣赏
    微信公众号开发文档
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/8337839.html
Copyright © 2011-2022 走看看