掘金 后端 ( ) • 2024-04-11 11:00

Web抓取初探:网络世界的小探险

"带上你的数字化望远镜,我们一起去进行一次网络世界的小探险,抓取的数据就是我们的宝藏。"

嘿,未来的网络探险家们,准备好开始我们的探险了吗?今天,我们要成为网络的主宰者,用我们的Python魔法棒,去进行一次充满奇幻的网络小探险。在这个数字世界里,抓取的数据就是我们寻找的宝藏,它们隐藏在各个网页的角落等待着我们去发现。

网页是什么?

想象一下,网络世界就像是一个巨大的图书馆,而每一本书就是一张网页。这些网页就像是不同的故事书,里面有文字、有图片,甚至有时还会有小动画,给我们带来信息和知识。

HTTP协议简介

那么,我们是怎样阅读这些故事书的呢?这就要用到一种叫做HTTP(超文本传输协议)的魔法。当你在浏览器里输入一个网址,比如“https://www.baidu.com/”,你其实是在使用HTTP协议,向互联网的那个图书馆发送一个请求:“嘿,我想看https://www.baidu.com/这本书!”然后,图书馆就会把这本书送到你的电脑上,让你可以阅读它。

HTML简介

网页是用一种叫做HTML(超文本标记语言)的特殊语言写成的。你可以把HTML想象成书写故事书的笔。它可以告诉电脑这里应该有一段文字,那里应该有一张图片,还可以决定文字和图片应该排列在什么位置。这就是为什么每个网页看起来都不一样,因为它们是用HTML以不同的方式来编写的。

Requests和BeautifulSoup简介

现在,我们知道了网页是用HTML写成的,那么如何用Python来阅读这些故事书呢?这就要请出我们的两位好朋友:requestsBeautifulSoup了。

  • Requests:它就像是我们的传送带,可以帮我们把想要阅读的网页从互联网的图书馆送到我们的电脑上。只要告诉它你想看哪本书(网址),它就会帮你拿到。
  • BeautifulSoup:得到书之后,我们还需要一个聪明的助手来帮我们理解书中的内容。BeautifulSoup就是这样一个助手,它可以帮助我们理解HTML,找到我们感兴趣的信息,比如书中的特定段落或者图片。

Web抓取初探:拿起你的数字化望远镜

在这次探险中,我们的望远镜是requestsBeautifulSoup,这两个强大的Python库。requests让我们可以轻松地向网站发送请求,就像是敲开网络世界的大门;而BeautifulSoup则帮助我们解析网页内容,找到宝藏所在。

安装探险工具

在出发之前,让我们先准备好我们的探险工具。打开你的控制台,使用下面的咒语安装这些工具:

pip install requests beautifulsoup4

**requests**发送探险请求

现在,让我们用requests向目标网站发送一个请求,这就像是向网络世界发出了一个探险邀请:

import requests

# 这是我们的探险目标网址
url = 'https://www.baidu.com'
response = requests.get(url)

# 检查是否成功接受了探险邀请
if response.status_code == 200:
    print("成功连接到网站!")
else:
    print("网站无法访问,探险遇到了障碍。")

使用望远镜寻找宝藏:BeautifulSoup

得到网站的回应后,我们就可以使用BeautifulSoup来解析网页的内容了,寻找我们的宝藏:

from bs4 import BeautifulSoup
import requests

# 这是我们的探险目标网址
url = 'https://www.baidu.com'
response = requests.get(url)

# 检查是否成功接受了探险邀请
if response.status_code == 200:
    print("成功连接到网站!")

    # 使用不同的编码方式解析网页内容
    soup = BeautifulSoup(response.content, 'html.parser', from_encoding='utf-8')

    # 假设我们在寻找所有的标题
    titles = soup.find_all('a')

    # 打印找到的宝藏
    for title in titles:
        print(title.text)
else:
    print("网站无法访问,探险遇到了障碍。")

上面这段代码的主要目标是从指定的网址获取网页内容,并使用 BeautifulSoup 库对网页内容进行解析。它的功能是找到网页中所有标题的文本内容,并打印输出。

代码的执行步骤如下:

  1. 导入 BeautifulSoup 和 requests 库。
  2. 指定要获取内容的网址。
  3. 使用 requests.get() 函数发送 GET 请求,获取网页内容,并将结果存储在 response 变量中。
  4. 检查是否成功获取网页内容。如果响应状态码为 200,表示成功连接到网站。
  5. 创建 BeautifulSoup 对象,传入网页内容和解析器类型,并指定网页的编码方式为 UTF-8。
  6. 使用 find_all() 方法搜索网页中的所有标题元素,并将结果保存在 titles 变量中。
  7. 遍历 titles 列表,打印每个标题的文本内容。
  8. 如果无法访问网站(响应状态码不是 200),则打印相应的错误提示。

