# 少数可怕的时候,我没有 Wi-Fi。这时才意识到,我在计算机上所做的事,有多少实际上是在因特网上做的事。完全出于习惯,我会发现自己尝试收邮件、阅读朋友的推特,或回答
# 问题:“在Kurtwood Smith演出 1987 年的机械战警之前,曾经演过主角吗?”
# 1因为计算机上如此多的工作都与因特网有关,所以如果程序能上网就太好了。“Web 抓取”是一个术语,即利用程序下载并处理来自 Web 的内容。例如,Google 运行了许多 web 抓取程序,对网页进行索引,实现它的搜索引擎。在本章中,你将学习几个模块,让在 Python 中抓取网页变得很容易。
webbrowser 是 Python 自带的,打开浏览器获取指定页面。
requests  从因特网上下载文件和网页。
Beautiful Soup 解析 HTML,即网页编写的格式。
selenium 启动并控制一个 Web 浏览器。selenium 能够填写表单,并模拟鼠标在这个浏览器中点击。

webbrowser

import webbrowser

webbrowser.open('http://www.baidu.com')

requests 下载web文件

# 导入requests库,用于发送HTTP请求
import requests
# 发送GET请求到指定的URL,获取《Call of the Wild》的文本内容
res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
# 检查响应对象的类型,确保请求成功
type(res)
# 检查响应状态码是否为200(OK),表示请求成功
res.status_code == requests.codes.ok
# 获取响应文本的长度,即文本内容的字符数
len(res.text)
# 打印响应文本的前250个字符,用于预览文本内容
print(res.text[:250])

检查错误

import requests  # 导入requests库,用于发送HTTP请求
# 发送一个GET请求到指定的URL,该URL指向一个不存在的页面
res = requests.get('http://inventwithpython.com/page_that_does_not_exist')
try:
    # 尝试检查响应状态码,如果不是200(即请求成功),则抛出HTTPError异常
    res.raise_for_status()
except Exception as exc:
    # 捕获所有异常,并打印出错误信息
    print('There was a problem: %s' % (exc))

下载文件到硬盘

现在,可以用标准的 open()函数和 write()方法,将 Web 页面保存到硬盘中的一个文件。但是,这里稍稍有一点不同。首先,必须用“写二进制”模式打开该文件,即向函数传入字符串'wb',作为 open()的第二参数。即使该页面是纯文本的(例如前面下载的罗密欧与朱丽叶的文本),你也需要写入二进制数据,而不是文本数据,目的是为了保存该文本中“Unicode 编码”。

import requests  # 导入requests库,用于发送HTTP请求
# 发送GET请求到指定的URL,获取《罗密欧与朱丽叶》的文本文件
res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
# 检查请求是否成功,如果不成功则抛出HTTPError异常
res.raise_for_status()
# 打开一个名为'RomeoAndJuliet.txt'的文件,以二进制写模式('wb')
playFile = open('RomeoAndJuliet.txt', 'wb')
# 使用iter_content方法以100000字节为单位迭代响应内容
for chunk in res.iter_content(100000):
    # 将每个数据块写入文件
    playFile.write(chunk)
# 关闭文件,确保所有数据都被写入并释放资源
playFile.close()

HTML

# HTML 是一种标记语言,用于描述网页的结构和内容。HTML 使用标签来定义网页的不同部分,例如标题、段落、链接等。每个标签都有开始标签和结束标签,标签之间可以包含文本或其他标签。

# 假定你有一段时间没有看过 HTML 了,这里是对基本知识的快速复习。HTML文件是一个纯文本文件,带有.html 文件扩展名。这种文件中的文本被“标签”环绕,标签是尖括号包围的单词。标签告诉浏览器以怎样的格式显示该页面。一个开始标签和一个结束标签可以包围某段文本,形成一个“元素”。例如,下面的 HTML 文件包含一个标题和一个段落:
<strong>Hello</strong> world!  开始标签<strong>表明,标签包围的文本将使用粗体。结束标签</strong>告诉浏览器,粗体文本到此结束。
某些元素具有 id 属性,可以用来在页面上唯一地确定该元素。你常常会告诉程序,根据元素的 id 属性来寻找它。所以利用浏览器的开发者工具,弄清楚元素的 id属性,这是编写 Web 抓取程序常见的任务。

Beautiful Soup 模块解析HTML

Beautiful Soup 是一个 Python 库,用于解析 HTML 和 XML 文档。它可以将 HTML 或 XML 文档转换为一个树状结构,使得我们可以方便地访问和操作其中的元素。

从HTML创建一个BeautifulSoup对象

import requests, bs4
res = requests.get('https://www.baidu.com/s?wd=%E6%99%AF%E7%94%9C%E5%8C%BB%E7%94%9F%E9%80%A0%E5%9E%8B%E5%A5%BD%E6%9C%89%E6%84%9F%E8%A7%89&sa=fyb_n_homepage&rsv_dl=fyb_n_homepage&from=super&cl=3&tn=baidutop10&fr=top1000&rsv_idx=2&hisfilter=1') # 发送HTTP GET请求
res.raise_for_status() # 检查请求是否成功
noStarchSoup = bs4.BeautifulSoup(res.text) # 解析HTML内容
type(noStarchSoup)
print(noStarchSoup.title)
print(noStarchSoup.a) # 打印第一个<a>标签
print(noStarchSoup.select('title')) # 打印所有<title>标签
print(noStarchSoup.select('a')) # 打印所有<a>标签

也可以

exampleFile = open('example.html')
exampleSoup = bs4.BeautifulSoup(exampleFile) 
type(exampleSoup)
from bs4 import BeautifulSoup

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

