博主使用的是python 3.4的. 如果有使用python 2.x的朋友,参照文中的python 2和python 3的不同进行修改
在之前的爬去模板中进行扩充,爬去贴吧的图片.
import urllib.request import os os.mkdir('贴吧图') os.chdir('贴吧图')
导入os是因为需要新建一个文件夹.
os.mkdir和os.chdir是两个很重要的函数.创建文件夹和改变路径.
所以到了这一步,文件的存取路径应该是在我们创建的 贴吧图 这个路径下了.
url = 'http://tieba.baidu.com/p/3937684305/' img_addrs = [] response = urllib.request.urlopen(url) html = response.read() html = html.decode('utf-8')
这个部分也类似与模板,都需要用到这一步的.
将response读取出后,存放在html,需要用’utf-8’进行解码.再存放在html中.不然会是以二进制的方式存取,不便我们操作.
当然,你可以使用
url = input('请输入您需要爬取的贴吧图的地址')
这样的方式更加灵活.将输入的地址放入url,再进行操作.
不过,这也是属于代码美化的问题了.
现在我们已经得到了想要爬取的网页的源代码.放在html中了.
在这里,我们用chrome打开我们要爬取的链接:http://tieba.baidu.com/p/3937684305/
鼠标放在图上,右键-审查元素
可以看到:
src=””中的链接就是图片的下载链接了.我们只需要选出链接,就可以像模板爬虫一样下载了.
现在的任务是如何选出链接:我们可以用正则表达式,这是一个非常快捷,方便,且不容易出错的方式.
但是,这里我们暂且不用这个方法.我们使用find函数.
我们发现,链接前面都出现了
class="BDE_Image" src="
所以使用:
head = html.find('class="BDE_Image" src="')
找到其中的链接的开头.
链接的结尾,当然是.jpg结尾的.如下:
end = html.find('.jpg', head, head+255)
链接不会长于255个字符.
当找到head,且找到end的时候,那么就返回这个链接.
因为这个网页中有多个图片地址,所以我们放在了一个列表中.找到链接时候,就添加到这个链表.
img_addrs.append(html[head+23:end+4])
这里,可以数到head找寻的字符串的23. end找寻的字符串’.jpg’长度是4.将这个区间的字符串放入img_addrs.
所以我们已经得出了地址.接下来只需要用循环就可以得出所有的图片地址了.如下:
count = 0 while head != -1: end = html.find('.jpg', head, head+255) if end != -1: #print(html[head+23:end+4]) img_addrs.append(html[head+23:end+4]) else: end = head + 23 head = html.find('class="BDE_Image" src="', end) count = count + 1 if count > 20: break
count的作用是只需要下载20张图片就够了.并不需要太多.
最后将图片写入文件就可以了.
for each in img_addrs: filename = each.split('/')[-1] with open(filename, 'wb') as f: img = urllib.request.urlopen(each).read() f.write(img)
这里的each.split(‘/’)[-1]是为文件得出一个文件名.文件名是图片的下载地址的最后一个’/’后面的字符串.
依次写入,得出图片.
如果你有什么疑问,可以写下你的评论,我们共同探讨的.