Python爬虫(2)创建项目

在VS环境下点击菜单【文件】/【新建】/【项目】或在打开VS之后的页面选择“创建新项目”,如下图:

 

由于可创建的项目类别非常多,而我们这里只需要创建Python的应用程序,所以可以通过上面所标注的步骤1进行筛选,然后按步骤2选择列表中的“Python应用程序”,点击“下一步”。

在“配置新项目”中,同样按上图步骤进行设置,在步骤2中的“位置”可以根据自己的需要进行设置,同样步骤1中的“项目名称”也可以自己定义。

这样,我们就创建好了一个空的Python应用程序,并且会自动创建一个MySpider.py的文件,在“解决方案管理器”中就可以看到,并且该文件是以粗体字显示,如下图:

剩下的工作就是在这个文件中添加我们的程序代码了。

 

  1. 包的介绍及引入

在上次的爬虫开篇中已经讲过了,我们爬虫需要引入几个关键的包,如下截图:

双击“解决方案资源管理器”的“MySpider.py”文件,然后在打开的文件中加入如上信息。

特别注意,不要忘记把第一行也加上,这个在开篇的时候讲过了,它的作用就是告诉解释器,这个文件的编码方式。

 

BeautifulSoup,这个模块是在包bs4中的,我们要用到的它的功能是网页解析以及网页数据的获取,从字面看就是一剂“靓汤”。

 

re,这个是正则表达式的模块,它的全称为Regular Expression,正则在开发以及实际中的应用是非常广泛的,你可能对“正则”这个名字不是很熟悉,但是你或多或少也使用过,比如我们在DOS下用的通配符其实就是正则的一种表现形式,还有我们在Word中使用的查找/替换功能,不知道你注意到了没有,有一个“使用通配符”,如果勾选了这个选项,那么你在查找或替换的字符串就可以使用正则表达式了。

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

如果一个人能把正则完全吃透,灵活应用在这里基本上也没“靓汤”什么事了。在本文,这个不是重点,需要进一步了解的可以百度搜索“正则表达式”。

 

urllib.request,网页请求模块,这个就是网页数据获得的关键,它模拟了我们人通过浏览器去访问一个网址然后得到网页上的所有信息的过程。从它的字面都可以猜到,它就是完成向特定的网址(即网页所在的网站服务器)发送一个请求,然后让服务器根据你的请求给你返回你需要且它能提供的数据,这些数据信息以html文档的方式返回。

 

urllib.error,这个是urllib的错误处理模块。

 

xlwt,这个模块今后也是打交道比较多的,就是如何对我们熟悉的Excel进行操作的一个模块。这也是网上各种python培训机构以此来吸引广大初学者的一个噱头,通过python你就可以完全操控excel,然后做出各种漂亮的图表,什么可以让你可以摆脱excel,再也不用加班处理数据之类的话,都是彻头彻尾的噱头。想想都知道,Excel是微软开发的一款办公软件,所有的Excel对外接口都是它提供的,你来操控excel也是基于这些公开的接口的,难道你比微软更了解excel不成?只不过你控制excel多了一种途径罢了,以本人使用excel这么多年的经验看,对excel乃至office家族其他成员兼容操控最好的还是office内置的VBA,这也是VBA经久不衰的原因所在。

又多说了几句,我们继续。

 

  1. 了解网页请求的过程

我们以“谷歌”浏览器来简单介绍一下我们每次访问一个网址都发生了些什么(如果你用的是其他浏览器,也可以检查一下是不是自带类似谷歌浏览器这样的功能,如果没有,你也可以到网上下载一个谷歌浏览器。)

打开浏览器,然后按下F12键(或Ctrl + Shift + I ,或是在网页中点击右键快捷菜单中最后一项“检查”),原来网页显示页面就会分成两部分,一部分是网页显示部分(红色A区),另一部分(绿色B区+蓝色C区)就是我们要使用的浏览器集成的工具来查看网页背后的内容,也是我们实现爬虫需要了解的部分,我们首先选择“Network”页面。

其中第二部分又分为B区和C区,B区就是网页本身的源码,但这个源码被该工具做了结构化调整,让开发者能快速定位各个节点;C区则记录网页每个时间段内发生的事情,也就是我们浏览器和网站之间的互动关系,记录了网页发送了给网站什么信息,网站返回了什么信息诸如此类的内容,而这些统统都是文本信息。

 

 

此时,我们点击网页“刷新”按钮或是你直接在地址栏里按下回车,即让网页再加载一次,我们看C区都给我们记录了些什么。

之后,在时间轴中,用鼠标点击最左边一个时隙,就可以看到这是浏览器和网站的第一次交互信息,可以从General部分中的Request URL(请求网址)就是我们在浏览器地址栏中的网址信息;

Request Method(请求方法)是GET;请求方法一共有6如下几种:

从上面针对各请求方法的简短解释可以看出,并不是所有的方法你都有权限使用的,通常从安全考虑,网站一般只会开放有限的请求方法,比如GET,POST,HEAD,而其他可能会引起安全隐患的请求方式都会被禁止掉或是留作网站后台内部使用。平时我们对发送请求主要也就是GET和POST。

在Request Headers请求头部中,我们可以看到如下关键信息:

Accept:告诉网站服务器我能接受哪些信息;

Accept-Encoding:可以接受的编码方式;

Cookie:通常用于和服务器建立多次回话的信息;

Host:初始URL中的主机;

User-Agent:浏览器类型,告诉我使用的是什么类型的浏览器,使用这个也可以达到欺骗服务器的目的,也就是之前说的,如果要直接用python去访问就可能被认为是爬虫而被服务器拒绝,如果更换这个属性值就简单欺骗了服务器。

