Python 爬虫入门(一):从零开始学爬虫 「详细介绍」
- 前言
- 1.爬虫概念
- 1.1 什么是爬虫?
- 1.2 爬虫的工作原理
- 2. HTTP 简述
- 2.1 什么是 HTTP?
- 2.2 HTTP 请求
- 2.3 HTTP 响应
- 2.4 常见的 HTTP 方法
- 3. 网页的组成
- 3.1 HTML
- 3.1.1 HTML 基础结构
- 3.2 CSS
- 3.2.1 CSS 示例
- 3.3 JavaScript
- 3.3.1 JavaScript 示例
- 4. 使用 Python 进行 Web 爬虫
- 4.1 常用的 Python 库
- 4.2 安装所需库
- 4.3 编写一个简单的爬虫
- 4.3.1 示例代码
- 5. 处理复杂的网页
- 5.1 使用 Playwright 示例
- 6. 编写一个完整的爬虫项目
- 6.1 项目要求
- 6.2 项目步骤
- 6.2.1 示例代码
- 7. 特别注意事项
- 8. robots.txt 文件是什么?
- 总结
前言
警告声明:本文提供的信息和示例代码仅供学习和教育目的,请小伙伴们在遵守相关法律法规和网站政策的前提下使用。
1.爬虫概念
1.1 什么是爬虫?
网络爬虫,也称为网络蜘蛛、网络机器人,是一种自动化脚本或程序,用于自动浏览互联网并收集数据。
爬虫可以帮助我们从网页中提取信息,从而实现数据采集、信息检索、网站分析等功能。
1.2 爬虫的工作原理
- 发送请求:爬虫向目标网站发送 HTTP 请求。
- 获取响应:目标网站返回 HTTP 响应,包含请求的网页内容。
- 解析数据:爬虫解析网页内容,提取所需数据。
- 存储数据:将提取的数据存储在本地或数据库中。
2. HTTP 简述
2.1 什么是 HTTP?
HTTP(HyperText Transfer Protocol):是用于在 Web 浏览器和 Web 服务器之间传递信息的协议。它是一种基于请求-响应模式的协议,客户端发送请求,服务器返回响应。
2.2 HTTP 请求
HTTP 请求由以下几个部分组成:
- 请求行:包括请求方法(如 GET、POST)、请求 URL 和 HTTP 版本。
- 请求头:包含有关客户端环境的信息和请求体的元数据。
- 请求体:在 POST 请求中,包含要发送到服务器的数据。
2.3 HTTP 响应
HTTP 响应由以下几个部分组成:
- 状态行:包括 HTTP 版本、状态码和状态描述。
- 响应头:包含有关服务器环境的信息和响应体的元数据。
- 响应体:包含实际的响应内容,如 HTML 文档、图像或其他数据。
2.4 常见的 HTTP 方法
- GET:请求指定的资源。一般用于请求数据。
- POST:向指定的资源提交数据进行处理。
- PUT:向指定资源位置上传最新内容。
- DELETE:请求删除指定的资源。
- HEAD:类似于 GET,但只返回响应头,不返回响应体。
3. 网页的组成
一个典型的网页由以下几个部分组成:
3.1 HTML
HTML(HyperText Markup Language):是用于创建和结构化网页内容的标准标记语言。HTML 使用标签来标记不同类型的内容,如文本、图像、链接等。
3.1.1 HTML 基础结构
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>Welcome to my website.</p>
</body>
</html>
3.2 CSS
CSS(Cascading Style Sheets):是一种样式表语言,用于描述 HTML 文档的外观和格式。CSS 可以控制网页的布局、颜色、字体等。
3.2.1 CSS 示例
body {
font-family: Arial, sans-serif;
}
h1 {
color: blue;
}
p {
font-size: 16px;
}
3.3 JavaScript
JavaScript :是一种高效的编程语言,通常用于网页开发,可以使网页具有动态交互功能。JavaScript 可以操作 HTML 和 CSS,响应用户事件,创建动态效果等。
3.3.1 JavaScript 示例
document.addEventListener('DOMContentLoaded', function() {
const button = document.getElementById('myButton');
button.addEventListener('click', function() {
alert('Button clicked!');
});
});
4. 使用 Python 进行 Web 爬虫
4.1 常用的 Python 库
- requests:用于发送 HTTP 请求。
- BeautifulSoup:用于解析 HTML 和 XML 文档。
- Scrapy:一个功能强大的爬虫框架。
- Playwright:用于模拟浏览器操作,支持多种浏览器。
4.2 安装所需库
使用 pip 安装下列库:
pip install requests
pip install beautifulsoup4
pip install scrapy
pip install openpyxl
pip install playwright
python -m playwright install
4.3 编写一个简单的爬虫
下面是一个使用 requests 编写的简单爬虫示例。
4.3.1 示例代码
import requests
# 发送请求
url = 'https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total'
response = requests.get(url)
# 解析JSON数据
data = response.json()
if 'data' in data:
# 遍历数据
for item in data['data']:
if 'target' in item and 'title' in item['target']:
print(item['target']['title'])
else:
print("没有获取到数据")
执行结果如下:
5. 处理复杂的网页
对于一些动态加载内容的网页,仅靠 requests 和 BeautifulSoup 可能无法获取所有数据。这时可以使用 Playwright 模拟浏览器操作。
5.1 使用 Playwright 示例
import asyncio
from bs4 import BeautifulSoup
from playwright.async_api import async_playwright
async def run(playwright: async_playwright) -> None:
browser = await playwright.chromium.launch(headless=False)
context = await browser.new_context()
page = await context.new_page()
# 访问网页
await page.goto('https://nba.hupu.com/')
# 获取页面内容
content = await page.content()
# 解析 HTML(同样使用 BeautifulSoup)
soup = BeautifulSoup(content, 'html.parser')
# 提取页面标题
title = soup.title.string
print('Title:', title)
# 提取推荐文章的标题及链接
links = await page.locator('.list-recommend a, .list-container a').all()
for link in links:
title = await link.inner_text()
href = await link.get_attribute('href')
print(title, href)
# 关闭浏览器和上下文
await context.close()
await browser.close()
# 异步运行函数
async def main():
async with async_playwright() as playwright:
await run(playwright)
# 运行主函数
asyncio.run(main())
6. 编写一个完整的爬虫项目
下面,我们将编写一个完整的爬虫项目,从一个网站中提取数据并保存到本地文件。
6.1 项目要求
- 从一个演出票务网站中提取演出信息;
- 将演出数据保存到 Excel 文件中。
6.2 项目步骤
- 发送请求并获取响应
- 解析响应内容
- 创建 Excel 工作簿、Sheet
- 将遍历数据保存到 Excel 文件
6.2.1 示例代码
下面是一个使用 requests 和 BeautifulSoup 编写的爬虫示例。
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
from pathlib import Path
def showStart(city_code):
# 发送请求获取网页内容
url = f'https://www.showstart.com/event/list?pageNo=1&pageSize=99999&cityCode={city_code}'
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
items = soup.find_all('a', class_='show-item item')
# 创建Excel工作簿
wb = Workbook()
sheet = wb.active
# 添加标题行
sheet.append(['标题', '艺人', '价格', '时间', '地址', '链接'])
for item in items:
title = item.find('div', class_='title').text.strip()
artist = item.find('div', class_='artist').text.strip()
price = item.find('div', class_='price').text.strip()
time = item.find('div', class_='time').text.strip()
addr = item.find('div', class_='addr').text.strip()
href = 'https://www.showstart.com' + item['href']
# 将数据写入Excel
sheet.append([title, artist, price, time, addr, href])
# 保存Excel文件
root_dir = Path(__file__).resolve().parent
file_path = root_dir / f'showstart_{city_code}.xlsx'
wb.save(file_path)
print(f'数据已保存到 {file_path}')
else:
print(f'请求失败,状态码:{response.status_code}')
if __name__ == "__main__":
city_code = input("请输入城市编码:")
showStart(city_code)
打开Excel 文件,内容如下:
7. 特别注意事项
- 尊重网站的 robots.txt 文件:大多数网站都有一个 robots.txt 文件,规定了爬虫的访问规则。请遵守这些规则,以避免对网站造成负担。
- 设置适当的延迟:在发送大量请求时,设置适当的延迟(如使用
time.sleep
),以避免对目标网站造成压力。 - 处理反爬虫措施:一些网站有反爬虫措施,如使用验证码或检测大量请求行为。可以使用代理、模拟浏览器行为等方式绕过这些措施。
8. robots.txt 文件是什么?
robots.txt 文件是一个文本文件,通常放置在网站的根目录下。
它用来告诉搜索引擎的爬虫(spider)哪些页面可以抓取,哪些页面不可以抓取。
要找到网站的 robots.txt 文件,在浏览器的地址栏输入以下格式的URL:
http://www.xxx.com/robots.txt
如果访问的是不带www的域名:
http://xxx.com/robots.txt
- 这里的 xxx.com 替换成想要查找 robots.txt 的网站域名。如果该网站有 robots.txt 文件,将能够直接在浏览器中看到它的内容。如果不存在,可能会看到404错误页面或者其他错误信息。
- 此外,有些网站可能会使用 robots.txt 文件来提供关于网站地图(sitemap)的信息,这可以帮助搜索引擎更快地发现和索引网站上的新内容。
总结
本文介绍了 Python 爬虫的基本概念、HTTP 基础知识以及网页的基本组成部分、如何使用 Python 编写简单的爬虫,以及如何处理动态加载内容的网页。希望这些内容对小伙伴们学习和编写 Python 爬虫有所帮助。