ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Python 爬虫入门:Requests 请求与 XPath 数据解析

Python 爬虫入门:Requests 请求与 XPath 数据解析 今天开始学习 Python 爬虫。爬虫的主要工作可以简单概括为发送请求 → 获取网页 → 解析内容 → 提取数据这几个步骤看起来简单但每一步都有很多细节。今天主要学习了requests库、网页响应对象、HTML 节点、XPath 路径表达式以及常用 XPath 函数。一、什么是爬虫爬虫程序可以自动访问网页并从网页中提取我们需要的信息。例如获取新闻标题抓取商品名称和价格提取电影评分下载图片统计网页中的链接获取公开网页中的表格数据。浏览器访问网页时背后也会向服务器发送 HTTP 请求。服务器处理请求后会返回 HTML、JSON、图片或其他内容。Python 爬虫做的事情就是用代码模拟这种请求再解析服务器返回的数据。一个简单的爬虫流程如下准备目标网址 ↓ 使用 requests 发送请求 ↓ 获取 response 响应对象 ↓ 读取 HTML 内容 ↓ 使用 XPath 定位节点 ↓ 清洗并保存数据需要注意爬虫只能抓取公开且允许访问的内容不能绕过登录、验证码、权限控制或网站的访问限制。二、使用 requests 发送 GET 请求安装requestspip install requests发送 GET 请求import requests url https://www.example.com response requests.get(url) print(response)response是一个响应对象类型通常是requests.models.Response如果输出Response [200]说明服务器正常返回了响应。常见状态码包括状态码含义200请求成功301、302重定向403没有权限访问404页面不存在500服务器内部错误发送请求时建议设置超时时间避免服务器迟迟不响应response requests.get( url, timeout10 )也可以先判断请求是否成功response.raise_for_status()如果响应状态码是 4xx 或 5xxraise_for_status()会抛出异常。三、Response 响应对象服务器返回的内容会保存在response对象中。1. response.encoding表示响应内容使用的编码格式response.encoding utf-8如果网页出现中文乱码可以尝试设置正确编码。2. response.text以字符串形式返回网页源码html response.text print(html)这是解析 HTML 时最常用的属性。3. response.content以二进制形式返回响应内容content response.contentcontent适合处理图片、压缩文件或其他非文本数据with open(image.jpg, wb) as file: file.write(response.content)4. response.url返回最终访问的网址print(response.url)当网页发生重定向时最终 URL 可能与最初请求的 URL 不同。5. response.status_code返回 HTTP 状态码print(response.status_code)6. response.headers返回响应头print(response.headers)响应头中可能包含内容类型、服务器信息、编码格式和缓存信息。四、设置请求参数如果网址中有查询参数可以使用paramsparams { page: 1, keyword: Python } response requests.get( https://www.example.com/search, paramsparams ) print(response.url)Requests 会自动把参数拼接到 URL 后面。有些网站会根据请求头判断访问者是不是浏览器。可以设置headersheaders { User-Agent: ( Mozilla/5.0 (Windows NT 10.0; Win64; x64) ) } response requests.get( url, headersheaders, timeout10 )如果需要使用代理可以通过proxies参数proxies { http: http://127.0.0.1:7890, https: http://127.0.0.1:7890 } response requests.get( url, proxiesproxies, timeout10 )代理地址需要根据实际环境填写没有代理时不需要设置。五、POST 请求GET 请求通常用于获取数据POST 请求常用于提交数据。data { username: test, password: 123456 } response requests.post( https://www.example.com/login, datadata, timeout10 )如果接口接收 JSON 数据可以使用payload { name: 小明, age: 18 } response requests.post( url, jsonpayload, timeout10 )实际爬虫中要根据网页请求方式选择 GET 或 POST。不能看到一个网址就默认使用 GET。六、认识 HTML 节点网页本质上是由 HTML 标签组成的。例如html body div classarticle h1Python 爬虫入门/h1 p这是文章内容/p /div /body /html这些标签在 XPath 中叫作节点。常见节点类型包括1. 元素节点例如div/div h1/h1 p/p2. 属性节点例如div classarticle/div这里的classarticle就是属性。3. 文本节点例如button百度一下/button其中的“百度一下”就是文本节点。4. 根节点整个 HTML 文档的最外层节点通常是根节点html/html节点之间存在层级关系父节点子节点兄弟节点根节点。例如div p第一段/p p第二段/p /divdiv是两个p的父节点两个p互相是兄弟节点。七、使用 lxml 解析网页Python 中常使用lxml配合 XPath 解析网页pip install lxml基本代码如下import requests from lxml import etree url https://www.example.com response requests.get( url, headersheaders, timeout10 ) response.encoding utf-8 html etree.HTML( response.text ) result html.xpath( //h1/text() ) print(result)etree.HTML()会把网页源码转换成可以使用 XPath 查询的 HTML 树。XPath 查询的结果通常是列表即使只找到一个节点也可能返回[Python 爬虫入门]八、XPath 的基本语法1. 选择元素节点/html/body/div表示从根节点开始依次查找html、body和div。2. 使用////div表示查找文档中任意位置的div不需要写出完整层级。3. 使用..表示当前节点。4. 使用....表示当前节点的父节点。5. 使用//div/class表示获取div节点的class属性。6. 获取文本//button/text()表示获取button节点中的文本。例如titles html.xpath( //h1/text() ) for title in titles: print(title.strip())九、XPath 的节点选择可以按照标签、属性和文本选择节点# 选择所有div元素 html.xpath(//div) # 选择class为article的div html.xpath(//div[classarticle]) # 选择所有包含class属性的div html.xpath(//div[class]) # 选择button中的文本 html.xpath(//button/text())如果属性值包含多个 class直接使用等号可能不够准确div classarticle item/div可以使用contains()//div[contains(class, article)]在代码中items html.xpath( //div[contains(class, article)] )十、XPath 运算符XPath 中常见的路径运算符如下1. 单斜杠//html/body/div表示按照完整层级查找。2. 双斜杠////div表示从当前范围内任意位置查找div。3. 点..表示当前节点。4. 双点....表示当前节点的父节点。5.//a/href表示获取链接节点的href属性。例如links html.xpath( //a/href ) for link in links: print(link)十一、XPath 下标和谓词XPath 可以使用中括号进行筛选。选择第一个li//ul/li[1]选择最后一个li//ul/li[last()]选择前四个li//ul/li[position() 5]选择包含指定属性的节点//div[classitem]选择文本内容//button[text()百度一下]对应 Python 代码items html.xpath( //ul/li[position() 5]/text() ) print(items)需要注意XPath 下标从1开始而 Python 列表下标从0开始。这是初学者经常混淆的地方。十二、XPath 常用字符串函数1. contains()检查字符串是否包含指定内容//div[contains(class, item)]Python 示例nodes html.xpath( //div[contains(class, item)] )2. starts-with()检查字符串是否以指定内容开头//a[starts-with(href, https)]3. string-length()返回字符串长度//p[string-length(text()) 10]这表示选择文本长度大于 10 的p节点。这些函数适合处理 class 名称不完全固定、链接前缀相同或者文本长度不同的网页。十三、XPath 数字函数和逻辑运算符XPath 也支持一些数字函数sum() floor() ceiling()例如sum(//span/data-price)可以尝试计算多个属性值的总和。逻辑运算符包括and or not()例如//div[classitem and data-typebook]表示同时满足两个条件。//div[classbook or classmovie]表示满足其中一个条件。//div[not(hidden)]表示选择没有hidden属性的节点。十四、一个简单的网页提取案例下面模拟提取网页中的文章标题和链接import requests from lxml import etree url https://www.example.com headers { User-Agent: ( Mozilla/5.0 (Windows NT 10.0; Win64; x64) ) } response requests.get( url, headersheaders, timeout10 ) response.raise_for_status() response.encoding utf-8 html etree.HTML(response.text) titles html.xpath( //h2[contains(class, title)]/text() ) links html.xpath( //h2[contains(class, title)]/a/href ) for title, link in zip(titles, links): print({ title: title.strip(), link: link })这里的流程是使用requests.get()请求网页使用raise_for_status()检查请求是否成功设置编码将网页源码转换为 HTML 树使用 XPath 获取文章标题使用 XPath 获取链接使用zip()将标题和链接对应起来。如果网页结构发生变化XPath 也需要相应调整。十五、爬虫中的常见问题1. 网页乱码可以尝试response.encoding utf-8有些网站的编码可以从响应头或网页源码中判断。2. 请求超时应该设置timeout10并使用异常处理try: response requests.get( url, timeout10 ) except requests.RequestException as error: print(f请求失败{error})3. XPath 找不到数据首先检查XPath 是否写错网页是否使用 JavaScript 动态加载节点是否位于 iframe 中返回的网页源码是否与浏览器看到的内容相同class 是否包含多个值。4. 请求被拒绝可以检查状态码print(response.status_code)也可以设置合理的User-Agent并降低请求频率。十六、总结今天学习的内容可以分成两部分。第一部分是requestsget()发送 GET 请求post()发送 POST 请求text获取字符串形式的网页源码content获取二进制数据status_code获取状态码headers获取响应头encoding设置编码格式url获取最终访问地址params传递查询参数proxies设置代理。第二部分是 XPath/按照完整路径查找//从任意位置查找.表示当前节点..表示父节点选择属性text()获取文本contains()检查是否包含字符串starts-with()检查字符串开头last()选择最后一个节点position()按位置筛选节点and、or、not()进行逻辑判断。爬虫的核心并不是简单地“复制网页内容”而是先理解网页结构再选择合适的请求和解析方式。掌握requests和 XPath 后就可以完成很多静态网页的数据提取任务。后续还可以继续学习 BeautifulSoup、正则表达式、动态网页处理以及数据保存到 CSV、Excel 和数据库。看到最后奖励一个后羿采集器直接文章搜索下载就行爬虫神器嘿嘿嘿
返回列表