授课语音

Python 脚本爬虫

在 Python 中,爬虫是通过模拟浏览器访问网页,提取网页数据的程序。爬虫一般涉及 HTTP 请求、HTML 页面解析以及数据存储等步骤。Python 提供了多个库来支持爬虫开发,其中最常用的包括:

  • requests:用于发送 HTTP 请求。
  • BeautifulSoup:用于解析 HTML 网页。
  • lxml:用于高效解析 XML 和 HTML。
  • pandas:用于数据存储和处理。

1. 安装必要的库

在进行爬虫开发之前,我们需要先安装一些常用的 Python 库。最常见的爬虫开发库有 requestsbeautifulsoup4。可以通过以下命令安装这些库:

pip install requests beautifulsoup4

如果需要更强的解析功能,还可以安装 lxml

pip install lxml

2. 爬虫基本流程

爬虫的基本流程大致分为以下几个步骤:

  1. 发送 HTTP 请求:向目标网站发送请求,获取网页的 HTML 内容。
  2. 解析网页内容:通过 HTML 解析器解析网页,提取需要的信息。
  3. 存储数据:将提取的数据保存到本地文件或数据库中。

3. 爬虫实战:爬取一个网页数据

我们通过一个简单的爬虫实例来演示如何抓取网页数据。

目标:爬取一个博客网站的标题和文章链接

假设我们要爬取 https://quotes.toscrape.com/ 网站上的所有名言及作者,下面是具体代码实现:

import requests
from bs4 import BeautifulSoup

# 1. 发送 HTTP 请求
url = "https://quotes.toscrape.com/"
response = requests.get(url)

# 检查请求是否成功
if response.status_code == 200:
    # 2. 解析网页内容
    soup = BeautifulSoup(response.text, 'html.parser')

    # 3. 提取所有名言和作者
    quotes = soup.find_all('div', class_='quote')

    for quote in quotes:
        # 获取名言文本
        text = quote.find('span', class_='text').get_text()

        # 获取作者名称
        author = quote.find('small', class_='author').get_text()

        # 输出名言和作者
        print(f"名言: {text}")
        print(f"作者: {author}")
        print("-" * 50)
else:
    print("请求失败,无法获取网页内容。")

4. 代码讲解

  1. 发送 HTTP 请求:我们使用 requests.get(url) 向目标网站发送 GET 请求,获取网页的 HTML 内容。
  2. 解析网页内容:通过 BeautifulSoup 解析网页内容,BeautifulSoup(response.text, 'html.parser') 将网页 HTML 内容转换为可操作的 BeautifulSoup 对象。
  3. 提取数据:我们使用 find_all() 方法查找网页中所有符合条件的元素(例如:所有名言和作者)。然后通过 find() 获取子元素的内容。
  4. 打印结果:提取到的名言和作者被打印出来。

5. 深入解析

1. 使用 find()find_all() 方法

  • find():返回第一个符合条件的标签。
  • find_all():返回所有符合条件的标签。

例如,在上面的例子中,soup.find_all('div', class_='quote') 获取了网页中所有 class 为 quote<div> 元素。

2. 获取元素的属性

除了获取标签内的文本,还可以获取标签的属性。比如获取链接的 href 属性:

# 获取文章链接
link = quote.find('a')['href']
print(f"链接: {link}")

3. 处理分页

如果网页上有分页,爬虫需要访问每一页,获取分页数据。可以通过循环遍历每一页的链接来爬取所有数据。例如:

page_number = 1
while True:
    url = f"https://quotes.toscrape.com/page/{page_number}/"
    response = requests.get(url)

    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        quotes = soup.find_all('div', class_='quote')
        
        if not quotes:
            break  # 如果当前页没有数据,则退出循环
        
        for quote in quotes:
            text = quote.find('span', class_='text').get_text()
            author = quote.find('small', class_='author').get_text()
            print(f"名言: {text}")
            print(f"作者: {author}")
            print("-" * 50)
        
        page_number += 1  # 切换到下一页
    else:
        print("请求失败,无法获取网页内容。")
        break

4. 使用 User-Agent 防止被屏蔽

很多网站会检查请求头中的 User-Agent 字段来防止自动化爬虫。可以通过设置 User-Agent 来模拟浏览器请求:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=headers)

6. 存储数据

爬虫的核心目标之一是提取有用数据并进行存储。可以将数据保存为不同格式的文件,如 CSV、JSON 或数据库。以下是将数据保存为 CSV 文件的示例:

import csv

# 定义 CSV 文件的列名
fields = ['Quote', 'Author']

# 打开 CSV 文件,准备写入
with open('quotes.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(fields)

    for quote in quotes:
        text = quote.find('span', class_='text').get_text()
        author = quote.find('small', class_='author').get_text()
        writer.writerow([text, author])

print("数据已保存到 'quotes.csv' 文件。")

7. 爬虫的注意事项

  1. 遵守 Robots.txt:大多数网站会在根目录下提供一个 robots.txt 文件,告诉爬虫哪些页面可以爬取,哪些不可以。你应该尊重这些规则。

  2. 避免频繁请求:频繁向同一网站发送请求可能会导致服务器负载过重,甚至被封禁 IP。建议设置请求间隔,避免过度请求。

  3. 处理反爬虫措施:许多网站会对爬虫进行反制措施,如验证码、IP 封锁等。在开发爬虫时,需要注意这些问题,并采取相应的解决方案,如使用代理池、模拟浏览器行为等。


8. 总结

  • Python 的 requests 库和 BeautifulSoup 库是开发爬虫的基础工具。
  • 爬虫的基本流程包括发送 HTTP 请求、解析网页内容、提取需要的数据,并将数据存储到文件或数据库中。
  • 需要注意爬虫的规范性,包括遵守 robots.txt、避免频繁请求等。
  • 可以使用 pandascsv 等库来存储和处理抓取的数据。

爬虫技术不仅能帮助自动化获取网络数据,也是数据分析、新闻聚合、价格监控等应用的重要工具。

去1:1私密咨询

系列课程: