网络上一提到 Python,总会有一些不知道是黑仍是粉的人大喊着:Python 是世界上最好的语言。最近利用业余时间体验了下 Python 语言,并写了个爬虫爬取我 csdn 上关注的几个大神的博客,而后利用leancloud一站式后端云服务器存储数据,再写了一个 android app 展现数据,也算小试了一下这门语言,给个人感受就是,像 Python 这类弱类型的动态语言相比于 Java 来讲,开发者不须要分太多心去考虑编程问题,可以把精力集中于业务上,思考逻辑的实现。下面分享一下我这次写爬虫的一下小经验,抛砖引玉。javascript
登陆 Python 官网下载客户端,Python 如今分为 Python3 和 Python2, 即对应的官网上的版本为3.5和2.7,两者的异同有兴趣能够搜索一下,就个人了解,2和3的语法会有不一样,并且有的库支持2不支持3,有的支持3不支持2等等;又好比urllib2库(一个用来获取URLs的模块)在 Python2 上引用要 import urllib2, 而在 Python3 里就变成import urllib.request。等等。纠结使用哪一个版本没有意义,代码是为逻辑服务的,不管2或3很明显均可以知足咱们这些初学者的需求。这里推荐一下廖学峰老师的 Python 教程。很高质量的教程,2和3都有,嫌看视频学得慢的朋友能够试试。css
~~可是这里有一个坑要提醒一下:若是你也和我同样想要使用leancloud作后端服务器,那得使用 Python2,无他,由于人家文档里写着暂不支持 Python3。╮(╯_╰)╭~~(6.28 更正:leancloud 现已支持 Python3)html
下载客户端后,若是你点击安装后一切正常,那你能够忽略此步。若是出现安装失败 error2502/2503,解决办法以下:html5
安装成功后配置环境变量(个人电脑-右键 属性-高级系统设置-环境变量)添加安装的目录(C:\Python27)到path。以后打开命令行输入python,若是出现以下图三个小箭头则说明 Python 解释器已经安装成功了。java
pip,你们能够理解成至关于android studio的gradle,能够一键配置开源库到项目中(后续配置leancloud服务器也能够很方便的导入他们的模块)。beautifulsoup则是一个HTML解析器,使用它解析html标签方便又简单。python
另外再推荐一款编辑器:pycharm,JetBrains出品你懂的,InteliJ系列风格,使用这款编辑器你会感受像是在使用android studio同样,至少设置个字体大小啥的都不陌生。jquery
万事俱备,Let's begin!android
由于我也才刚接触 Python,因此有一些代码可能很无脑且未通过优化,仅仅只为实现需求,so~下面就开始分享我写的一些 Python 代码,以及写爬虫时遇到的一些小坑web
CSDN禁止爬虫,因此要爬取以前就要把爬虫假装成浏览器,在访问以前增长一个header:编程
user_agents = [ 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11', 'Opera/9.25 (Windows NT 5.1; U; en)', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)', 'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12', 'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9', "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7", "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 ", ] agent = random.choice(user_agents) #每次随机抽取一个假装的客户端浏览器版本号 req = urllib2.Request(self.url) #将要请求的地址映射成request对象,而后能够对其添加HTTP头 req.add_header('User-Agent', agent) req.add_header('Host', 'blog.csdn.net') req.add_header('Accept', '*/*') req.add_header('Referer', 'http://blog.csdn.net/mangoer_ys?viewmode=list') req.add_header('GET', url) html = urllib2.urlopen(req) #将request对象传入urlopen方法,返回一个response对象 page = html.read().decode('utf-8') #调用read方法就能够得到html网页的信息了,主要还要对其转码为utf-8
这里就已经爬取到网页内容了(page),后面只要经过正则来解析你须要的数据,简单的爬虫其实就已经完成了。
如今来整理一下,咱们到底须要一些什么数据?个人目的是爬取一个,甚至几个博主的所有博客,而后在手机上展现。那么就须要:
建立一个类来执行第一个业务:
要注意的是: Python 的规定方法定义必须有额外的参数self指代其自己,相似java的this。
class Get_First_Url: #用于获取博客首页第一篇博文的地址的类 def __init__(self, url2): #类构造器,这里咱们还传入一个url,即博客首页的地址 self.url = url2 #将参数赋值给类,python里能够任意添加成员变量而不用提早声明,要用的时候直接调用self.xxx ''' 假装浏览器 ''' self.page = page #获取的网页信息 self.beginurl = self.getFirstUrl() #下面咱们会定义一个方法来解析网页并保存一篇的地址
上面得到的 page 包含了全部的网页里的 html 标签,咱们如今就要解析标签,得到信息,举个例子,在个人博客主页里右键-查看源代码,能够看到整个网址包含的全部html标签,如何从中找到本身想要的信息是哪一个标签呢?
以获取第一篇博客的连接地址为例,右键标题,审查元素,就能够看到该连接的html标签了
<span class="link_title"> <a href="/yazhi1992/article/details/51497576"> eclipse再见,android studio 新手入门教程(三)Github(.ignore忽略规则)的使用 </a> </span>
很容易看出,博客地址就是 csdn 网址拼接span标签内的a标签的key为href对应的value值。为了获得这个值,就要使用 breautifulsoup 解析,咱们定义一个方法:
def getFirstUrl(self): bs = BeautifulSoup(self.page) #建立breautifulsoup对象 html_content_list = bs.find('span', class_='link_title') #得到key为class,value为link——title的span标签,由于class与python语法的关键字冲突,因此要使用 class_ 代替 if (html_content_list == None): #若是未找到该标签则返回'nourl' return "no url" try: #异常捕获 return 'http://blog.csdn.net' + html_content_list.a['href'] except Exception, e: return "nourl"
因此到这里,咱们就已经能够获得咱们所须要的第一个数据了:
first_spider = Get_First_Url(now_url) begin_url = first_spider.beginurl
获取其余数据方法相似,值得一提的是另外一种标签的解析,须要的数据是标签内部的文字:
<div class="article_r"> <span class="link_postdate">I want this</span> </div>
想要得到标签的内容
bs = BeautifulSoup(self.page) #建立breautifulsoup对象 html_content_list = bs.find('span', class_='link_postdate') print html_content_list.string
我还遇到过想要获取时间2015-10-10 16:24这个值,可是执行上述代码会报错,提说说soup没有string这个值,那就须要对其作个转变为字符串的操做
print str(html_content_list.string)
更多breautifulsoup的用法能够参考Python爬虫利器二之Beautiful Soup的用法
若是你运行程序后报这个错,解决办法是在文件头添加:
#coding=utf-8 import sys default_encoding = 'utf-8' if sys.getdefaultencoding() != default_encoding: reload(sys) sys.setdefaultencoding(default_encoding)
talk is cheap, show you the code.
str = 'this is test' print str[:4] #输出结果 this print str[3:] #输出结果 s is test print str[1:4] #输出结果 his
不用多说,冒号“ : ”表明首或尾,和java同样的包左不包右。若是首尾都是数字,中间用冒号分割。
list = [] print list[-2] #数组倒数第二个的值
直接在外部定义全局变量,可是使用时须要用globla关键字表示
TEST = 'this is global variable' class ... def... global TEST #使用关键字标识这个TEST是全局变量 print TEST #使用该变量
IDE好像不能自动导包(我也没认真去翻setting)导包的话直接在文件头import相应的包,例如
from bs4 import BeautifulSoup #导breatifulsoup的包 import urllib2 import random ...等等
Python 的布尔类型是首字母大写的(或者IDE能够设置忽略大小写联想,我没有去仔细翻)。(╯‵□′)╯︵┻━┻
if(list==null||list.size == 0) { //java ... } else { ... } if (list == None or len(list) == 0): #python ... else: ...
由于我是爬取正文的html标签,而后在android端上使用webview展现,可是有个问题是webview里会显示电脑端的效果,字很小。查看手机端网页源代码后,发如今html标签头添加如下代码,就能够适配移动端浏览器:
<head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta name="apple-mobile-web-app-status-bar-style" content="yes"> <script src="http://csdnimg.cn/public/common/libs/jquery/jquery-1.9.1.min.js" type="text/javascript"></script> <!--link( rel="stylesheet" href="http://c.csdnimg.cn/public/common/toolbar/css/index.css" )--> <link rel="stylesheet" href="http://csdnimg.cn/public/common/libs/bootstrap/css/bootstrap.css"> <link rel="stylesheet" href="http://csdnimg.cn/public/static/css/avatar.css"> <link rel="stylesheet" href="/static/css/common.css"> <!-- [if IE 7]--> <!--link( rel="stylesheet" href="assets/css/font-awesome-ie7.min.css" )--> <!-- [endif]--> <link rel="stylesheet" href="/static/css/main.css"> <!-- [if lt IE 9]--> <script src="/static/js/libs/html5shiv.min.js"></script> <!-- [endif]--> <title></title> <script type="text/javascript" src="/static/js/apps/blog_mobile.js"></script> </head>
另外,关于webview网页里图片自适应,4.4之前只须要:
WebSettings webSettings= contentWeb.getSettings(); webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
可是在Android 4.4系统上 Google已经将系统默认的Webkit内核替换成本身的开源项目chromium,致使的一个问题就是上述代码失效了,解决方法请参考Android 中 WebView 与 js 简单交互实现图文混排效果,解决图片自适应屏幕与查看大图问题,亲测有效。
Python 爬虫源码下载,请替换本身的leancloud应用的id和key,具体如何在爬虫里上传数据,以及在app里如何读取数据,请阅读leancloud官方开发文档。
Stay hungry, Stay foolish。下篇博客见。