Python 爬虫入门《中》
2015-08-31 14:55
274 查看
标签(空格分隔): Python 爬虫
原始排版地址:
刚刚开始读
废话不多了,首先开始读。
和
一般是采用这种形式来说明程序的入口。
可以看到这里调用了一个函数
函数声明部分说明了,这个函数是有两个可选的默认参数的,由于我也就忘记了这个默认参数的习惯,所以 我遵循 c++ 的标准,从最右边开始,往左,但是
使用了一个叫做 os 的模块,可以通过帮助文档,这个 模块的主要作用是和计算机的文件系统打交道的。
其实我觉得这种说法是片面的,感觉就是和文件及文件夹相关的操作。
这里是创建了一个目录,之后改变了工作目录,其实在帮助文档说的非常详细了,
我大概也知道有很多和我一样苦逼的自学朋友们英语没有那么溜,我这里也顺便给大家推荐一个小软件
接着是一个异常处理,如果文件夹存在那么创建的话就会报出一个异常,我们接收异常之后略过就好了,因为本来的目的就创建文件夹。
仔细看了之后 觉得这个
后面是一个简单的循环,为了匹配这个网页的规则,也就是说明了爬虫是具有一定规则性的,当然你如果能支持非常多的规则的话,应该能爬到不少东西,我这里充其量算是一个精确搜索的爬虫。
接下来,我自己吐槽一下我自己的这个地方的字符串算法,应该是有更好的办法写的,各位看官可以下去自己测试,就是
爬虫第二个比较关键的函数就是这个获取图片了。
先说一下它的写法。
这里使用了我们上篇说到的 urllib.request 模块,用来获取网页的源代码。
获取到源码之后 传入了
使用的是最基本的字符串查找算法,如果这里使用正则可以几句代码就搞定,各位看官下去可以自己尝试写成正则的。
正则模块是
之后将这个存放图片链接列表遍历一下,保存到本地,调用了
这个函数的写法如下:
这里使用了以前的方法,使用
不得不提的是,这里还有这么个东西可以用来保存文件:
到这里基本流程就全部解释完毕了,关于代理和多线程处理,会在下一篇中继续跟进。
原始排版地址:
Python 爬虫入门《中》
承上启下
上篇已经讲到了简单的爬虫的一些相关的东西,模块学习,这篇就从最基本的"爬虫"开始,一句一句的阅读一个炒鸡简单的“爬虫”。
蠕动的小家伙
import urllib.request import os import re # 未写 def proxy_open(): # 安装代理 步骤 # 1. 选择代理 # 2. 建立代理 # 3. 安装代理 pass def save_pic(url,filename): req = urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36') try: proxy_open() response = urllib.request.urlopen(req) except urllib.error.HTTPError: return pic = response.read() if len(pic) == 0: print('图片不存在') return f = open(filename,'wb') f.write(pic) f.close() def find_pic(html): pic_list = [] a = html.find('<div class=\"postContent\">') end = html.find('</p>',a) while True: b = html.find('src="',a) if b > end: break b += 5; a = html.find('"',b) pic_list.append(html[b:a]) return pic_list def get_pic(url,count): req = urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36') response = urllib.request.urlopen(req) html = response.read() html = html.decode('gbk') if re.search(r'很抱歉!没有找到符合条件的页面哦',html) != None: print('页面无法访问') return # print(str(html)) # 找到图片链 pic_list = find_pic(html) if len(pic_list) == 0: return # 保存图片 index = 0 for each in pic_list: print(each) filename = './OOXX/' + str(count) + '_' + str(index) + '.jpg' save_pic(each,filename) index += 1 def download_mm(folder = 'OOXX',pages = 100): try: os.mkdir(folder) # os.chdir(folder) except FileExistsError: pass url_module = 'http://www.meizitu.com/a/%d.html' count = 34 while True: if count >= pages: break url = url_module.replace('%d',str(count)) print(url) get_pic(url,count) count += 1 if __name__ == '__main__': download_mm()
解释
这段代码我曾经发出来过,是一个很简单的,甚至算不上“爬虫”的“爬虫”。
刚刚开始读
Python代码的时候,其实我是非常不适应的,我是属于典型的windows程序员,很不习惯这种小写加上下划线的命名规范,当然,到现在为止,我依旧不适应这种写法,也间接的说明了我的英语很烂的缘故吧。
废话不多了,首先开始读。
和
c的 main() 一样 ,python 也有一个入口点,就是
if __name__ == '__main__': download_mm()
一般是采用这种形式来说明程序的入口。
可以看到这里调用了一个函数
download_mm, 这个是属于个人的封装习惯了,不同的人对于函数的封装习惯略有区别。
def download_mm(folder = 'OOXX',pages = 100):
函数声明部分说明了,这个函数是有两个可选的默认参数的,由于我也就忘记了这个默认参数的习惯,所以 我遵循 c++ 的标准,从最右边开始,往左,但是
python这么灵活的语言中应该是没有这个限制的。
try: os.mkdir(folder) # os.chdir(folder) except FileExistsError: pass
使用了一个叫做 os 的模块,可以通过帮助文档,这个 模块的主要作用是和计算机的文件系统打交道的。
其实我觉得这种说法是片面的,感觉就是和文件及文件夹相关的操作。
这里是创建了一个目录,之后改变了工作目录,其实在帮助文档说的非常详细了,
我大概也知道有很多和我一样苦逼的自学朋友们英语没有那么溜,我这里也顺便给大家推荐一个小软件
QTranslate,小巧便捷,支持几个在线词库,还不错。
接着是一个异常处理,如果文件夹存在那么创建的话就会报出一个异常,我们接收异常之后略过就好了,因为本来的目的就创建文件夹。
仔细看了之后 觉得这个
os.chdir(folder)在这里有一些多余,毕竟是默认的相对路径且不支持指定路径,这里不要也是成立的。(未验证)
url_module = 'http://www.meizitu.com/a/%d.html' count = 34 while True: if count >= pages: break url = url_module.replace('%d',str(count)) print(url) # 获取图片 get_pic(url,count) count += 1
后面是一个简单的循环,为了匹配这个网页的规则,也就是说明了爬虫是具有一定规则性的,当然你如果能支持非常多的规则的话,应该能爬到不少东西,我这里充其量算是一个精确搜索的爬虫。
接下来,我自己吐槽一下我自己的这个地方的字符串算法,应该是有更好的办法写的,各位看官可以下去自己测试,就是
replace的地方,之后把生成的链接和和
count传入了
get_pic函数,传入
count的目的是给生成的图片命名。
爬虫第二个比较关键的函数就是这个获取图片了。
def get_pic(url,count): req = urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36') response = urllib.request.urlopen(req) html = response.read() html = html.decode('gbk') if re.search(r'很抱歉!没有找到符合条件的页面哦',html) != None: print('页面无法访问') return # print(str(html)) # 找到图片链 pic_list = find_pic(html) if len(pic_list) == 0: return # 保存图片 index = 0 for each in pic_list: print(each) filename = './OOXX/' + str(count) + '_' + str(index) + '.jpg' save_pic(each,filename) index += 1
先说一下它的写法。
这里使用了我们上篇说到的 urllib.request 模块,用来获取网页的源代码。
获取到源码之后 传入了
find_pic函数,这个函数的目的是 找到源码中的,我们需要的东西,即图片的链接。
def find_pic(html): pic_list = [] a = html.find('<div class=\"postContent\">') end = html.find('</p>',a) while True: b = html.find('src="',a) if b > end: break b += 5; a = html.find('"',b) pic_list.append(html[b:a]) return pic_list
使用的是最基本的字符串查找算法,如果这里使用正则可以几句代码就搞定,各位看官下去可以自己尝试写成正则的。
正则模块是
re,可以自己学习这个模块的使用方法。
之后将这个存放图片链接列表遍历一下,保存到本地,调用了
save_pic
这个函数的写法如下:
def save_pic(url,filename): req = urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36') try: proxy_open() response = urllib.request.urlopen(req) except urllib.error.HTTPError: return pic = response.read() if len(pic) == 0: print('图片不存在') return f = open(filename,'wb') f.write(pic) f.close()
这里使用了以前的方法,使用
open和
write、
close来保存文件。这里需要注意的一点是, 写入文件之后一定要立马调用
close方法,否则可能出现一些很奇怪的事情,例如文件写入乱码和失败,至于为什么会出现这种问题,各位读者请自己思考,为什么留下这些问题是为了给读者一些思考的空间。
不得不提的是,这里还有这么个东西可以用来保存文件:
urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)
到这里基本流程就全部解释完毕了,关于代理和多线程处理,会在下一篇中继续跟进。
相关文章推荐
- 用Python的requests库作接口测试——对响应进行迭代
- python模拟登录新浪微博
- python 的对象内建方法:__XXX__(a1,a2)
- 用Python的requests库作接口测试——上传文件
- Python使用requests库模拟登陆网站的方式--以豆瓣为例
- 特征提取的相关博客
- 使用Python的requests库作接口测试——请求对象与响应对象
- python 学习笔记--列表,无组,字典的区别
- Python多线程
- 64位Win8环境的Python数值分析库安装(原创)
- 零基础学python-10.1 序列赋值高级应用
- 零基础学python-10.1 序列赋值高级应用
- 高德软件有限公司python试题 及 答案
- python pika 操作 rabbitmq
- python读取 .txt 文本内容以及将程序执行结果写入txt文件
- 利用python重启路由器
- python学习-函数定义理解
- Python操作数据库
- python __add__和__radd__ 和 __iadd__
- python基础(二)