Python怎么爬取上道网项目

发布时间:2021-11-23 11:42:32 作者:iii
来源:亿速云 阅读:136
# Python怎么爬取上道网项目

## 前言

在当今数据驱动的时代,网络爬虫已成为获取互联网公开数据的重要技术手段。Python凭借其丰富的第三方库(如Requests、BeautifulSoup、Scrapy等)成为爬虫开发的首选语言。本文将详细介绍如何使用Python爬取"上道网"(假设为教育培训类网站)的项目数据,涵盖从环境准备到数据存储的全流程。

---

## 一、爬虫基础准备

### 1.1 工具与库安装
```python
# 基础请求库
pip install requests
# HTML解析库
pip install beautifulsoup4
# 高级爬虫框架(可选)
pip install scrapy
# 数据处理库
pip install pandas

1.2 目标网站分析

  1. 访问上道网(示例URL:https://www.shangdao.com/projects)
  2. 使用浏览器开发者工具(F12)检查:
    • 页面数据加载方式(静态HTML/动态AJAX)
    • 网络请求中的XHR接口
    • 关键HTML标签结构

1.3 法律与道德须知


二、静态页面爬取方案

2.1 基础请求实现

import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

def get_html(url):
    try:
        resp = requests.get(url, headers=headers, timeout=10)
        resp.raise_for_status()
        return resp.text
    except Exception as e:
        print(f"请求失败: {e}")
        return None

2.2 数据解析示例

假设项目信息包含在<div class="project-item">中:

def parse_html(html):
    soup = BeautifulSoup(html, 'lxml')
    projects = []
    
    for item in soup.select('.project-item'):
        project = {
            'name': item.select_one('.title').get_text(strip=True),
            'price': item.select_one('.price').get_text(strip=True),
            'description': item.select_one('.desc').get_text(strip=True),
            'link': item.find('a')['href']
        }
        projects.append(project)
    
    return pd.DataFrame(projects)

2.3 分页处理技巧

base_url = "https://www.shangdao.com/projects?page={}"

for page in range(1, 6):  # 假设爬取前5页
    url = base_url.format(page)
    html = get_html(url)
    if html:
        df = parse_html(html)
        df.to_csv(f'shangdao_page_{page}.csv', index=False)

三、动态内容爬取方案

3.1 识别API接口

通过浏览器Network面板发现数据接口:

GET https://api.shangdao.com/v1/projects?page=1&size=10

3.2 直接请求API

import json

api_url = "https://api.shangdao.com/v1/projects"

def get_api_data(page):
    params = {
        'page': page,
        'size': 10,
        't': int(time.time())  # 防止缓存
    }
    
    resp = requests.get(api_url, headers=headers, params=params)
    return resp.json() if resp.status_code == 200 else None

3.3 处理AJAX渲染页面

当需要执行JavaScript时,可使用Selenium:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.shangdao.com/projects")

# 等待动态加载
time.sleep(3)

# 获取渲染后的页面源码
html = driver.page_source

四、反爬虫对策

4.1 常见反爬手段

4.2 应对方案

# 1. 轮换User-Agent
user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...'
]

# 2. 使用代理IP
proxies = {
    'http': 'http://123.123.123.123:8888',
    'https': 'http://123.123.123.123:8888'
}

# 3. 添加完整请求头
headers = {
    'Accept': 'text/html,application/xhtml+xml...',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Referer': 'https://www.shangdao.com/'
}

五、数据存储方案

5.1 CSV存储

df.to_csv('shangdao_projects.csv', 
          index=False, 
          encoding='utf_8_sig')  # 支持中文

5.2 MySQL存储

import pymysql

conn = pymysql.connect(
    host='localhost',
    user='root',
    password='123456',
    database='spider_data'
)

df.to_sql('shangdao_projects', conn, if_exists='append', index=False)

5.3 MongoDB存储

from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')
db = client['spider_data']
collection = db['projects']

collection.insert_many(df.to_dict('records'))

六、完整案例代码

import requests
import pandas as pd
from bs4 import BeautifulSoup
import time
import random

class ShangDaoSpider:
    def __init__(self):
        self.base_url = "https://www.shangdao.com/projects?page={}"
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...'
        }
        
    def crawl(self, max_pages=5):
        all_data = []
        
        for page in range(1, max_pages + 1):
            print(f"正在爬取第 {page} 页...")
            
            html = self._get_html(self.base_url.format(page))
            if html:
                page_data = self._parse_html(html)
                all_data.extend(page_data)
            
            time.sleep(random.uniform(1, 3))  # 随机延迟
            
        return pd.DataFrame(all_data)
    
    def _get_html(self, url):
        try:
            resp = requests.get(url, headers=self.headers)
            return resp.text if resp.status_code == 200 else None
        except Exception as e:
            print(f"请求异常: {e}")
            return None
    
    def _parse_html(self, html):
        soup = BeautifulSoup(html, 'lxml')
        projects = []
        
        for item in soup.select('.project-item'):
            projects.append({
                'name': item.select_one('.title').get_text(strip=True),
                'price': item.select_one('.price').get_text(strip=True),
                'update_time': item.select_one('.time').get_text(strip=True)
            })
        
        return projects

if __name__ == '__main__':
    spider = ShangDaoSpider()
    data = spider.crawl(max_pages=3)
    data.to_excel('上道网项目.xlsx', index=False)

七、优化建议

  1. 增量爬取:记录已爬取项目的ID,避免重复
  2. 异常处理:增加重试机制和日志记录
  3. 分布式扩展:使用Scrapy-Redis实现分布式爬虫
  4. 定时任务:结合APScheduler实现定时更新

结语

本文详细介绍了Python爬取上道网项目的完整流程,涵盖了静态页面和动态内容的处理方案。在实际操作中,请根据目标网站的具体结构调整代码,并始终遵守相关法律法规。网络爬虫技术需要不断适应网站的变化,建议持续关注反爬机制的更新和新的技术解决方案。 “`

注:本文为技术分享,实际爬取前请确保: 1. 目标网站允许爬取 2. 不会对目标网站服务器造成过大压力 3. 遵守《网络安全法》等相关法律法规

推荐阅读:
  1. 利用python爬取贝壳网租房信息
  2. python爬取动漫截图网的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:微软HPC群集如何添加Linux计算节点

下一篇:c语言怎么实现含递归清场版扫雷游戏

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》