【详解】Python写爬虫脚本的教程

来源:互联网 发布:陈风暴烈酒 知乎 编辑:程序博客网 时间:2024/05/17 06:12

【2015-12-11更新】本文是无聊以及不成熟时候的记录,都是最最基础的东西,很多都是废话,可以不看!

【2015-12-16更新】研究出了模拟登录b站的方法,该篇虽然废话,但都是基础,看过该篇可继续看下一篇---《Python模拟登录b站并抓取信息》


因为过去了一段时间,有好多点都可以直接写,反而不知道从哪儿开始写。所以写一个从零开始的Python爬虫教程,也是自己从头再学习和复习的一个过程。

1.Python的安装

我们这里安装Python2.7,虽然据说Python3有好些地方进步了不少(比如比较让人头疼的编码问题)

具体安装过程就不赘述了,百度很好找到。

2.PyCharm的安装

这个是比较好的一个Python编程工具,强烈推荐使用。安装过程自行百度!

3.第三方模块的安装使用

Python如同Java一样,也有很多包,包里面有很多方法函数。除了自带的各种,我们可以通过安装第三方的模块来简化我们的开发过程。

在我的学习过程中,只用到了两种安装方法:

1. 针对个别模块,可以找到安装文件,点击打开后如同普通软件一样有安装向导,比如pygame就是这样的

2. 最常见的,就是解压之后一个文件夹,文件夹中有setup.py的文件。通过命令行来安装,cmd-->cd  \--->f:--->cd f:/a/b/c

    定位到setup.py这个文件所在的文件夹下,然后,加上setup.py install 完成安装


以上这些算是准备工作,接下来开始正式介绍如何写Python爬虫脚本。

顺序由上至下依次写:

1.顶端的声明

#!/usr/bin/python# -*- coding: utf-8 -*-
第一行:用来说明脚本语言是python,而且要用/usr/bin下面的程序(工具)python这个解释器,来解释python脚本,用来运行python脚本的。

第二行:是用来指定文件编码为utf-8。推荐使用utf-8这样可以在脚本文件中添加中文注释,比较方便的。

2.版本标识

__author__ = "$Author: Python$"__version__ = "$Revision: 1.0 $"__date__ = "$Date: 2015-10-22 15:35$"
指明,作者,版本号,以及编写日期

3.

################################################################ 功能:模拟登录哔哩哔哩抓取个人主页关注动态的视频信息###############################################################
表名功能

4.模拟登录

首先讲模拟登录。我们从网站上抓取数据,很多时候都需要先登录,然后进入网页。

说模拟登录,有句话是这么说的,代码其实很好写,只是分析登录的过程比较麻烦!

其实写过一次之后真的是这样的,代码的写法其实比较死,关键是每个网站的登录过程都不同。分析清楚这个过程就算是完成了大半的模拟登录工作了!

我们这里做一个功能,模拟登录bilibili并抓取当前时间正在观看的前十名,显示视频名称并显示点击数。


首先贴一个之前做的模拟登录某数据后台的代码,作为记录对照以及参考。

这个是我最初做模拟登录的第一版代码,也是最为基础的代码。

#!/usr/bin/python# -*- coding: utf-8 -*-import reimport cookielibimport urllibimport urllib2import optparsedef login():    #输入用户名密码的数据    # parse input parameters    parser = optparse.OptionParser()    parser.add_option("-u","--channelId",action="store",type="string",default='',dest="channelId",help="Your ChannelId");    parser.add_option("-p","--password",action="store",type="string",default='',dest="password",help="Your Password");    (options, args) = parser.parse_args()        #导出所有的选项变量,方便之后使用    # export all options variables, then later variables can be used    for i in dir(options):        exec(i + " = options." + i)    #处理cookie    cj = cookielib.CookieJar()    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))    urllib2.install_opener(opener)    downjoyMainUrl = "http://money.downjoy.com/connectchannel/login.jsp"    resp = urllib2.urlopen(downjoyMainUrl)       #开始模拟登录  downjoyMainLoginUrl = "http://money.downjoy.com/connectchannel/login.html"    postDict = {        'channelId'      : "1039",        'password'      : "xxx",    }    # here will automatically encode values of parameters    postData = urllib.urlencode(postDict)    req = urllib2.Request(downjoyMainLoginUrl, postData)       #编码    req.add_header('Content-Type', "application/x-www-form-urlencoded")    resp = urllib2.urlopen(req)   #加上.decode('utf-8').encode('gb2312')就能够解决中文乱码的问题    html = resp.read().decode('utf-8').encode('gb2312')    #返回了网页    print htmlif __name__=="__main__":    login()

