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的标签的内容。

  • 相关阅读:
    hihoCoder #1062 : 最近公共祖先·一
    hihoCoder #1050 : 树中的最长路
    hihoCoder #1049 : 后序遍历
    108 Convert Sorted Array to Binary Search Tree 将有序数组转换为二叉搜索树
    107 Binary Tree Level Order Traversal II 二叉树的层次遍历 II
    106 Construct Binary Tree from Inorder and Postorder Traversal 从中序与后序遍历序列构造二叉树
    105 Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树
    104 Maximum Depth of Binary Tree 二叉树的最大深度
    102 Binary Tree Level Order Traversal 二叉树的层次遍历
    101 Symmetric Tree 判断一颗二叉树是否是镜像二叉树
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/8337839.html
Copyright © 2011-2022 走看看