Python爬虫进阶(基础方法介绍)
页面请求方式
在Python爬虫中,GET请求和POST请求是两种最常用的HTTP请求方法,它们各自有着不同的用途和行为。
get请求 | post请求 | |
---|---|---|
目的 | 主要用于请求访问已被URI(统一资源标识符)识别的资源。GET请求通常用于获取数据,而不是提交数据。 | 主要用于向服务器提交数据。POST请求通常用于更新资源或提交表单数据。 |
参数传递 | GET请求的参数通常附加在URL之后,通过? 分隔URL和传输数据,参数之间以& 相连。这种方式使得URL易于分享和书签化,但不适合传输敏感信息,因为URL会被记录在服务器日志、浏览器历史等地方。 | POST请求的参数包含在请求体中,而不是附加在URL之后。这使得POST请求可以传输大量数据,并且数据不会暴露在URL中,增加了数据的安全性。 |
缓存 | GET请求是可以被缓存的,这意味着相同的GET请求可能在不需要重新发送的情况下被浏览器或服务器缓存返回。 | POST请求通常不会被缓存(虽然可以通过设置HTTP头来指示缓存POST响应),因为它们是用于更改服务器上的资源或状态的。 |
长度限制 | 由于URL长度的限制(不同浏览器和服务器有不同的限制,但通常较短),GET请求携带的数据量相对较小。 | POST请求没有像GET请求那样的URL长度限制,因此可以传输大量数据。但是,服务器可能会对请求体的大小进行限制,这取决于服务器的配置。 |
安全性 | 由于GET请求的参数暴露在URL中,因此不适合传输敏感信息,如密码或个人信息。 | 由于POST请求的参数不会暴露在URL中,因此它们更适合传输敏感信息,如用户密码或个人信息。然而,仅仅使用POST并不足以保证数据的安全性,还需要考虑其他安全措施,如HTTPS加密。 |
两种请求在Python爬虫中的应用
在Python爬虫中,你可能会根据目标网站的要求和API的设计来选择使用GET请求还是POST请求。例如,如果你只需要从网站获取一些静态页面数据,那么使用GET请求可能就足够了。但是,如果你需要提交表单或登录到网站,那么你可能需要使用POST请求来发送必要的参数。
页面解析
在Python爬虫中,页面解析是指从下载的网页HTML内容中提取出我们感兴趣的数据。这个过程通常涉及到解析HTML文档,以便能够提取出文本、链接、图片等信息。Python提供了多种库来帮助我们进行页面解析,其中最常见的是BeautifulSoup和lxml。此外,requests库常用于发送HTTP请求并获取网页内容,它是页面解析过程的第一步。
这里我们介绍用lxml库里的etree.xpath的方法来获取我们想要的数据。
首先我们需要导入lxml库:
pip install lxml
这里提供了一个完整的html文件格式来让我们了解etree.xpath的用法:
test.html文件:
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>测试bs4</title>
</head>
<body>
<div>
<p>百里守约</p>
</div>
<div class="song">
你好
<p>李清照</p>
<p>王安石</p>
<p>苏轼</p>
<p>柳宗元</p>
<a href="http://www.song.com/" title="赵匡胤" target="_self">
<span>this is span</span>
宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a>
<a href="" class="du">总为浮云能蔽日,长安不见使人愁</a>
<img src="http://www.baidu.com/meinv.jpg" alt="" />
</div>
<div class="tang">
<ul>
清明时节雨纷纷,路上行人欲断魂
<li>
<a href="http://www.baidu.com" title="qing">
清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村
</a>
</li>
<li>
<a href="http://www.163.com" title="qin">
秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山
</a>
</li>
<li><a href="http://www.126.com" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li>
<li><a href="http://www.sina.com" class="du">杜甫</a></li>
<li><a href="http://www.dudu.com" class="du">杜牧</a></li>
<li><b>杜小月</b></li>
<li><i>度蜜月</i></li>
<li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li>
</ul>
</div>
</body>
</html>
通过下面的方法来获取test.html文件中我们想要文本内容:
from lxml import etree
if __name__ == '__main__':
tree = etree.parse("./test.html")
# xpath返回的都是列表
# / 表示一个层级
# 取所有p标签里的文本内容 加上text()就可以取到文本内容,不然取到的是一串编码
print(tree.xpath("/html/body/div/p/text()"))
# 输出:['百里守约', '李清照', '王安石', '苏轼', '柳宗元']
print(tree.xpath("/html/head/title"))
# # 定位百里守约 索引定位 从1开始
print(tree.xpath("/html/body/div[1]/p/text()")) # 输出:['百里守约']
print(tree.xpath("/html/body/div/p[1]/text()")) # 错误示例/输出:['百里守约', '李清照']
# 定位'总为浮云能蔽日,长安不见使人愁'
print(tree.xpath("/html/body/div[2]/a[2]/text()"))
# 定位'岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君'
print(tree.xpath("/html/body/div[3]/ul/li[3]/a/text()"))
# // 表示多个层级 标签属性定位 @class='id'
# 定位'岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君'
print(tree.xpath("//div[3]/ul/li[3]/a/text()"))
# 定位 李清照
print(tree.xpath("//div[@class='song']/p[1]/text()")) # 输出:['李清照']
# 定位'总为浮云能蔽日,长安不见使人愁'
print(tree.xpath("//div[@class='song']/a[@class='du']/text()"))
# 取<div class="tang">内的所有li标签
print(tree.xpath("//div[@class='tang']/ul/li"))
# 取li标签内的所有a标签
for li in tree.xpath("//div[@class='tang']/ul/li"):
try:
print("".join(li.xpath("./a/text()"))) # "".join将列表转换成字符串
except Exception as e:
pass
下一篇文章将展示如何实战爬取一个网站里我们想要的数据!
原文地址:https://blog.csdn.net/weixin_73504499/article/details/140591428
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!