赞
踩
Python是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。
目前python的开发越来越广泛,设计到web、后端、桌面应用程序、软件开发、科学统计等方面。其广泛性、灵活性、移植性、易读性、简单性等特点越来越收欢迎。在大数据时代,我们获取大量数据的途径之一就是使用python来爬取数据,然后使用MYSQL数据来存储数据,使用大数据分析工具进行数据处理。
下面来说一下今天的主题,爬虫。目前在python中各种获取网页源码的库有很多,第一种使用bs4中的BeautifSoup库来获取网页源代码;第二种使用lxml中的etree模块来获取网页源码等等,今天来说一下,比较简单的使用etree来爬取网站数据。
lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。XPath 即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。XPath的选择功能十分强大,它提供了非常简明的路径选择表达式,另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有我们想要定位的节点,都可以用XPath来选择。XPath使用路径表达式在xml文档中选取节点,这里注意需要逐级表现要选取节点的父子关系。下面主要说一下Xpath的用法:
1.1 XPath符号
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点文档中,而不考虑他们位置
. 选取当前节点。
.. 选取当前节点的父节点
@ 选取属性
* 表示通配
| 连接多个表达式,做并集操作
1.2 XPath路径表达
bookstore 选取bookstore元素的所有子节点。
/bookstore 选取根元素bookstore。
假如路径起始于正斜杠 。注释:假如路径起始于正斜杠 。注释:假如路径起始于正斜杠 。注释:假如路径起始于正斜杠
( / ( / ),则此路径始 ,则此路径始 终代表到某元素的绝对路径!
bookstore/book 选取bookstore子元素中所有book元素。
//book 选取所有book元素,而不管它们在文档中的位置。
bookstore//book bookstore 选择bookstore元素的后代中所有book元素,而不管它们位于bookstore下的什么位置
//@auth 选取所有名为auth的属性
1.3 XPath谓语
谓语表达了针对该层级节点的筛选条件,常见谓语如下
/book[2] 表示在该级选取第二个book节点
/book[last()] 表示在该级选取最后一个book节点
/book[position()<5] 表示在该级选取前四个book节点
/book[@auth] 表示在该级选取所有拥有auth属性的book节点
/book[@auth="buka"] 表示在该级选取所有auth属性值为buka的book节点
/book[price>35.00] 表示在该级选取price子元素的值大于35的book节点
我们如何爬取数据呢,第一步肯定是要知道我们需要爬取那个网站的数据,第二步就是我们要知道我们要爬取网页的什么数据,因为数据有很多,所以我们要选择性的爬取,第三步就是发送http请求,第四步就是获取网页源码并解析,第五步就是读取指定节点的数据并下载,第六步写文件。以上过程就是整个的爬取思路,前面两部很简单可以算作一步
第一步和第二步 本人自己学习python,用来爬取的网站是包图网的短视频。首先我们找到包图网视频的页面,例如:
第三步 请求链接网站
- import requests
- from lxml import etree
-
- class Spiders(object):
- def start_request(self):
- reponse=requests.get("https://ibaotu.com/shipin/")
- html=etree.HTML(reponse.text)
-
-
-
- spider=Spiders()
- spider.start_request()
这里我用面向对象的方法定义了一个类,这个类主要实现爬取数据,那我们直接实例化一个类对象,就可以调用爬取了。这里需要所以说一下request是我们请求网页必须要用的库,lxml中的etree是用来解析网页源码。而HTML是模块提供给我们将网页源码翻译成html格式。
第四步和第五步 解析网页源码
第三步之后我们将网页翻译成html格式,然后使用etree中的XPath来读取指定节点的文本值,可以无视节点的位置,我们在页面通过F12可以看到一些网站的页面源码。例如:
因为xpath可以无视节点的位置,所以我们直接用鼠标放到对应的位置就可以看到网页对应的源码,如上所示,首先我们要获取到下载视频的标题,其次就是要获取到视频的下载地址。我们可以看到标题在<span class="video-title">节点的文本值,而视频的在<div class="video-pay">节点的属性值“src”的文本值就是我们的要下载的视频。那如何写呢,看下面代码:
- list_title = html.xpath('(//span[@class="video-title"]/text())')
- src_list = html.xpath('(//div[@class="video-play"]/video/@src)')
-
- for tit, src in zip(list_title, src_list):
- self.down_mp4(tit, src)
如果不知道xpath形参的格式怎么写,请看前面的解释。 前面两行代码可以将标题和视频连接下载下来,但是发现不是一一对应的,所以这里我们使用zip函数来使下载的标题和连接达到一一对应,接下来我们应该下载视频,所以我们重新封装一个函数主要用来写文件即 down_mp4
第六步 保存文件
我们要下载好的视频格式是 “标题.MP4”,然而我们知道互联网目前使用最多的是http协议,在上面那一步的时候发现src属性的文本值没有带http: 直接是//pic.ibaotu.com/17/86/09/744888piCPpU.mp4_10s.mp4 所以这里需要处理一下,
- #下载视频
- def down_mp4(self, tit, src):
- file_name=tit+".mp4"
- print("正在抓取的视频:"+file_name)
- content = requests.get("http:" + src).content
-
- # 保存数据
- try:
- with open(file_name, "wb") as f:
- f.write(content)
- except:
- print("抓取错误")
这里在写数据的时候使用了异常处理机制。这样我们就实现了整个数据的爬取,我们就可以在工程目录下面看到爬取的小视频了,因为我们目前只爬取了一页的数据,需要多页爬取的时候,需要修改第三步中的url 这个我们可以多翻几页就可以看到规律了。这里要说一点就是视频总页数只有223页,但是python的处理的是左闭右开,所以在循环的时候要写到224,这样才可以爬取到最后一页的数据。
好了,以上就是本人第一次爬虫的成果了,由于自学很多东西不是很懂,里面有解释错误的地方,希望各位能够不吝赐教。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。