这段代码的目的是展示如何使用 BeautifulSoup 库从网页中提取信息。通过解析网页内容,可以获取到标题等特定的元素。

小探险示例:抓取天气预报

想象一下,如果我们想要抓取网上的天气预报,告诉我们未来一周的天气情况,那该怎么做呢?让我们模拟这个探险过程:

from bs4 import BeautifulSoup
import requests

# 假设这是提供天气预报的网站
weather_url = 'http://www.nmc.cn/publish/forecast/ACQ/yubei.html'

# 发送请求
weather_response = requests.get(weather_url)

# 解析网页
weather_soup = BeautifulSoup(weather_response.content, 'html.parser')

# 假设天气预报是保存在 class 为"forecast"的 div 里
city = weather_soup.find('div', class_='cityName').text.strip()

# 假设温度是保存在 id 为 "realTemperature" 的元素中
temperature = weather_soup.find(id='realTemperature').text.strip()

print(city)
print(temperature)

小结

探险家们,今天我们学习了如何成为网络的主宰者,进行了一次激动人心的网络世界小探险。记住,Web抓取就像是一场无尽的寻宝游戏,网络世界里充满了未知和惊喜。随着你的Python技能越来越强,你将能够探索更多的网络宝藏。

但是,朋友们,作为一名负责任的网络探险家,我们也要遵守规则,尊重目标网站的robots.txt规则,不要给网站带来过重的负担,让我们的探险之旅充满乐趣又充满善意!

现在,拿起你的数字化望远镜,开始你的网络小探险吧!记得分享你找到的宝藏哦!

请求与响应:对话服务器

"在网络世界里,服务器就像是守护宝藏的巨龙,学会发送请求,就像是学会了用正确的口令与巨龙对话,让它为你打开宝库。"

好的,朋友们,今天我们要学习的是如何在网络世界里成为一位真正的探险家和主宰者!想象一下,互联网是一个充满宝藏的巨大迷宫,而在这个迷宫里,有一些巨龙(服务器)守护着这些宝藏(数据)。要想获取这些宝藏,我们就需要学会如何与巨龙进行对话——也就是发送网络请求。

请求与响应:与巨龙的对话

在网络世界里,我们与巨龙对话的方式叫做HTTP请求。当你在浏览器地址栏输入一个网址时,你其实就是在向一个巨龙发送一个请求,说:“嘿,巨龙,我想看看你守护的那个网页。”如果巨龙心情好(服务器能找到那个网页),它就会回应你,把网页送过来,这就是一个响应。

请求的种类

与巨龙对话有很多种方式,也就是不同类型的HTTP请求。最常见的有两种:

  • GET请求:就像是问巨龙要点东西,“请给我那个网页。”
  • POST请求:就像是给巨龙一些东西,比如填写一个表单,“巨龙,记录下我的这些信息。”

专业定义

在网络通信中,HTTP(Hypertext Transfer Protocol)是一种用于通信的协议。HTTP 定义了客户端和服务器之间传输和处理数据的规则。HTTP 定义了多种请求方法(也称为 HTTP 方法、HTTP 动词或 HTTP 动作),其中最常见的是 GET 和 POST 方法。

下面是对 GET 和 POST 请求方法的专业定义和简要介绍:

**GET 请求方法: **

  • 定义:GET 是一种用于从服务器获取资源的请求方法。
  • 特点:
    • GET 请求通过 URL(统一资源定位符)传递请求参数,参数包含在 URL 的查询字符串中。
    • GET 请求是幂等的,意味着多次连续发送相同的 GET 请求不会对服务器产生副作用(不会改变服务器状态)。
    • GET 请求对请求参数的长度存在限制,因为 URL 的长度是有限的。
    • GET 请求在浏览器中会被缓存,可以被书签保存。
    • GET 请求可以被浏览器的历史记录记录下来。
  • 示例:浏览器打开网页、获取网页的静态资源(例如图片、CSS、JavaScript 文件)。

