自学内容网 自学内容网

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)!