使用Python进行Web爬虫开发:从基础到实战

今天 8阅读

随着互联网的发展,数据变得越来越重要。而网络爬虫(Web Crawler)作为一种自动获取网页数据的技术,被广泛应用于数据分析、市场研究、搜索引擎等多个领域。本文将带领读者从零开始,使用 Python 编写一个简单的 Web 爬虫,并逐步扩展其功能,最终实现一个可以抓取网站内容并存储为结构化数据的爬虫程序。

环境准备

在开始编写爬虫之前,我们需要安装一些必要的 Python 库:

requests:用于发送 HTTP 请求。BeautifulSoup:用于解析 HTML 文档。pandas:用于处理和保存结构化数据。lxml:用于提高 BeautifulSoup 的解析速度。

可以通过以下命令安装这些库:

pip install requests beautifulsoup4 pandas lxml

第一个简单的爬虫:获取网页内容

我们先来编写一个最简单的爬虫,目标是访问百度首页并输出页面标题。

示例代码:

import requestsfrom bs4 import BeautifulSoupurl = "https://www.baidu.com"response = requests.get(url)soup = BeautifulSoup(response.text, 'lxml')title = soup.title.stringprint("页面标题是:", title)

输出示例:

页面标题是: 百度一下,你就知道

这段代码通过 requests 发送 GET 请求获取网页内容,然后用 BeautifulSoup 解析 HTML 并提取 <title> 标签中的文本。

深入解析网页结构

为了抓取更复杂的数据,比如新闻标题或商品价格,我们需要了解 HTML 的结构。通常我们会使用 CSS 选择器或 XPath 来定位元素。

假设我们要从 豆瓣电影 Top250 页面中抓取电影名称和评分。

示例代码:

import requestsfrom bs4 import BeautifulSoupheaders = {    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}url = "https://movie.douban.com/top250"response = requests.get(url, headers=headers)soup = BeautifulSoup(response.text, 'lxml')movies = soup.find_all('div', class_='info')for movie in movies:    title = movie.find('span', class_='title').text    rating = movie.find('span', class_='rating_num').text    print(f"电影名称:{title},评分:{rating}")

输出示例:

电影名称:肖申克的救赎,评分:9.7电影名称:霸王别姬,评分:9.6...

该代码使用了 CSS 类名来查找对应的标签,并提取电影名称和评分信息。

分页爬取与反爬策略应对

实际应用中,很多网站都采用了分页机制,例如每页显示 25 条记录。我们可以分析 URL 参数,循环请求所有页面。

此外,为了避免被网站封禁,建议设置请求头(User-Agent)、限制请求频率等。

分页爬虫示例:

import requestsfrom bs4 import BeautifulSoupimport timebase_url = "https://movie.douban.com/top250?start="for i in range(0, 250, 25):    url = base_url + str(i)    response = requests.get(url, headers=headers)    soup = BeautifulSoup(response.text, 'lxml')    movies = soup.find_all('div', class_='info')    for movie in movies:        title = movie.find('span', class_='title').text        rating = movie.find('span', class_='rating_num').text        print(f"电影名称:{title},评分:{rating}")    time.sleep(2)  # 每次请求后暂停2秒,避免频繁请求

数据持久化:保存为 CSV 文件

我们使用 pandas 将爬取的数据保存为 CSV 文件,便于后续分析。

示例代码:

import pandas as pd# 初始化空列表titles = []ratings = []for i in range(0, 250, 25):    url = base_url + str(i)    response = requests.get(url, headers=headers)    soup = BeautifulSoup(response.text, 'lxml')    movies = soup.find_all('div', class_='info')    for movie in movies:        titles.append(movie.find('span', class_='title').text)        ratings.append(movie.find('span', class_='rating_num').text)    time.sleep(2)# 构建 DataFramedf = pd.DataFrame({    '电影名称': titles,    '评分': ratings})# 保存为 CSV 文件df.to_csv('douban_top250.csv', index=False, encoding='utf-8-sig')print("数据已保存为 douban_top250.csv")

输出文件示例:

电影名称,评分肖申克的救赎,9.7霸王别姬,9.6阿甘正传,9.5...

进阶技巧:使用 Selenium 处理 JavaScript 渲染页面

有些网站的内容是通过 JavaScript 动态加载的,此时 requests 无法获取完整页面。我们可以使用 Selenium 驱动浏览器来获取动态内容。

安装 Selenium 及浏览器驱动:

pip install selenium

下载对应浏览器的 WebDriver(如 ChromeDriver),并将其路径添加到系统环境变量中。

示例代码(以百度为例):

from selenium import webdriverfrom bs4 import BeautifulSoupimport time# 启动浏览器driver = webdriver.Chrome()driver.get("https://www.baidu.com")# 等待页面加载time.sleep(3)# 获取页面源码html = driver.page_sourcesoup = BeautifulSoup(html, 'lxml')# 提取搜索框 placeholder 属性search_box = soup.find('input', id='kw')print("搜索框提示文字:", search_box.get('placeholder'))# 关闭浏览器driver.quit()

输出示例:

搜索框提示文字: 输入关键词

总结与注意事项

本篇文章介绍了使用 Python 进行 Web 爬虫开发的基本流程,包括:

使用 requestsBeautifulSoup 抓取静态网页内容;分页爬取与反爬策略应对;数据清洗与结构化存储;使用 Selenium 抓取 JavaScript 渲染页面。

在实际开发中,还需注意以下几点:

遵守网站规则:查看网站的 robots.txt 文件,确保爬虫行为合法。设置合理的请求间隔:避免对服务器造成过大压力。异常处理:添加超时、重试等机制,提高爬虫稳定性。用户代理轮换:使用 User-Agent 列表模拟不同设备访问。IP 代理池:对于大规模爬取任务,可考虑使用 IP 代理防止被封禁。

网络爬虫是一门非常实用且有趣的技术,希望本文能帮助你迈出第一步,开启数据采集与分析的新旅程!

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第19874名访客 今日有12篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!