接下来分析bilibili的登录流程,我用的是火狐浏览器,点击F12然后分析具体流程!

1. 手动登录

看一下正常通过浏览器登录需要输入什么信息。

我们发现,登录bilibili需要输入用户名、密码,以及,验证码

2.先到达登录页面

#!/usr/bin/python# -*- coding: utf-8 -*-import cookielibimport urllibimport urllib2import optparsedef login():    #输入用户名密码的数据    parser = optparse.OptionParser()    parser.add_option("-u","--channelId",action="store",type="string",default='',dest="channelId",help="Your ChannelId");    parser.add_option("-p","--password",action="store",type="string",default='',dest="password",help="Your Password");    (options, args) = parser.parse_args()    for i in dir(options):        exec(i + " = options." + i)    #处理cookie    cj = cookielib.CookieJar()    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))    urllib2.install_opener(opener)    downjoyMainUrl = "https://account.bilibili.com/login"    resp = urllib2.urlopen(downjoyMainUrl)    html = resp.read().decode('utf-8')    print html
这里出现的第一个链接,就是bilibili登录网址,我们打印出网页,发现的确是登录页面的HTML显示

3.分析如何登录

我们打开F12,手动输入用户名密码以及验证码,登录!

我们分析时,在F12的控制台中最需要找的是,

我们输入的用户名、密码、验证码分别在哪里!

找到了这些登录网站所需要的信息,就可以模拟登录了,因为正常登录只需要这三个信息!


####怎么找我们输入的三个信息呢?

我们要记得,明确一点,登录是具有加密性的操作,所以肯定是通过post方式来提交参数的。

所以我们只需要在POST方式中寻找就可以了!


我们首先到登录页面,打开F12,清除一下现有信息,重新载入,发现除了最初的两个GET,剩下的所有POST都是一样的,而且随着时间推移不断增加,推测应该是网站以一定的频率向网站后台请求着什么。。。

这种发起请求的url肯定是有用的,我们先留个心,待会肯定会回到这条url找寻一些信息。


然后登录,我们需要在这一堆一样的POSTurl下找寻新的POST,在里面找到我们输入的信息。


我们发现,登录过程中,接了一个GET,一个POST,我们要找的信息肯定就在这两个之中!

果不其然,我们在post请求下的参数这里发现了我们刚刚输入的userid,还有pwd,即用户名和密码。

再回忆一下我们刚刚输入的验证码,发现是vdcode对应的参数。

至此,登录需要的三个信息我们都找到了,当然,确应我们刚刚所说,都在POST请求里。


####分析除了输入信息外其他的信息?

我们手动登录输入的信息都找到了,但有了这些还不一定能够登录。因为还有别的参数,我们用浏览器登录时,这些参数的获取和提交,浏览器替我们做了。

而用Python代码手动模拟登录时,这些工作需要我们自己做。

首先,act、gourl这两个肯定是不变的。

剩下的keeptime我们读一下名字,不知道它是干嘛的,但我们要分析它是可变的还是不可变的!

如果可变,我们要分析它从哪儿来;

如果不可变,我们就以分析到的值为准就可以了。

 

多登录几次,观察一下这个keeptime的变化。

最终我们发现,几次登录这个keeptime是不变化的。所以不用管它了!记住它是604800就可以了!


####验证码如何获取?

接下来分析验证码的问题。

0 0
原创粉丝点击