Python爬虫新手入门之初学lxml库


Posted in Python onDecember 20, 2020

1.爬虫是什么

所谓爬虫,就是按照一定的规则,自动的从网络中抓取信息的程序或者脚本。万维网就像一个巨大的蜘蛛网,我们的爬虫就是上面的一个蜘蛛,不断的去抓取我们需要的信息。

2.爬虫三要素

  • 抓取
  • 分析
  • 存储

3.爬虫的过程分析

当人类去访问一个网页时,是如何进行的?

①打开浏览器,输入要访问的网址,发起请求。

②等待服务器返回数据,通过浏览器加载网页。

③从网页中找到自己需要的数据(文本、图片、文件等等)。

④保存自己需要的数据。

对于爬虫,也是类似的。它模仿人类请求网页的过程,但是又稍有不同。

首先,对应于上面的①和②步骤,我们要利用python实现请求一个网页的功能。

其次,对应于上面的③步骤,我们要利用python实现解析请求到的网页的功能。

最后,对于上面的④步骤,我们要利用python实现保存数据的功能。

因为是讲一个简单的爬虫嘛,所以一些其他的复杂操作这里就不说了。下面,针对上面几个功能,逐一进行分析。

4.如何用python请求一个网页

作为一门拥有丰富类库的编程语言,利用python请求网页完全不在话下。这里推荐一个非常好用的类库urllib.request。

4.1.抓取网页

urllib库使用

import urllib.request
 
response = urllib.request.urlopen('https://laoniu.blog.csdn.net/')
print(response.read().decode('utf-8'))

这样就可以抓取csdn我的主页的html文档

我们使用爬虫就是需要在网页中提取我们需要的数据,接下来我们来学习抓取一下百度搜索页的热榜数据

Python爬虫新手入门之初学lxml库

4.2.如何解析网页呢

使用lxml库

lxml 是一种使用 Python 编写的库,可以迅速、灵活地处理 XML 和 HTML。

它支持 XML Path Language (XPath) 和 Extensible Stylesheet Language Transformation (XSLT),并且实现了常见的 ElementTree API。

安装

windows下安装

#pip方式安装
pip3 install lxml
 
#wheel方式安装 
#下载对应系统版本的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
pip3 install lxml-4.2.1-cp36-cp36m-win_amd64.whl

linux下安装

yum install -y epel-release libxslt-devel libxml2-devel openssl-devel
 
pip3 install lxml

环境/版本一览:

  • 开发工具:PyCharm 2020.2.3
  • python:3.8.5

4.3.编写代码

import urllib.request
from lxml import etree
 
# 获取百度热榜
url = "https://www.baidu.com/s?ie=UTF-8&wd=1"
# 我们在请求头加入User-Agent参数,这样可以让服务端认为此次请求是用户通过浏览器发起的正常请求,防止被识别为爬虫程序请求导致直接拒绝访问
req = urllib.request.Request(url=url, headers={
 'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
})
# 发起请求
html_resp = urllib.request.urlopen(req).read().decode("utf-8")

到这里我们可以顺利获取百度的搜索页面html文档

我门需要看一下热搜排行榜的标签元素在哪里

Python爬虫新手入门之初学lxml库

Python爬虫新手入门之初学lxml库

找到第一条  右键复制 XPath   (后边说XPath是什么)

Python爬虫新手入门之初学lxml库

我们需要了解并使用XPath,XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

复制的内容结果是: //*[@id="con-ar"]/div[2]/div/div/table/tbody[1]/tr[1]

这xPath字符串 表示现在在html定位的位置就是热点新闻第一行内容

5.XPath常用规则


表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
* 通配符,选择所有元素节点与元素名
@* 选取所有属性
[@attrib] 选取具有给定属性的所有元素
[@attrib='value'] 选取给定属性具有给定值的所有元素
[tag] 选取所有具有指定元素的直接子节点
[tag='text'] 选取所有具有指定元素并且文本内容是text节点

 

6.继续分析

那么我们要获取所有的热点新闻该怎么写呢

继续看网页

Python爬虫新手入门之初学lxml库

可以看到所有的热榜分别在三个<tbody>之下

