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

科科。。。妹子就算了,大晚上的爬点吃的吧。食物图集:抿一口,舔一舔,扭一扭~·SCD

写个简单的爬图爬虫方法还蛮多的。

这次尝试用urlib.request来实现。

读取图片网源码,利用re.compile找到其中符合要求的img标签生成图片list,最后用request.urlretrieve下载图片到本地。

Code:

import os
import re
import urllib.request def pic_collector(url):
content = urllib.request.urlopen(url).read()
r = re.compile('<img class="BDE_Image" pic_type="1" width="450" height="450" src="(.*?)" ')
pic_list = r.findall(content.decode('utf-8')) os.mkdir('pic_collection')
os.chdir(os.path.join(os.getcwd(), 'pic_collection'))
for i in range(len(pic_list)):
pic_num = str(i) + '.jpg'
urllib.request.urlretrieve(pic_list[i], pic_num)
print("success!" + pic_list[i]) pic_collector("http://tieba.baidu.com/p/4341640851")

Note:

1. re.compile()内容由网页源代码决定。比如我扒的这个网页,用chrome查看源代码,找到想下载的包含图片的<img>标签,其完整内容如下(以某一张图为例):

<img class="BDE_Image" pic_type="" width="" height="" src="http://imgsrc.baidu.com/forum/w%3D580/sign=a6080fca870a19d8cb03840d03fb82c9/2683ea039245d688be88e4dfa3c27d1ed31b2445.jpg" size="">

即所扒的图片标签内容匹配'<img class="BDE_Image" pic_type="1" width="450" height="450" src="(.*?)"'。不必把标签完整的表达都写出来,但要包含到src内容

2. r.findall()中的content后要有decode('utf-8')这样才是能看懂的utf-8格式网页源代码

3. os.mkdir(filename)新建文件夹;os.chdir(filename)更改路径到xx文件夹;os.getcwd()获取当前文件夹名(字符串)

4. urllib.request.urlretrieve(pic,pic_name) 保存图片到上述路径并设定文件名

保存的文件如下图:

今后看到美少年的皂片不必再无限右键了,朕心甚慰_(:3 」∠)_

哦,要是在贴吧、堆糖想下载xx页到xx页图片怎么办,。Ծ ‸ Ծ。

比如上面那个图片贴,网址是酱紫的:

http://tieba.baidu.com/p/4341640851?pn=1  #第1页
http://tieba.baidu.com/p/4341640851?pn=2 #第2页
http://tieba.baidu.com/p/4341640851?pn=3 #第3页
http://tieba.baidu.com/p/4341640851?pn=4 #第4页
...
http://tieba.baidu.com/p/4341640851?pn=n #第n页

那就改一下代码啦,在原先的函数里添加两个参数m——起始页数,n——结束页数,即fetch_pictures(url, m, n)

import urllib.request
import re
import os def fetch_pictures(url, m, n): os.chdir(os.path.join(os.getcwd(), 'pic_collection'))
temp = 1 # 记录图片张数 for x in range(n-m+1):
html_content = urllib.request.urlopen(url + "?pn=" + str(n+x-1)).read() # key!
r = re.compile('<img class="BDE_Image" pic_type="1" width="450" height="450" src="(.*?)" ')
picture_url_list = r.findall(html_content.decode('utf-8'))
print(picture_url_list) for i in range(len(picture_url_list)):
picture_name = str(temp) + '.jpg'
urllib.request.urlretrieve(picture_url_list[i], picture_name)
print("Success!" + picture_url_list[i])
temp += 1 fetch_pictures("http://tieba.baidu.com/p/4341640851", 1, 3)

这样就可以下载第1~3页的图片了,想下整张帖子的图片就看下页数自己改呗。

