网页信息提取

爬虫最基础的功能,是从服务器发送给你的 HTML 文件里提取信息。只要是 HTML 页面上写的东西,都有办法可以程序自动地、批量地获取。我们就从这一步开始。

HTML

HTML 由一系列标签组成。标签一般都是成对出现的,被标签包裹的文字,究竟以何种形式展示给用户,是被标签定义的,像这样:

<h1> 一号字体的标题 </h1>
<div> 
    <h2> 二号字体的标题 </h2>
    <p> 一小段文字 </p>
</div>
<div>
    <h2> 第二个标题 </h2>
    <p> 另一小段文字 </p>
<div>

可以暂时不需要知道每个标签对应的意思,只要知道,一般情况下,你要爬取的数据会有规律地出现在标签上,标签中间或标签附近。

提取文本

大部分情况下,我们会爬取文本,也就是直接把 HTML 标签包裹的东西拿过来,并保存。 我们可以使用 BeautifulSoup 获取标签后,直接使用 get_text,获得文字内容。比如上面那段 HTML 代码,想从中提取第一个 <p> 标签中的内容(一小段文字),可以这样:

from bs4 import BeautifulSoup

# html 需要转化成字符串,才能进行处理
html = '<h1> 一号字体的标题 </h1> <div> <h2> 二号字体的标题 </h2> <p> 一小段文字 </p> </div> <p> 另一小段文字 </p>'

soup = BeautifulSoup(html)
div_tag = soup.findAll('div')[1] # 获取第二个 <div> 标签及其全部内容
p = div_tag.p # 获得 <div> 标签下的 <p> 标签

print(p.get_text) # 会打印“另一小段文字”

提取图片

与文字不同,图片一般会写在标签里,像这样:

<img src="url_to_image"></img>

src 属性里头的 url_to_image 会指向图片的链接。我们需要提取这个链接,然后下载这个链接的内容,像这样:

# 假设已经获得了名为 `html` 的字符串变量,用 BeautifulSoup 预处理
soup = BeautifulSoup(html)

# 获得标签上的 `src` 属性的内容,即图片链接
image_url = soup.img.get('src')

# 向对应的链接发送请求,获得数据
data = requests.get(image_url)

# 把数据保存到本地文件(也就是图片)
with open("image.jpg", "wb") as f:
    f.write(data.content)