**POST 请求方法: **

  • 定义:POST 是一种用于向服务器发送数据并请求服务器处理的请求方法。
  • 特点:
    • POST 请求将请求参数包含在请求体(request body)中,而不是 URL 中。
    • POST 请求对请求参数的长度没有限制。
    • POST 请求可以在 HTTP 请求头中设置相应的 Content-Type,以指定请求体内容的编码格式,常见的有 application/x-www-form-urlencoded(默认)和 multipart/form-data(用于上传文件)。
    • POST 请求可以对服务器产生副作用,即可能改变服务器状态。
    • POST 请求不会被浏览器缓存。
    • POST 请求不能被浏览器的历史记录记录下来。
  • 示例:提交表单数据、向服务器发送 JSON 数据、上传文件。

GET 和 POST 请求方法都是 HTTP 协议定义的标准方法,用于不同的请求场景。根据具体的需求和数据处理方式,选择合适的请求方法是很重要的。

适合不同的场景 具体如下:

GET 请求适合的场景:

  • 获取资源:GET 请求用于获取服务器上的资源,例如打开网页时,浏览器发送 GET 请求获取网页的 HTML、CSS、JavaScript 文件等静态资源。
  • 无副作用的数据获取:GET 请求是幂等的,多次连续发送相同的 GET 请求不会对服务器产生副作用(不会改变服务器状态)。因此,当需要获取数据而不对服务器进行修改时,可以使用 GET 请求。
  • URL 参数传递:GET 请求通过 URL 的查询字符串传递请求参数,参数可以直接在 URL 中看到,适用于向服务器传递少量非敏感的参数,例如搜索关键词、页面筛选条件等。

POST 请求适合的场景:

  • 提交表单数据:POST 请求常用于将表单数据提交给服务器进行处理,例如用户注册、登录。
  • 数据修改或创建:POST 请求对服务器产生副作用,可以用于向服务器提交数据并使服务器进行修改或创建资源的操作,例如创建、更新或删除页面上的内容。
  • 敏感数据传输:POST 请求将请求参数包含在请求体中,可以确保数据的安全性,适用于传输敏感信息(如密码)。
  • 大量数据传输:POST 请求没有 GET 请求对请求参数长度的限制,适合传输大量数据。

小结: GET 请求适用于获取资源、无副作用的数据获取和传递少量非敏感的参数。 POST 请求适用于提交表单数据、数据修改或创建,传输敏感信息以及传输大量数据。

使用Requests库发送请求

Python中有一个强大的法术书——requests库,可以帮助我们轻松地与巨龙进行对话。让我们来看看如何使用这个法术:

发送GET请求
import requests

# 向巨龙发送请求
response = requests.get('https://www.baidu.com')

# 检查巨龙的回应
if response.status_code == 200:
    print("巨龙给了我们宝藏!")
else:
    print("巨龙没有打开宝库。")
发送POST请求
import requests

data = {'name': '小魔法师', 'password': 'magic'}
response = requests.post('https://www.baidu.com/login', data=data)

if response.status_code == 200:
    print("巨龙接受了我们的信息!")
else:
    print("巨龙不理我们。")

请求的口令:Headers和Cookies

与巨龙对话时,有时候我们需要说一些特别的口令,这在网络请求中就是Headers和Cookies。

  • Headers:就像是对巨龙说,“我来自哪里,我是谁。”比如告诉巨龙你使用的浏览器类型。
  • Cookies:有时候巨龙会给你一些小饼干(Cookies),下次你再来时带上这些小饼干,巨龙就会记得你,“哦,是上次那个小朋友!”

专业定义

在网络通信中,HTTP(Hypertext Transfer Protocol)定义了一种用于客户端和服务器之间传输和处理数据的协议。在 HTTP 协议中,Headers(头部)和 Cookies(Cookie)是两个重要的概念。

Headers(头部)

  • 定义:HTTP 请求和响应中的头部是由一系列的键值对组成的,用于传递附加的信息和控制请求或响应的行为。
  • 作用:
    • 定义请求或响应的属性和行为,如 Content-Type(媒体类型)、Content-Length(内容长度)、User-Agent(用户代理)、Cache-Control(缓存控制)等。
    • 传递客户端和服务器之间的额外信息,如身份验证凭证、请求来源、请求时间等。

Cookies(Cookie)

  • 定义:Cookie 是服务器发送到客户端并存储在客户端的小型文本文件。客户端会在后续的请求中将 Cookie 信息发送回服务器。
  • 作用:
    • 记录用户的状态信息,如登录状态、购物车内容、个性化设置等。
    • 跟踪用户的访问行为和偏好,用于用户行为分析和广告定向。
    • 实现会话管理和状态保持,确保客户端和服务器之间的连续性。

Headers 和 Cookies 在 HTTP 通信中扮演着重要的角色:

  • Headers 提供了关于请求或响应的元数据信息,影响数据的处理方式和行为。
  • Cookies 提供了一种在多个请求之间共享和存储用户状态信息的机制。