【python小练】0013的更多相关文章

  1. 【python小练】0014题 和 0015 题

    第 0014 题: 纯文本文件 student.txt为学生信息, 里面的内容(包括花括号)如下所示: { ":["张三",150,120,100], ":[& ...

  2. 【python小练】0010

    第 0010 题:使用 Python 生成类似于下图中的字母验证码图片 思路: 1. 随机生成字符串 2. 创建画布往上头写字符串 3. 干扰画面 code: # codeing: utf-8 fro ...

  3. 【python小练】0005

    第 0005 题:你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小. 首先,iphone5的分辨率是1136x640. if条件句判断横(纵)向是否大于对应的ipho ...

  4. 【python小练】0004

    第 0004 题:任一个英文的纯文本文件,统计其中的单词出现的个数. 先回忆一下各种括号的用途: () tuple [] list {} dict ([]) set——需要一个list作为输入合集 c ...

  5. 【python小练】0002

    第 0002 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中. . . .(一脸懵逼) Python访问数据库:(廖雪峰python教程) 1. SQLi ...

  6. 【python小练】0001

    第 0001 题:做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)? # coding ...

  7. python小练--使用正则表达式将json解析成dict

    练习python语法,自己实现了一个简单的解析json字符,存为dict字典对象. { "id":12, "name":"jack", &q ...

  8. python 小练手

    监控 主动监控 - 服务器端轮询客户端 被动监控-客户端agent上报到服务器端 混合模式---两种都支持 需求 1个性化的监控需求 2每个服务的监控间隔不同 3混合模式的监控

  9. 【python小练】0020

    第 0020 题: 登陆中国联通网上营业厅 后选择「自助服务」 --> 「详单查询」,然后选择你要查询的时间段,点击「查询」按钮,查询结果页面的最下方,点击「导出」,就会生成类似于 2014年1 ...

随机推荐

  1. HDU6321 Dynamic Graph Matching (杭电多校3C)

    给出一些点集,然后对于每一次要求给出的这些点集里的1,2,3,4,5,6....n/2的匹配数, dp[i][j] 表示到第i次操作里点集为j的匹配数,然后我每次加入一条边u-v,我的状态就是 dp[ ...

  2. LVS+Keepalived搭建高可用负载均衡

    应用环境: LVS负责多台WEB端的负载均衡(LB):Keepalived负责LVS的高可用(HA),这里介绍主备模型. 测试环境: 配置步骤: 1. 安装软件 在LVS-1和LVS-2两台主机上安装 ...

  3. CentOS单网卡绑定双IP

    OS:CnetOS 6.8 初始网卡配置文件 [root@localhost /]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ...

  4. P1379 八数码naive题,STL的胜利

    八数码:我使用了map判重 结果一遍就轻松A题了. 关于map的用法: ①创建一个map map<char,int>m; map<string,long long int>m1 ...

  5. Miniconda 虚拟环境安装及应用

    首先要下载Miniconda安装包 下载地址  链接:https://pan.baidu.com/s/1rj-9exKBSHnCCxqq7JQSxA      提取码:ab53 下一步 打开下载好的M ...

  6. 【洛谷P1164 小A点菜】

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...

  7. react-native中的setNativeProps

    如果你通过React.createClass方法自定义了一个组件,直接给它设置样式 prop 是不会生效的,你得把样式 props 层层向下传递给子组件 ,直到子组件是一个能够直接定义样式的原生组件. ...

  8. python解决json序列化时间格式

    简单实例 import json from datetime import datetime from datetime import date info = { "name": ...

  9. linux less对文件内容进行搜索

    [ 可以先用 less 文件名 来打开文件, 然后可以按回车,打开底部命令输入行(即出现一个冒号的位置), 然后可以使用  键盘上的 home 键跳到文件开始,end键跳到最后,PgUp向前翻页,Pg ...

  10. 构造代码块、this关键字、静态变量、静态代码块、主函数

    一.构造代码块: 作用:给对象进行初始化. 特点:对象一经运行就执行(与变量声明时赋初值同级别,此处注意 非法前向引用) 优先于构造函数的执行. 与构造函数的区别: 构造代码块是给所有对象统一初始化. ...