其实请求头部还有很多其他的类型参数,就不在这里一一讲解,有需要的可以自信在网上查找,我们平时使用最多的就是上面所列举的,外加一个Referer。

 

向服务器发送完这些请求信息之后,服务器就会根据你发送的请求返回相应的信息,我们可以从接下来的各个时隙中看到我们接受到很多网页元素(如下图中第2部分框出的,包括css,js,还有png等文件),最后组成我们在网页上看到的内容。

 

  1. 查看网页元素

接下来,我们可以从刚才的“Network”页面转到“Elements”来看看我们最想获得的网页信息吧,“Elements”就是被工具结构化显示了的网页源码信息,你直接通过网页右键菜单中“查看网页源代码”中也可以看到,只不过,通过这种方法看到的源码是没有进行结构化的,看起来会相对吃力。

我们这里还是通过“Elements”来查看。

当我们需要查看网页上哪部分的信息的时候,我们就可以通过点击下图中的小箭头图标,然后再点击网页上面你想查看的内容,如:

就可以在Elements中快速定位到源码所在的位置,这样就方便我们通过代码来获取相应位置的信息。

 

其余的信息同样可以使用这样的方法查看。

 

  1. 获取电影的名称

接下来,我们就以先获取第一页中的电影名称为例介绍。

还是先来分析下网页源码并找到相应的规律,我们还是通过点击小箭头查看一整部电影的信息在网页源码中都是哪个部分,在Elements中可以快速定位到下图B框选部分,在自己观察,你还可以结合整个网页的展示看到,一页里有25部电影信息,在这里都是在以li这样的标签定义的列表里,B框选的部分就是我们的第一部电影,而在第一个列表li里,以class=”item”这样的div标签内,其他电影的位置在源码中也呈现同样的结构,就是说,我们只需要得到这个网页的每一个item内的信息就可以进一步获取到每部电影的内容。

思路确定之后就开始,就可以开始按步骤写代码了:

 

第一步,先通过网址向网站发送相应的请求,然后我们获取网站返回的网页源码,也可以称为网页文件或网页数据。

每行代码的作用基本用注释加以解释,请参考。

其中head字典变量中,我们还可以根据实际需要添加相应的信息,比如Referer,Host这样的请求字段,字段名称确保拼写正确,不要有多余的空格,否则网站服务器是不认的。

 

response变量就是服务器返回的网页数据,该数据在很多时候是经过编码了的,特别是包含了中文字符的网页,所以要想把它变成我们人可以直接阅读的字符串,我们可以使用decode方法将其解码。

 

做完这一步,我们就可以启动VS的调试功能来看看我们代码的运行结果是不是我们所期望的。直接按下F10键进行单步执行代码,然后就可以看到程序从第一行开始执行,并以黄色高亮显示,如下图:

继续按下F10键,黄色高亮就会跳到下一可执行行,当然你也可以在你想查看的行设置断点,通过按F5让程序执行到断点行停下来。设置断点的方法就是,你把当前光标移动到想要设置断点的行,然后按下F9,你就会看到在代码编辑区最左侧会添加一个断点显示红色圆点,如下:

我们直接略过中间的内容,让程序直接运行到我们设置的断点行,按F5,如下图:

我们就可以通过监视窗口看到response变量的内容了。

打开“监视”窗口的方法:

然后按下面方式将变量拖拽添加到监视框:

01.gif

到这一步的时候,程序还没有执行当前断点行,我们可以换成F10来单步执行该行,当高亮跳到下一行的时候,response就有内容了,如下:

以相同的方式,我们还可以向监视框中添加更多的变量,比如sHtml,因为response到此时已经有数据了,但是这个数据只是一个对象,添加sHtml之后我们再F10单步执行就可以通过我们的代码解码信息得到人可以阅读的内容:

对比response,我们在sHtml的值中就可以看到我们熟悉的html源码了。接下来就是对这这个源码进行解读分离出我们需要的信息。

 

 

第二步,在获取到的网页文件中(即刚才得到的sHtml变量),我们就可以使用“靓汤”BeautifulSoup来进一步解析获取准确的内容。

 

ptnTitle是我们为了获取电影名称而定义的正则表达式,通过BeautifulSoup的html解析器将sHtml文本内容进行解析,然后将解析的结果使用方法find_all分离出所有class为item的div并形成一个列表,通过for循环取出每一个列表中的元素,特别要注意的是参数中class_=”item”这里,在class后面紧跟了一个下划线,这个主要目的是表示class这个属性,否则会报错,因为class这个单词在python语言是保留关键字。

 

然后获取到item中所有信息之后还需要通过之前定义的正则表达式精确匹配到我们的电影名称。

获取到title,也还需要做一些处理,防止电影名称有一些不希望出现的字符串,比如名字开头和结尾多余的空格,还有名字中可能出现的斜杠“/”。因为电影名字除了中文名字之外,可能还包含其他外文名字,比如英文,日文之类的,所以需要做一个判断,我们就可以把中文和外文名字一并取出,如果没有外文名字的,我们就以空表示。

 

写到这里可以再启动调试看看是不是我们需要的结果,同样,这一页内的所有电影名称是否都能正常获取。

通过调试,我们在程序结束的时候查看dataList列表变量可以看到,我们得到了第一页的所有电影的名称。

既然能成功获取电影名称,那么我就可以以同样的方法,获取一页所有电影的其他信息,比如电影的详细介绍,评分,评价人数,导演等你可以在网页上看到的一切信息以及相应的超链接。

项目源代码可以通过微信扫描下方二维码关注并查看历史文章获取,以及后续文章也可以提前获取。

 

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值