目录
1. 安装必要的库
2. 基本爬虫框架代码示例
3. 框架解析
1. 发送请求
2. 解析网页内容
3. 数据存储
4. 爬虫流程控制
4. 常见的改进与优化
总结
爬虫的基本框架包括以下几个重要的部分:
- 发送请求:向目标网站发送HTTP请求,获取网页内容。
- 解析网页内容:使用HTML解析工具解析网页,提取有用的数据。
- 数据存储:将爬取到的数据存储到本地(如CSV文件、数据库等)以便后续使用。
- 异常处理:处理网络问题、解析错误等异常情况。
- 反爬机制应对:避免过于频繁地请求,防止被目标网站封禁。
下面是一个简单的Python爬虫基本框架,使用requests
和BeautifulSoup
来获取数据,并保存到CSV文件。
首先,安装爬虫需要的库:
pip install requests
pip install beautifulsoup4
pip install pandas # 用于数据保存到CSV
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random
# 发送请求
def get_page(url, headers=None):
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 如果响应状态码不是200,抛出异常
response.encoding = response.apparent_encoding # 自动检测编码方式
return response.text
except requests.RequestException as e:
print(f"请求出错: {e}")
return None
# 解析网页
def parse_page(html):
soup = BeautifulSoup(html, 'html.parser')
# 提取数据的具体规则,依据目标网站结构来提取
data_list = []
for item in soup.find_all('div', class_='item'):
title = item.find('span', class_='title').get_text() if item.find('span', class_='title') else '暂无标题'
rating = item.find('span', class_='rating_num').get_text() if item.find('span', class_='rating_num') else '暂无评分'
quote = item.find('span', class_='inq').get_text() if item.find('span', class_='inq') else '暂无简介'
data_list.append({
'Title': title,
'Rating': rating,
'Quote': quote
})
return data_list
# 数据保存到CSV
def save_to_csv(data, filename):
df = pd.DataFrame(data)
df.to_csv(filename, index=False, encoding='utf-8-sig')
# 主程序
def main():
base_url = 'https://movie.douban.com/top250' # 示例URL
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.36"
}
all_data = []
# 爬取前5页数据
for page in range(0, 5):
url = f"{base_url}?start={page * 25}"
print(f"正在爬取第{page+1}页: {url}")
html = get_page(url, headers)
if html:
page_data = parse_page(html)
all_data.extend(page_data)
# 防止请求过于频繁,避免被封禁
time.sleep(random.uniform(1, 3)) # 随机延时1-3秒
# 保存数据到CSV
save_to_csv(all_data, 'douban_top250.csv')
print("数据爬取完成,已保存到douban_top250.csv")
if __name__ == '__main__':
main()
展开
get_page
函数用于向目标网站发送HTTP请求,获取网页内容。请求时使用了try-except
来捕获请求中的异常,比如连接错误、超时等,保证爬虫的健壮性。
def get_page(url, headers=None):
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 如果响应状态码不是200,抛出异常
response.encoding = response.apparent_encoding # 自动检测编码方式
return response.text
except requests.RequestException as e:
print(f"请求出错: {e}")
return None
parse_page
函数使用 BeautifulSoup
来解析网页内容。soup.find_all()
可以提取网页中符合条件的所有元素,这里提取了电影名、评分和简介。
def parse_page(html):
soup = BeautifulSoup(html, 'html.parser')
data_list = []
for item in soup.find_all('div', class_='item'):
title = item.find('span', class_='title').get_text() if item.find('span', class_='title') else '暂无标题'
rating = item.find('span', class_='rating_num').get_text() if item.find('span', class_='rating_num') else '暂无评分'
quote = item.find('span', class_='inq').get_text() if item.find('span', class_='inq') else '暂无简介'
data_list.append({
'Title': title,
'Rating': rating,
'Quote': quote
})
return data_list
爬取到的数据会被保存到CSV文件中。这里使用了 pandas
库来处理和存储数据。
def save_to_csv(data, filename):
df = pd.DataFrame(data)
df.to_csv(filename, index=False, encoding='utf-8-sig')
在 main
函数中控制爬虫的流程:
def main():
base_url = 'https://movie.douban.com/top250'
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.36"
}
all_data = []
for page in range(0, 5):
url = f"{base_url}?start={page * 25}"
print(f"正在爬取第{page+1}页: {url}")
html = get_page(url, headers)
if html:
page_data = parse_page(html)
all_data.extend(page_data)
time.sleep(random.uniform(1, 3)) # 随机延时1-3秒
save_to_csv(all_data, 'douban_top250.csv')
print("数据爬取完成,已保存到douban_top250.csv")
threading
或asyncio
等方法提高爬虫速度。这是一个简单的Python爬虫框架,包含了爬虫常见的功能:请求网页、解析网页、存储数据、异常处理和反爬虫措施。