修改一下刚才复制的XPath

//*[@id="con-ar"]/div[2]/div/div/table/tbody[1]/tr[1] 改为  //*[@id="con-ar"]/div[2]/div/div/table/tbody/tr

这样XPath就会定位到这三个tbody下的所有tr元素内容

我们继续看一下tr是不是我们想要的内容,展开一个tr看看

Python爬虫新手入门之初学lxml库

淦~还有一堆,,

这该怎么办。我们需要拿到数据是 【标题】 【访问链接】 【热度】,现在手里已经拿到的是所有的tr元素

紧接着从tr下手 直接 拿到下面所有<a>标签的标题与超链接

标题的XPath: */a/@title 超链接的XPath: */a/@href

*表示匹配tr下的所有元素  /a是在*找到第一个a标签  @是属性选择器 title和href就是要选择的素属性了

还剩下个热度,let‘s me 继续操作,直接选择tr下的第二个td  XPath: td[2]

分析完毕,把完整的代码贴出来

import urllib.request
from lxml import etree
 
# 获取百度热榜
 
url = "https://www.baidu.com/s?ie=UTF-8&wd=1"
# 我们在请求头加入User-Agent参数,这样可以让服务端认为此次请求是用户通过浏览器发起的正常请求,防止被识别为爬虫程序请求导致直接拒绝访问
req = urllib.request.Request(url=url, headers={
  'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
 })
html_resp = urllib.request.urlopen(req).read().decode("utf-8")
html = etree.HTML(html_resp)#初始化生成一个XPath解析对象
_list = html.xpath("//*[@id='con-ar']/div[2]/div/div/table/tbody/tr")
print(f"article count : {len(_list)}")
 
for tr in _list:
 title = tr.xpath("*/a/@title")[0]
 href = tr.xpath("*/a/@href")[0]
 hot = tr.xpath("string(td[2])").strip()
 print(f"{hot}\t{title}\thttps://www.baidu.com{href}")

点击运行,程序啪就跑起来了,很快啊,数据全都过来了,我全都接住了,我笑了一下。

到此就完成了lxml xpath的基本使用,更详细的xpath教程请看 :https://www.w3school.com.cn/xpath/index.asp

爬虫三要素,抓取数据完成了,剩余的分析与存储就先不说了

总结

到此这篇关于Python爬虫新手入门之初学lxml库的文章就介绍到这了,更多相关Python爬虫入门之lxml库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
Nov 05 Python
浅析Python编写函数装饰器
Mar 18 Python
Python处理json字符串转化为字典的简单实现
Jul 07 Python
详解常用查找数据结构及算法(Python实现)
Dec 09 Python
Python学习小技巧之列表项的推导式与过滤操作
May 20 Python
python中plot实现即时数据动态显示方法
Jun 22 Python
Python爬虫常用小技巧之设置代理IP
Sep 13 Python
Python 实现Windows开机运行某软件的方法
Oct 14 Python
Python实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
使用python3批量下载rbsp数据的示例代码
Dec 20 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 Python
Python修改DBF文件指定列
Dec 19 #Python
Python实现FTP文件定时自动下载的步骤
Dec 19 #Python
Python+Xlwings 删除Excel的行和列
Dec 19 #Python
python Zmail模块简介与使用示例
Dec 19 #Python
python中实现栈的三种方法
Dec 19 #Python
python中实现词云图的示例
Dec 19 #Python
python 实现图片批量压缩的示例
Dec 18 #Python
You might like
PHP 和 MySQL 基础教程(三)
2006/10/09 PHP
php 购物车实例(申精)
2009/05/11 PHP
在字符串指定位置插入一段字符串的php代码
2010/02/16 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
2013/04/23 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
vue的keep-alive中使用EventBus的方法
2019/04/23 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
python paramiko模块学习分享
2017/08/23 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
Python3简单实现串口通信的方法
2019/06/12 Python
python实现图片转字符画的完整代码
2021/02/21 Python
举例详解CSS3中的Transition
2015/07/15 HTML / CSS
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
结婚邀请函范文
2014/01/14 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
nginx中proxy_pass各种用法详解
2021/11/07 Servers
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL