爬虫基本框架

目录

1. 安装必要的库

2. 基本爬虫框架代码示例

3. 框架解析

1. 发送请求

2. 解析网页内容

3. 数据存储

4. 爬虫流程控制

4. 常见的改进与优化

总结


爬虫的基本框架包括以下几个重要的部分:

  1. 发送请求:向目标网站发送HTTP请求,获取网页内容。
  2. 解析网页内容:使用HTML解析工具解析网页,提取有用的数据。
  3. 数据存储:将爬取到的数据存储到本地(如CSV文件、数据库等)以便后续使用。
  4. 异常处理:处理网络问题、解析错误等异常情况。
  5. 反爬机制应对:避免过于频繁地请求,防止被目标网站封禁。

下面是一个简单的Python爬虫基本框架,使用requestsBeautifulSoup来获取数据,并保存到CSV文件。

1. 安装必要的库

首先,安装爬虫需要的库:

pip install requests
pip install beautifulsoup4
pip install pandas  # 用于数据保存到CSV

2. 基本爬虫框架代码示例

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()

展开

3. 框架解析

1. 发送请求

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
2. 解析网页内容

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
3. 数据存储

爬取到的数据会被保存到CSV文件中。这里使用了 pandas 库来处理和存储数据。

def save_to_csv(data, filename):
    df = pd.DataFrame(data)
    df.to_csv(filename, index=False, encoding='utf-8-sig')
4. 爬虫流程控制

在 main 函数中控制爬虫的流程:

  • 定义了目标网页的基础URL。
  • 使用循环爬取前5页的数据。
  • 每爬取完一页后,随机延时1-3秒,避免被网站封禁。
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")

4. 常见的改进与优化

  • 异常重试:爬虫中可以加入重试机制,当请求失败时进行一定次数的重试。
  • 请求头随机化:可以使用多个不同的User-Agent来模拟多样化的请求。
  • IP代理池:使用代理IP来避免IP被封禁。
  • 并发爬取:使用threadingasyncio等方法提高爬虫速度。

总结

这是一个简单的Python爬虫框架,包含了爬虫常见的功能:请求网页、解析网页、存储数据、异常处理和反爬虫措施。

你可能感兴趣的:(大数据,python,python,php,开发语言)