Python爬虫学习笔记(一)

Python是个功能很强大,也很齐全的语言,这在我当初学的时候是不了解的。想一想半年前学习python的初衷,无非是是由于ArcGIS提供了python脚本的编译环境,当我知道ArcToolbox里那些功能强大的工具,有一部分居然就是用所谓python写出来的,天然也就想着去尝试,简化那些冗杂的工做,这也是我喜欢编程的一个缘由。 javascript

不过说实话,python断断续续的学到如今,也没写出什么脚本工具,但怎么也说不能算没有一点收获:起码学会了一门语言呢。虽然离当初的目标有些偏离,可是学习自己,是没什么坏处的,由于你总会意外的收获到其余的东西。 css

Python是开源的,因此除了官方的库以外,有不少第三方的库,能够作不少事情,像科学计算,机器学习,搭建网站的框架,还有,固然了,就是爬虫,想一想就颇有意思。目前也是刚接触,numpy是跟着一本书学,爬虫的话,就是在网上找资料,参照着别人的案例。 html

今天写的第一个,就是参照虫师老师的一篇博客http://www.cnblogs.com/fnng/p/3576154.html。这个例子,说的是如何从一个网页中,将全部的图片下载到本地,并编号,在看代码以前彻底是没有一点概念的,看完以后就感受,整个过程并不复杂,python提供了功能至关强大的urllib库,代码也很简单。 前端

一、导入相关库

# python读取网页的库 java

import urllib python

# 正则表达式有关模块 正则表达式

import re编程

 

这里说一说正则表达式,正则表达式(Regular Expression)是很复杂的,不仅有python有,像Java, C#都有,说白了就是编写必定的规则来匹配字符串,掌握基础的就已经够用,复杂的之后还得慢慢学,这里仍是推荐廖雪峰老师的我的网站http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832260566c26442c671fa489ebc6fe85badda25cd000,上手不困难 网络

二、获取网页的html

def getHTML(url): 框架

# 相似于文件的打开

page = urllib.urlopen(url)

# 相似于文件的读取

html = page.read()

return html

 

考虑到以后的使用的方便,这里将这个方法进行了封装,写成一个函数,代码很简单,和文件的读取很相似。

三、编写正则表达式

这个实际上是整个个爬虫过程最复杂的一部分。由于网站的内容相差很大,想要提取的信息也是不同的,因此没有一个万能的正则表达式,得就事论事。

接下来就具体分析一个网页,html+css+Javascript接下来还得继续学习。

好比说这个网站http://tieba.baidu.com/p/4571038933?see_lz=1里面有不少图片,在Chrome里按住F12查看源代码,会发现,这里面全部的图片都连接到一个网址,而且格式以下:

咱们所须要的,就是提取src=""里面的连接。

代码以下:

def getImag(html):

# 这里是经过compile将字符串编译成一个正则对象

# re.S表示多行匹配,比较经常使用

pattern = re.compile('<img class="BDE_Image".*?"(.*?)"', re.S)

# re.findall以列表形式返回匹配到的子串,也常见match(从头匹配),search(任意匹配)

imags = re.findall(pattern, html)

 

这个函数正则表达式部分已经写完,但只完成了一半,接下来就是根据提取到的连接,来下载文件并保存到本地

四、获取图片

# t负责给文件编号

t = 1

for img in imags:

# 使用urltrieve从连接中获取文件

urllib.urlretrieve(img, 'D:\Learn\Code\python\pachong\photo\%s.jpg' % t)

t += 1

 

五、试运行

url = 'http://tieba.baidu.com/p/4571038933?see_lz=1'

html = getHTML(url)

getImag(html)

就能够在文件夹中等着接收文件吧

的确是颇有成就感。

六、下面就来完善代码吧

在这个网站中,我发现了更为有趣的用法http://www.nowamagic.net/academy/detail/1302861

参阅帮助文档,能够发现urlretrieve有个回调函数

具体能够这样来用,写一个回调函数Reporthook()

def Reporthook(a, b, c):

# a:已经下载的数据块,b:数据块的大小,远程文件的大小

per = 100 * a * b / c

if per > 100:

per = 100

print '%.2f%%' % per

 

而后在urlretrieve()的里面增长一个名为Reporthook的参数便可

至关有意思!!!!!

总结:

一、关于爬虫,没有找到有关的书籍。可是,可是,网络上的资源实际上是至关丰富的,尤为是不少技术博客,做者写的都至关的详细,参照着学,收获是很大的,以上我写的都是在网上找到的。见贤思齐焉,遇到不会的,就去学习好了。

二、python官方文档,讲的虽然不详细,但简明扼要,都是核心的东西,多看看,会发现不少的盲点,就像这个例子里的回调函数,不少人估计在学爬虫的时候都没有使用过。

三、爬虫会接触到不少网页前端的内容,接下里要想爬的更好,就得学html+css+javascript,甚至是分布式