web--python处理http

web--python处理http

  • 发送请求

import requests
1.get发送请求

发送请求到指定的url

get(url,params,args...)  

get请求

引用百度来说:

htpps://www.baidu.com/s?wd=requests

import requests

u="http://www.baidu.com/s"

kw={"wd":"requests"}

head={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0"}

#paerams 安装字典的方式进行处理最后变成这个url拼接
#url+=kw["wd"]
#head请求头
b=requests.get(url=u,params=kw,headers=head)

用fiddier抓包查看

2.post请求

发送请求到指定URL

post(url,data,json....)

发生data数据

import requests
 #发送带post请求的参数
   
url="http://www.baidu.com/"
data={'key1':'value1','key2':'value2'} 
b=requests.post(url=url,data=data)
#输出响应内容
print(b.text)

发送文件

import requests
#发送文件,data.txt以字典的形式传递
files={'file':open('data.txt','rb')}
b=requests.post(url="http://www.baidu.com/s",files=files)
#返回响应
print(b.text)
3.向指定url发指定请求送请求
request.request(method,url,...)

例子:

b=request.request('get','https://www.')

其他参数

  • SLL证书验证

    在发送HTTPS请求时候,默认会验证SSL证书,应该不想验证就加上verify参数为false

    requests.get('https://www.baidu.com',verify=false)
    
  • 代理设置

    有时候我们需要通过代理服务器发送请求,可以通过proxies参数设置参数设置。

    import requests
    
    #设置代理
    proxies={"http":"http://127.0.0.1:7890","https":"http://127.0.0.1:7890"}
    b=requests.get(url="http://www.baidu.com/s",proxies=proxies)
    

响应

  • 每次调用request时候会返回一个request对象,该对象包含了具体的响应信息,如状态,响应头,响应内容。

  • 例如,text(返回响应内容,unicode)数据类型

    status_code (返回状态码404,200)

    import requests
    
    x=requests.get(url="http://www.baidu.com/s")
    
    print(x.headers)#获取响应头
    print(x.cookies)#获取cookies
    print(x.status_code)#获取状态码
    print(x.reason)#获取状态码
    
    print(x.text)
    
    
    {'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Connection': 'keep-alive', 'Content-Length': '1488', 'Content-Type': 'text/html', 'Date': 'Sun, 20 Apr 2025 09:39:23 GMT', 'Etag': 'W/"67eca4af-5d0"', 'Last-Modified': 'Wed, 02 Apr 2025 02:45:03 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS', 'Set-Cookie': 'BAIDUID=392328DD3C3FA4AE9130441D7C2F8A81:FG=1; expires=Mon, 20-Apr-26 09:39:23 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1', 'Strict-Transport-Security': 'max-age=31536000', 'Tracecode': '37537189932849812490042017', 'Vary': 'Accept-Encoding'}
    <RequestsCookieJar[<Cookie BAIDUID=392328DD3C3FA4AE9130441D7C2F8A81:FG=1 for .baidu.com/>]>
    200
    OK
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="utf-8">
    
        <meta http-equiv="Content-Type" content
    

处理复杂数据lxml

介绍

  • lxml是xml和html的解析器,其主要功能是解析和提取xml和Html中的数据

  • lxml可以利用Xpth语法,来定位特定的元素及节点信息

安装

  • pip install lxml

使用

  • 导入lxml中的tree

    from lxml import etree
    
  • 转换html页面,获得一个代表整个文档的数状结构

​ page=etree.HTML(request.text)

  • 使用Xpath表达式选择html

    page.xpath()

  • 转换输出

    print(etree.tostring(element,encoding="unicode"))

xpah

节点选择

XPath用于在XML文档中定位和选择节点,以下是XPath的一些常用用法:

image-20250420175340646

  1. 选择所有节点

    使用双斜杠//选择文档中的所有节点,例如://node()
    
  2. 按标签名选择节点:

使用标签名选择节点,例如://book
  1. 按属性选择节点
使用方括号[]和@符号选择具有特定属性值的节点,例如://book[@category="children"]
  1. 选择父节点、子节点和兄弟节点

    使用父节点(…)、子节点(/)和兄弟节点(//)选择节点,例如://book/title/..、//book/author/following-sibling::title等
    
  2. 使用通配符选择节点:

    使用星号*选择任何节点,例如://book/*选择所有book节点的子节点
    
  3. 使用逻辑运算符选择节点:

    使用and、or、not等逻辑运算符选择节点,例如://book[price<10 and @category="children"]
    
  4. 使用内置函数处理节点:

    使用内置函数处理节点的文本和数值,例如://book[substring(title,1,3)="The"]选择标题以"The"开头的书籍
    在Python中,使用lxml库的etree模块可以方便地使用XPath进行节点定位和选择。例如,可以使用etree.parse()函数解析XML文档,并使用xpath()方法执行XPath表达式,以便选择和操作XML文档中的节点。
    

路径表达式

image-20250420175819658

XPath路径表达式的基本语法如下:
/          : 从根节点开始,定位到目标节点
//         : 从当前节点开始,递归查找所有符合条件的节点
.          : 表示当前节点
..         : 表示当前节点的父节点
*          : 匹配任意节点
@          : 表示属性节点
[]         : 表示谓词,用于筛选符合条件的节点

/                 : 定位到根节点
/bookstore        : 定位到根节点下的bookstore节点
/bookstore/book   : 定位到bookstore节点下的所有book节点
//book            : 递归查找所有book节点
//book[@category='web'] : 查找所有category属性值为web的book节点

image-20250420180230132

实战一下

豆果美食

image-20250420180550140

我们小试牛刀

image-20250420193850867

我们提取豆果美食

image-20250420194234476

image-20250420194244075

import lxml
from lxml import etree
import requests
url ='https://www.douguo.com/'
res=requests.get(url)
print(res.text)
html=etree.HTML(res.text)
#从根节点选取
rest=html.xpath('/html/head/title')#返回element对象
print(rest)

我们在xpath代码里面加入text(),/text() 获取Element对象的元素内容(元素文本)

image-20250420194451590

image-20250420194500196

import lxml
from lxml import etree
import requests
url ='https://www.douguo.com/'
res=requests.get(url)
print(res.text)
html=etree.HTML(res.text)
#从根节点选取
rest=html.xpath('/html/head/title/text()')#返回element对象
print(rest)

// 获取任何位置的数据,不从根路径出发

import lxml
from lxml import etree
import requests
url ='https://www.douguo.com/'
res=requests.get(url)
print(res.text)
html=etree.HTML(res.text)

# // 获取任何位置的数据,不从根路径出发
title_text = html.xpath('//title/text()')  # 一般会获取多个数据
print(title_text)

image-20250420194823375

/@属性名 获取标签中的属性名的内容

import lxml
from lxml import etree
import requests
url ='https://www.douguo.com/'
res=requests.get(url)
print(res.text)
html=etree.HTML(res.text)
# /@属性名  获取标签中的属性名的内容
attr = html.xpath('//meta/@name')
print(attr)

image-20250420194950128

谓语 (相当于python里面的索引,条件) 选取数据中某部分数据

import lxml
from lxml import etree
import requests
url ='https://www.douguo.com/'
res=requests.get(url)
print(res.text)
html=etree.HTML(res.text)
# 谓语 (相当于python里面的索引,条件)
# 选取数据中某部分数据
index = html.xpath('/html/head/meta[3]')  # meta[3] 获取meta里面的第3个参数
print(index)





image-20250420195159412

last() 获取最后面的数据

import lxml
from lxml import etree
import requests
url ='https://www.douguo.com/'
res=requests.get(url)
print(res.text)
html=etree.HTML(res.text)
# last() 获取最后面的数据

index = html.xpath('/html/body/div[1]/div/a[last()]')  # meta[3] 获取meta里面的第3个参数
print(index)


image-20250420195250538

position()❤️ 获取索引小于3的数据

import lxml
from lxml import etree
import requests
url ='https://www.douguo.com/'
res=requests.get(url)
print(res.text)
html=etree.HTML(res.text)
# position()<3  获取索引小于3的数据
index = html.xpath('/html/body/div[1]/div/a[position()<3]')  # meta[3] 获取meta里面的第3个参数
print(index)

image-20250420195342080

未知节点 不管是什么标签名 只要其中有class="meta1"就获取到

import lxml
from lxml import etree
import requests
url ='https://www.douguo.com/'
res=requests.get(url)
print(res.text)
html=etree.HTML(res.text)
# 未知节点
index = html.xpath('//*[@class="item"]')
# 不管是什么标签名 只要其中有class="meta1"就获取到
print(index)

image-20250420195809854

获取全部数据

import time
import requests
from lxml import etree
from tabulate import tabulate

url = 'https://www.douguo.com/'

res = requests.get(url)

print(res.text)
# html = etree.HTML(res.text)
首先我们需要认识一行代码
html = etree.HTML(res.text)

这行代码的作用是将 HTTP 响应中的 HTML 文本解析为一个 Element 对象,以便后续对其进行操作,例如提取数据、修改内容、查找元素等等。其中,etree 是 Python 的一个第三方库,可以用来解析 XML 和 HTML 文本。HTML 是一种标记语言,用于构建网页和 Web 应用程序的用户界面。
我们在使用的时候,需要导入,代码如下:
from lxml import etree

开始使用Xpath来解析数据:

html = etree.HTML(res.text)
name = html.xpath(f'//*[@id="content"]/ul[1]/li[1]/div/a/text()')
print(name)

很好,我们通过一行代码获取了第一个美食的名字,一共有八个美食,我们不可能写八行代码来获取名字吧,虽然可以,但太繁琐,不宜使用。我们可以使用循环,他们之间一定有内在的联系,通过解析发现,他们路径基本上相同,不同的li[i]里面的值,我们通过循环来获取名字

html = etree.HTML(res.text)
for i in range(1, 9):
    name = html.xpath(f'//*[@id="content"]/ul[1]/li[{i}]/div/a/text()')
# name1 = html.xpath(f'//*[@id="content"]/ul[1]/li[2]/div/a/text()')
# name2 = html.xpath(f'//*[@id="content"]/ul[1]/li[3]/div/a/text()')
    print(name)
# print(name1)
# print(name2)

我们获取了想要的数据l,是不是很简单,其实我们还可以美化一下。

将名字和作者的数据以表格的形式输出。具体实现方式是使用tabulate库中的tabulate函数,将数据列表和表头传入函数中,设置输出格式为orgtbl,最后将输出结果打印出来。

    result = tabulate([[name, author]], headers=['Name', 'Author'], tablefmt='orgtbl')
    print(result)

源代码

import time
import requests
from lxml import etree
from tabulate import tabulate

url = 'https://www.douguo.com/'

res = requests.get(url)

# print(res.text)
html = etree.HTML(res.text)
for i in range(1, 9):
    name = html.xpath(f'//*[@id="content"]/ul[1]/li[{i}]/div/a/text()')
    author = html.xpath(f'//*[@id="content"]/ul[1]/li[{i}]/div/p/a[1]/text()')
    print(name)
    print(author)

    result = tabulate([[name, author]], headers=['Name', 'Author'], tablefmt='orgtbl')
    print(result)


posted @ 2025-04-21 22:15  Godjian  阅读(40)  评论(0)    收藏  举报