soup = BeautifulSoup(html_doc, 'html.parser')

BeautifulSoup 对象的 prettify() 方法可以返回一个格式化的 HTML 字符串,其中每个标签和文本都缩进,以便于阅读和理解。

print(soup.prettify())

BeautifulSoup 对象的 find() 方法可以用来查找 HTML 文档中的特定元素。例如,下面的代码可以查找 HTML 文档中的第一个段落元素:

soup.find('p')

BeautifulSoup 对象的 find_all() 方法可以用来查找 HTML 文档中的所有特定元素。例如,下面的代码可以查找 HTML 文档中的所有链接元素:

soup.find_all('a')

BeautifulSoup 对象的 select() 方法可以用来查找 HTML 文档中的特定元素,使用 CSS 选择器语法。例如,下面的代码可以查找 HTML 文档中的所有 class 属性为 "sister" 的链接元素:

soup.select('a.sister')

CSS 选择器

# soup.select('div') 所有名为<div>的元素
# soup.select('#author') 带有 id 属性为 author 的元素
# soup.select('.notice') 所有使用 CSS class 属性名为 notice 的元素
# soup.select('div span') 所有在<div>元素之内的<span>元素
# soup.select('div > span') 所有直接在<div>元素之内的<span>元素,中间没有其他元素
# soup.select('input[name]') 所有名为<input>,并有一个 name 属性,其值无所谓的元素
# soup.select('input[type="button"]') 所有名为<input>,并有一个 type 属性,其值为 button 的元素
# ```
不同的选择器模式可以组合起来,形成复杂的匹配。例如,soup.select('p #author')将匹配所有 id 属性为 author 的元素,只要它也在一个<p>元素之内。
select()方法将返回一个 Tag 对象的列表,这是 Beautiful Soup 表示一个 HTML元素的方式。针对 BeautifulSoup 对象中的 HTML 的每次匹配,列表中都有一个 Tag
对象。Tag 值可以传递给 str()函数,显示它们代表的 HTML 标签。Tag 值也可以有attrs 属性,它将该 Tag 的所有 HTML 属性作为一个字典。
import bs4  # 导入BeautifulSoup库,用于解析HTML和XML文档
exampleFile = open('example.html')  # 打开名为'example.html'的文件
exampleSoup = bs4.BeautifulSoup(exampleFile.read())  # 使用BeautifulSoup解析文件内容
print(exampleSoup)  # 打印解析后的HTML文档内容
elems = exampleSoup.select('#author')  # 使用CSS选择器查找所有id为'author'的元素
print(type(elems))  # 打印elems的类型,应为bs4.element.ResultSet
print(len(elems))  # 打印elems的长度,即找到的元素数量
print(type(elems[0]))  # 打印第一个元素的类型,应为bs4.element.Tag
print(elems[0].getText())  # 打印第一个元素的文本内容
print(str(elems[0]))  # 打印第一个元素的HTML字符串表示
print(elems[0].attrs)  # 打印第一个元素的所有属性

也可以从 BeautifulSoup 对象中找出

元素

pElems = exampleSoup.select('p')
print(type(pElems))  # 打印pElems的类型,应为bs4.element.ResultSet
print(len(pElems))  # 打印pElems的长度,即找到的元素数量
print(pElems[0].getText())  # 打印第一个<p>元素的文本内容
print(pElems[1].getText())  # 打印第二个<p>元素的文本内容
print(pElems[2].getText())  # 打印第三个<p>元素的文本内容
print(pElems[2].attrs)  # 打印第三个<p>元素的属性

通过元素属性获取数据

import bs4  # 导入BeautifulSoup库,用于解析HTML和XML文档
# 使用BeautifulSoup库解析名为'example.html'的文件,并将其内容存储在变量soup中
soup = bs4.BeautifulSoup(open('example.html'))
# 使用select方法查找所有<span>标签,并获取第一个<span>标签元素,存储在变量spanElem中
spanElem = soup.select('span')[0]
# 将spanElem元素转换为字符串,并打印出来
print(str(spanElem))
# 获取spanElem元素的'id'属性值,并打印出来
print(spanElem.get('id'))
# 检查spanElem元素是否具有'some_nonexistent_addr'属性,如果没有则返回None,并打印出结果
spanElem.get('some_nonexistent_addr') == None
# 获取spanElem元素的所有属性,并打印出来
spanElem.attrs
# 创建一个字典,包含一个键值对{'id': 'author'},并打印出来
{'id': 'author'}

项目:“I’m Feeling Lucky”Google 查找

  • 从命令行参数中获取查询关键字。
  • 取得查询结果页面。
  • 为每个结果打开一个浏览器选项卡。
    这意味着代码需要完成以下工作:
  • 从 sys.argv 中读取命令行参数。
  • 用 requests 模块取得查询结果页面。
  • 找到每个查询结果的链接。
  • 调用 webbrowser.open()函数打开 Web 浏览器。
  • 打开一个新的文件编辑器窗口,并保存为 lucky.py。

命令行邮件程序

编写一个程序,通过命令行接受电子邮件地址和文本字符串。然后利用 selenium
登录到你的邮件账号,将该字符串作为邮件,发送到提供的地址(你也许希望为这
个程序建立一个独立的邮件账号)。
这是为程序添加通知功能的一种好方法。你也可以编写类似的程序,从
Facebook 或 Twitter 账号发送消息。

老照片修复 让老照片动起来
批量生成公众号文章
批量生成短视频

posted on 2025-03-20 08:53  Martinl_it  阅读(59)  评论(0)    收藏  举报