通过合理使用 Headers 和 Cookies,可以实现更高效的数据传输和更好的用户体验。需要根据具体的需求和场景进行头部和 Cookie 的设置和管理。

简单示例

import requests

headers = {'User-Agent': 'Web Explorer 6.0'}
cookies = {'last_visit': 'yesterday'}

response = requests.get('https://www.baidu.com', headers=headers, cookies=cookies)

if response.status_code == 200:
    print("巨龙记得我们,并给了我们宝藏!")
else:
    print("我们需要更多的饼干。")

小结

朋友们,今天我们学会了如何与网络世界中的巨龙对话,获取我们想要的宝藏。记得,成为网络的主宰者不仅仅是获取宝藏那么简单,它还能帮助我们学习知识、探索世界。希望你们能喜欢这次探险,并且在未来的旅程中发现更多的宝藏!

记得,与巨龙对话时要礼貌,尊重巨龙守护的宝藏,不要过于频繁地打扰它们,这样我们才能成为真正的网络探险家。现在,拿起你的魔法棒,开始你的网络探险吧!

HTML解析:寻找网络的宝藏

"HTML就像是密布机关的古老地图,只有精通HTML解析的勇士,才能在这张地图上找到隐藏的网络宝藏。"

好的,勇敢的小探险家们,是时候展开一场刺激的宝藏寻找之旅了!在这个网络的世界里,HTML就像是一张古老而密布机关的地图。但别担心,只要你学会了HTML解析的魔法,就能成为一名真正的宝藏猎人,轻松找到隐藏在网页深处的宝藏。

HTML简介:网络宝藏地图

HTML(超文本标记语言)是构建网页的基础,它告诉浏览器如何显示网页的内容。想象一下,HTML是一张描绘着文字、图片和链接等宝藏的地图。每一个标签(Tag)都像是地图上的一个标记,指示着宝藏的位置。

BeautifulSoup:HTML解析的魔法书

要在HTML这张复杂的地图上寻宝,我们需要一本强大的魔法书——BeautifulSoup。它可以帮助我们理解HTML的结构,轻松地找到我们需要的信息。

安装BeautifulSoup

在开始我们的宝藏猎人之旅之前,首先确保你已经拥有了这本魔法书。在你的魔法终端(命令行)中使用这个咒语来安装它:

pip install beautifulsoup4

BeautifulSoup 常用的方法

BeautifulSoup 是一个功能强大的 Python 库,提供了许多方法和功能来解析和处理 HTML 和 XML。以下是 BeautifulSoup 常用的方法:

  1. 创建 BeautifulSoup 对象:
  • BeautifulSoup(html, 'html.parser'):使用 HTML 解析器创建一个 BeautifulSoup 对象来解析 HTML 内容。
  • BeautifulSoup(xml, 'xml'):使用 XML 解析器创建一个 BeautifulSoup 对象来解析 XML 内容。
  1. 选择器方法:
  • .find():查找符合指定选择器条件的第一个元素,并返回一个 Tag 对象。
  • .find_all():查找符合指定选择器条件的所有元素,并返回一个列表。
  • .select():使用 CSS 选择器来查找元素,返回一个列表。
  1. Tag 对象方法:
  • .text:获取该标签内的文本内容。
  • .get():获取指定属性的值。
  • .attrs:获取标签的所有属性,返回一个字典。
  1. 遍历和导航方法:
  • .contents:获取标签的直接子节点列表。
  • .children:获取标签的直接子节点的迭代器。
  • .parent:获取标签的父节点。
  • .next_sibling.previous_sibling:获取标签的下一个/上一个同级节点。
  1. 过滤方法:
  • .find_parents().find_parent():查找符合指定选择器条件的所有父节点/第一个父节点。
  • .find_next_siblings().find_next_sibling():查找符合指定选择器条件的所有同级节点/下一个同级节点。
  • .find_previous_siblings().find_previous_sibling():查找符合指定选择器条件的所有同级节点/上一个同级节点。
  1. 修改和操作方法:
  • .append().insert():向标签内添加子节点。
  • .extract():从文档中删除标签或其中的内容。

这些是 BeautifulSoup 中常用的方法,能够帮助处理和操作 HTML 或 XML 数据。根据具体的需求和操作场景,可以选择合适的方法进行数据提取、操作和处理。

创建 BeautifulSoup 对象

from bs4 import BeautifulSoup

# 创建一个 BeautifulSoup 对象并解析 HTML 内容
html = "<html><body><h1>Hello, BeautifulSoup!</h1></body></html>"
soup = BeautifulSoup(html, 'html.parser')

