Python爬虫新手入门之初学lxml库
作者:Java劝退师、 发布时间:2021-11-19 07:16:29
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文档
我们使用爬虫就是需要在网页中提取我们需要的数据,接下来我们来学习抓取一下百度搜索页的热榜数据
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文档
我门需要看一下热搜排行榜的标签元素在哪里
找到第一条 右键复制 XPath (后边说XPath是什么)
我们需要了解并使用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.继续分析
那么我们要获取所有的热点新闻该怎么写呢
继续看网页
可以看到所有的热榜分别在三个<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看看
淦~还有一堆,,
这该怎么办。我们需要拿到数据是 【标题】 【访问链接】 【热度】,现在手里已经拿到的是所有的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
爬虫三要素,抓取数据完成了,剩余的分析与存储就先不说了
来源:https://blog.csdn.net/qq_41389354/article/details/111397222
猜你喜欢
- 效果图from wxpyimport *import requestsfrom datetimeimport datetimeimport
- 1、引言小鱼:小 * 丝,走啊,出去撸串啊,小 * 丝:没时间啊,鱼哥小鱼:嗯??? 啥事情让你忙的撸串都不去了小 * 丝:我的BOSS让我写一个自动化
- 领会下面这个示例吧,其实跟java中wait/nofity是一样一样的道理import threading# 条件变量,用于复杂的线程间同步
- 解决项目pycharm能运行,在终端却无法运行的问题报 ModuleNotFoundError: No module named '
- 免费手机号码归属地API查询接口和PHP使用实例分享最近在做全国性的行业分类信息网站,需要用到手机号归属地显示功能,于是就穿梭于各大权威站点
- PyGame是一个Python的库,能够让你更容易的写出一个游戏。它提供的功能包括图片处理和声音重放的功能,并且它们能很容易的整合进你的游戏
- Python 操作 Excel本篇博客介绍一种 Python 操作 Excel 的办法,核心用到 xlrd与xlwt模块。xlrd 
- 今天下午主要做了个实验,是针对 测试表的列,进行添加,修改,删除的。做法如下: 增加一列: alter table emp4 add tes
- PHP str_split() 函数实例把字符串 "Hello" 分割到数组中:<?php print_r(str
- 目录一、jieba库概述二、jieba库安装三、jieba分词的原理四、jieba分词的3种模式五、jieba库常用函数六、文本词频示例七、
- 1.背景在python运行一些,计算复杂度比较高的函数时,服务器端单核CPU的情况比较耗时,因此需要多CPU使用多进程加快速度2.函数要求笔
- 前言光流flow特征中包含了一个视频当中运动相关的信息,在视频动作定位当中光流特征使用的比较多,所以记录一下提取光流特征的方法。使用的方法是
- 注意,一般官方接口都带有可导功能,如果你实现的层不具有可导功能,就需要自己实现梯度的反向传递。官方Linear层:class Linear(
- 本文实例讲述了python每次处理一个字符的三种方法。分享给大家供大家参考。具体方法如下:a_string = "abccdea&
- 本文实例讲述了Python 面向对象之封装、继承、多态操作。分享给大家供大家参考,具体如下:封装、继承、多态 是面向对象的3大特性为啥要封装
- urllib的基本用法urllib库的基本组成利用最简单的urlopen方法爬取网页html利用Request方法构建headers模拟浏览
- 一、朋友圈九宫格效果图二、图片基本操作打开要处理的图片判断打开的图片是否为正方形如果是正方形,就进行九等分,如果不是正方形,先用白色填充为正
- 前言 简述bs4:使用pip install beautifulsoup4将bs4包安装到当前的python解释器环境,使用fro
- 随着国家发展,中国很多城市的空气质量其实并不好,国家气象局会有实时统计,但是要去写爬虫爬取是十分麻烦的事情,并且官方网站也会做一些反爬虫措施
- 包的使用1.首次导入模块发生的事情3件事情先产生一个执行文件的名称空间:1.创建模块文件的名称空间2.执行模块文件中的代码 将产生的名字放入