Python爬虫入门之初遇lxml库

1.爬虫是什么

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

2.爬虫三要素

  • 抓取
  • 分析
  • 存储

3.爬虫的过程分析

当人类去访问一个网页时,是如何进行的?
  ①打开浏览器,输入要访问的网址,发起请求。
  ②等待服务器返回数据,通过浏览器加载网页。
  ③从网页中找到自己需要的数据(文本、图片、文件等等)。
  ④保存自己需要的数据。

对于爬虫,也是类似的。它模仿人类请求网页的过程,但是又稍有不同。
  首先,对应于上面的①和②步骤,我们要利用python实现请求一个网页的功能。
  其次,对应于上面的③步骤,我们要利用python实现解析请求到的网页的功能。
  最后,对于上面的④步骤,我们要利用python实现保存数据的功能。
  因为是讲一个简单的爬虫嘛,所以一些其他的复杂操作这里就不说了。下面,针对上面几个功能,逐一进行分析。

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

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

如何模拟用户请求请看我的另一篇博客:爬虫入门之模拟用户请求_laoniu的博客-CSDN博客_爬虫模拟请求

4.1.抓取网页

  • urllib.request库使用
import urllib.requestresponse = 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-develpip3 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]  # 获取url的titlehref = tr.xpath("*/a/@href")[0] # 获取url的hrefhot = tr.xpath("string(td[2])").strip() # 获取热度print(f"{hot}\t{title}\thttps://www.baidu.com{href}")

点击运行,程序啪就跑起来了,很快啊,数据全都过来了,我全都接住了,我笑了一下。希望百度耗子为之

到此就完成了lxml xpath的基本使用,更详细的xpath教程请看 :XPath 教程

7.存储数据

紧接着存储数据,修改一下代码

print(f"article count : {len(_list)}")with open('g_data.text', 'w') as f:  # 在当前路径下,以写的方式打开一个名为'g_data.text',如果不存在则创建for tr in _list:title = tr.xpath("*/a/@title")[0]  # 获取url的titlehref = tr.xpath("*/a/@href")[0]  # 获取url的hrefhot = tr.xpath("string(td[2])").strip()  # 获取热度line = f"{hot}\t{title}\thttps://www.baidu.com{href}\n"f.write(line)  # 写入文件

8.补充

东西虽然不多,但是也是写了挺长时间,算是对自己学习的一个总结,也希望能够帮助大家,我也只是个菜鸟,文中错误的地方可以直接指出来

声明:切记爬虫不用于爬取网站敏感数据做违法行为,所产生的一切后果与本教程无关!

Python爬虫入门之初遇lxml库相关推荐

  1. [转载]Python爬虫入门三之Urllib库的基本使用

    python爬虫系列教程http://cuiqingcai.com/1052.html 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优 ...

  2. Python爬虫入门四之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  3. python爬虫入门四:BeautifulSoup库(转)

    正则表达式可以从html代码中提取我们想要的数据信息,它比较繁琐复杂,编写的时候效率不高,但我们又最好是能够学会使用正则表达式. 我在网络上发现了一篇关于写得很好的教程,如果需要使用正则表达式的话,参 ...

  4. Python爬虫入门三之Urllib库的基本使用

    转自:http://cuiqingcai.com/947.html 那么接下来,小伙伴们就一起和我真正迈向我们的爬虫之路吧. 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信 ...

  5. Python爬虫入门之Urllib库的基本使用

    那么接下来,小伙伴们就一起和我真正迈向我们的爬虫之路吧. 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解 ...

  6. 如何学习Python爬虫[入门篇]?

    这篇文章已经过去很久了,有一些学习资源链接已经失效了,还一直有小伙伴在Python的路上摸索.所以我根据自己的学习和工作经历整理了一套Python学习电子书,在公众号「路人甲TM」后台回复关键词「1」 ...

  7. python爬虫入门教程--优雅的HTTP库requests(二)

    requests 实现了 HTTP 协议中绝大部分功能,它提供的功能包括 Keep-Alive.连接池.Cookie持久化.内容自动解压.HTTP代理.SSL认证等很多特性,下面这篇文章主要给大家介绍 ...

  8. Python爬虫入门(4):Urllib库的高级用法

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  9. Python爬虫入门(3):Urllib库的基本使用

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  10. Python爬虫入门(8):Beautiful Soup的用法

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

最新文章

  1. 刀剑英雄登陆显示服务器繁忙,玩刀剑遇到问题解决方法
  2. 把数据库中有关枚举项值的数字字符串转换成文字字符串
  3. 执行phpize Cannot find config.m4
  4. Hyper-V P2V转换遇到的问题
  5. Maven 命令格式及一些常用命令
  6. 网络协议分析工具Ethereal的使用
  7. 水平居中布局与滚动条跳动的千年难题
  8. 想成为BAT中的一员,你总要去学点什么(二)
  9. Docker遇到的一些问题和感想
  10. Flask爱家租房--订单(房东接单、拒单)
  11. 我滴个乖乖,我复现了Spring的漏洞,害怕!
  12. Validator验证
  13. 2021年焊工(初级)考试试卷及焊工(初级)复审考试
  14. 常用二极管IN4148和单片机驱动的一些关系
  15. 30岁成功入职京东啦
  16. 定位position
  17. 嵌入式开发(S5PV210)——u-boot的头文件包含问题
  18. cydia java_Cydia for Android
  19. 数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树
  20. ETM黄皮书全球首发

热门文章

  1. 自己动手写网络爬虫学习笔记
  2. 网吧十大漏洞曝光(转)
  3. Nvme协议固态装纯净win10系统
  4. Win socket编程--IOCP完成端口模型
  5. 布线问题----回溯法
  6. 神策数据的进阶之路:从用户行为分析工具到全新的数字化营销闭环
  7. 【java期末复习题】第15章 JDBC数据库编程
  8. 世界地图可以无限放大_国外测评 | 老蛙百微镜头的全方位解析,2倍放大倍率的优质表现!...
  9. Java开发的文字RPG游戏,代码开源
  10. 中国慢病管理行业市场形势调查分析及价值研究报告2021-2027年版