# 输出 BeautifulSoup 对象
print(soup)

选择器方法

from bs4 import BeautifulSoup

# 创建一个 BeautifulSoup 对象并解析 HTML 内容
html = "<html><body><div><p>Hello, World!</p></div><p>再见,世界!</p></body></html>"
soup = BeautifulSoup(html, 'html.parser')

# 使用 find() 方法查找第一个匹配的元素
first_p = soup.find('p')
print(first_p)

# 使用 find_all() 方法查找所有匹配的元素
all_p = soup.find_all('p')
print(all_p)

# 使用 select() 方法通过 CSS 选择器查找元素
div_p = soup.select('div p')
print(div_p)

Tag 对象方法

from bs4 import BeautifulSoup

# 创建一个 BeautifulSoup 对象并解析 HTML 内容
html = "<html><body><p class='greeting'>Hello, Python!</p></body></html>"
soup = BeautifulSoup(html, 'html.parser')

# 获取标签内的文本内容
p_tag = soup.find('p')
text_content = p_tag.text
print(text_content)

# 获取指定属性的值
class_value = p_tag.get('class')
print(class_value)

# 获取标签的所有属性
attrs = p_tag.attrs
print(attrs)

遍历和导航方法

from bs4 import BeautifulSoup

# 创建一个 BeautifulSoup 对象并解析 HTML 内容
html = "<html><body><div><p>你好,世界!</p><p>再见,世界!</p></div></body></html>"
soup = BeautifulSoup(html, 'html.parser')

# 获取标签的直接子节点列表
div_contents = soup.select('div')[0].contents
print(div_contents)

# 获取标签的直接子节点的迭代器
div_children = soup.select('div')[0].children
for child in div_children:
    print(child)

# 获取标签的父节点
p_tag = soup.find('p')
parent_tag = p_tag.parent
print(parent_tag)

# 获取标签的下一个同级节点和上一个同级节点
first_p = soup.find('p')
next_sibling = first_p.next_sibling
previous_sibling = first_p.previous_sibling
print(next_sibling)
print(previous_sibling)

过滤方法

from bs4 import BeautifulSoup

# 创建一个 BeautifulSoup 对象并解析 HTML 内容
html = "<html><body><div><p>你好,世界!</p><p>再见,世界!</p></div></body></html>"
soup = BeautifulSoup(html, 'html.parser')

# 查找符合指定选择器条件的父节点
p_tag = soup.find('p')
parent_tag = p_tag.find_parent('div')
print(parent_tag)

# 查找符合指定选择器条件的所有父节点
p_tag = soup.find('p')
parent_tags = p_tag.find_parents('div')
print(parent_tags)

# 查找符合指定选择器条件的所有同级节点
first_p = soup.find('p')
next_siblings = first_p.find_next_siblings('p')
print(next_siblings)

# 查找符合指定选择器条件的所有同级节点
first_p = soup.find('p')
previous_siblings = first_p.find_previous_siblings('p')
print(previous_siblings)

修改和操作方法

from bs4 import BeautifulSoup

# 创建一个 BeautifulSoup 对象并解析 HTML 内容
html = "<html><body><div><p>你好,世界!</p></div></body></html>"
soup = BeautifulSoup(html, 'html.parser')

# 向标签内添加子节点
div = soup.find('div')
div.append(BeautifulSoup("<p>再见,世界!</p>", 'html.parser'))
print(div)

# 从文档中删除标签或其中的内容
p = soup.find('p')
p.extract()
print(soup)

这些代码示例可以帮助你入门使用 BeautifulSoup。希望对你有所帮助!

小结

恭喜你,小探险家!现在你已经学会了如何使用BeautifulSoup这本魔法书来解析HTML地图,找到隐藏在网页深处的宝藏了。记住,每一个网页都是一片充满宝藏的新大陆,等待着你去探索。带上你的魔法书,勇敢地踏上寻宝之旅吧!

不过,朋友们,在进行宝藏猎人的探险时,也要记得尊重网站的规则,不要过度抓取网站数据,避免给网站带来负担。现在,拿起你的数字化望远镜,开始你的网络宝藏寻找之旅吧!分享你找到的宝藏,让我们一起享受探索的乐趣!

欢迎关注微信公众号【千练极客】,尽享更多干货文章!

欢迎关注微信公众号【千练极客】,尽享更多干货文章!

欢迎关注微信公众号【千练极客】,尽享更多干货文章!

本文由博客一文多发平台 OpenWrite 发布!