当前位置: 首页 > wzjs >正文

贵阳做网站电话免费网站整站模板源码

贵阳做网站电话,免费网站整站模板源码,购物网站排名2018,泵阀网站建设我的第1个爬虫程序——豆瓣Top250爬虫的详细步骤指南 一、创建隔离开发环境 1. 使用虚拟环境(推荐venv) # 在项目目录打开终端执行 python -m venv douban_env # 创建虚拟环境 source douban_env/bin/activate # Linux/macOS激活 douban_env\Scri…

我的第1个爬虫程序——豆瓣Top250爬虫的详细步骤指南

在这里插入图片描述


一、创建隔离开发环境

1. 使用虚拟环境(推荐venv
# 在项目目录打开终端执行
python -m venv douban_env      # 创建虚拟环境
source douban_env/bin/activate # Linux/macOS激活
douban_env\Scripts\activate   # Windows激活
2. 安装依赖库
pip install requests beautifulsoup4 lxml
3. 生成依赖清单
pip freeze > requirements.txt

二、项目架构设计

douban_top250/
├── config/               # 配置文件
│   └── settings.py
├── core/                 # 核心逻辑
│   ├── spider.py
│   └── storage.py
├── utils/                # 工具函数
│   └── helper.py
├── output/               # 输出目录
├── main.py               # 主入口
└── requirements.txt      # 依赖清单

三、分步实现

步骤1:创建配置文件 config/settings.py
# 请求配置
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36','Referer': 'https://movie.douban.com/'
}# 目标URL配置
BASE_URL = 'https://movie.douban.com/top250'# 存储配置
OUTPUT_DIR = './output'
CSV_HEADERS = ['标题', '评分', '年份', '国家', '类型', '链接']# 容错配置
SAFE_MODE = True  # 遇到错误时跳过条目而不是终止
UNKNOWN_PLACEHOLDER = "未知"  # 数据缺失时的占位符
步骤2:编写工具类 utils/helper.py
import random
import timedef random_delay(min=1, max=3):"""随机延迟防止被封"""time.sleep(random.uniform(min, max))def make_soup(html):"""创建BeautifulSoup对象"""from bs4 import BeautifulSoupreturn BeautifulSoup(html, 'lxml')
步骤3:核心爬虫逻辑 core/spider.py
import requests
from config import settings
from utils.helper import random_delay, make_soupclass DoubanSpider:def __init__(self):self.session = requests.Session()self.session.headers.update(settings.HEADERS)def fetch_page(self, url):"""获取页面内容"""try:random_delay()response = self.session.get(url)response.raise_for_status()  # 自动处理HTTP错误return response.textexcept requests.RequestException as e:print(f"请求失败: {str(e)}")return Nonedef parse_page(self, html):"""改进后的解析方法"""soup = make_soup(html)movies = []for item in soup.find_all('div', class_='item'):try:# 标题与链接title = item.find('span', class_='title').text.strip()rating = item.find('span', class_='rating_num').text.strip()link = item.find('a')['href']# 详细信息解析(稳健版)info_div = item.find('div', class_='bd')info_text = info_div.p.get_text(" ", strip=True)  # 用空格替代换行# 使用正则表达式提取年份/国家/类型import repattern = r'(\d{4})[^/]*(.*?)\s+/\s+(.*?)$'match = re.search(pattern, info_text)if match:year = match.group(1).strip()country = match.group(2).strip().replace('/', ' ')  # 处理国家中的斜杠genre = match.group(3).strip()else:year = country = genre = "N/A"  # 无法解析时填充默认值movies.append({'标题': title,'评分': rating,'年份': year,'国家': country,'类型': genre,'链接': link})except Exception as e:print(f"解析条目失败: {str(e)}")continue  # 跳过当前条目return moviesdef get_all_pages(self):"""处理分页"""all_movies = []start = 0while True:url = f"{settings.BASE_URL}?start={start}"html = self.fetch_page(url)if not html:breakmovies = self.parse_page(html)if not movies:breakall_movies.extend(movies)start += 25# 检查是否还有下一页if start >= 250:  # Top250最多250条breakreturn all_movies
步骤4:数据存储模块 core/storage.py
import csv
import json
import os
from config import settingsclass DataStorage:@staticmethoddef save_csv(data, filename='douban_top250.csv'):os.makedirs(settings.OUTPUT_DIR, exist_ok=True)path = os.path.join(settings.OUTPUT_DIR, filename)with open(path, 'w', newline='', encoding='utf-8') as f:writer = csv.DictWriter(f, fieldnames=settings.CSV_HEADERS)writer.writeheader()writer.writerows(data)print(f"数据已保存至 {path}")@staticmethoddef save_json(data, filename='douban_top250.json'):os.makedirs(settings.OUTPUT_DIR, exist_ok=True)path = os.path.join(settings.OUTPUT_DIR, filename)with open(path, 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=2)print(f"数据已保存至 {path}")
步骤5:主程序 main.py
from core.spider import DoubanSpider
from core.storage import DataStoragedef main():# 检查robots协议print("豆瓣 robots.txt 重要条款:")print("User-agent: *")print("Disallow: /search")  # 实际需查看最新内容# 执行爬虫spider = DoubanSpider()movies_data = spider.get_all_pages()# 存储数据if movies_data:DataStorage.save_csv(movies_data)DataStorage.save_json(movies_data)else:print("未获取到有效数据")if __name__ == '__main__':main()

四、运行与验证

  1. 在激活的虚拟环境中执行:
python main.py
  1. 检查 output/ 目录生成的 CSV 和 JSON 文件

在这里插入图片描述

五、高级优化建议

  1. 异常处理增强
# 在spider类中添加重试机制
def fetch_page(self, url, retries=3):for attempt in range(retries):try:# ...原有代码...except requests.RequestException as e:if attempt == retries - 1:raiseprint(f"重试中 ({attempt+1}/{retries})...")time.sleep(2 ** attempt)  # 指数退避
  1. 请求头轮换
# 在settings.py中添加多个User-Agent
USER_AGENTS = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'
]# 在helper.py中添加选择函数
def get_random_user_agent():return random.choice(settings.USER_AGENTS)
  1. 代理设置(如果需要):
# 在spider初始化时添加
def __init__(self, proxy=None):if proxy:self.session.proxies = {'http': proxy, 'https': proxy}

六、法律合规检查

  1. 访问 https://www.douban.com/robots.txt 查看协议
  2. 重点条款:
User-agent: *
Disallow: /subject_search
Disallow: /amazon_search
Disallow: /search
Disallow: /group/search
Disallow: /event/search
Disallow: /forum/search
Disallow: /game/search
  1. 合规措施:
  • 限制请求频率(代码中已实现随机延迟)
  • 不绕过反爬机制
  • 仅用于学习用途
  • 不存储敏感信息

通过这个结构化的项目实现,你可以:

  • 保持代码的可维护性
  • 方便后续扩展功能(如添加代理支持)
  • 符合Python最佳实践
  • 有效管理依赖项

下一步可以尝试:

  1. 添加日志记录模块
  2. 实现数据库存储(MySQL/MongoDB)
  3. 使用Scrapy框架重构项目
  4. 部署到服务器定时运行

文章转载自:

http://GBfDDWiy.jfwbr.cn
http://5OqjUCDn.jfwbr.cn
http://3qiTxEVw.jfwbr.cn
http://PujCeMlD.jfwbr.cn
http://0d4FpTM0.jfwbr.cn
http://6O93Cy7q.jfwbr.cn
http://EI10gPJ5.jfwbr.cn
http://iOyFUQaC.jfwbr.cn
http://a6ASedpq.jfwbr.cn
http://2sXZuXzy.jfwbr.cn
http://gyKJeUIF.jfwbr.cn
http://nbSP2wjD.jfwbr.cn
http://FCw1MaEh.jfwbr.cn
http://cLoxpsZu.jfwbr.cn
http://p4L1Vf6M.jfwbr.cn
http://SAN6toaX.jfwbr.cn
http://Vp6cWCP6.jfwbr.cn
http://YcAtO9bB.jfwbr.cn
http://6gOQ9ONP.jfwbr.cn
http://OTr6uF3W.jfwbr.cn
http://nz9hlhSK.jfwbr.cn
http://eaEjI100.jfwbr.cn
http://MSpXfwMr.jfwbr.cn
http://H9DX1eQw.jfwbr.cn
http://SIv9dads.jfwbr.cn
http://x77QmE7r.jfwbr.cn
http://nIr8JEmq.jfwbr.cn
http://ZM5hQn6N.jfwbr.cn
http://Ju7BIuht.jfwbr.cn
http://QO7piqgA.jfwbr.cn
http://www.dtcms.com/wzjs/654856.html

相关文章:

  • 女性时尚网站模板广州建设厅网站首页
  • 怎么开一个做网站的工作室wordpress插件排列
  • 品牌网站制作流程免费作图网站
  • 学院网站建设成果网站开发w亿玛酷1流量订制
  • 网站描述 修改软件工程师培训机构排名
  • 网站建设程序员网页qq登陆保护
  • 如何做好网站seo优化重庆网站排名外包
  • 怎样查看网站开发移动商城touch版h5页面
  • 威海 医院网站建设四川省造价工程信息网
  • 昆明网站建设的公司ps怎么制作网页教程
  • 安徽合肥做网站的公司wordpress移动到回收站时发生错误
  • 深圳便宜建网站自己做网站平台需要服务器
  • 招标网站排名网站seo可以做吗
  • 重庆网站建设 制作 设计 优惠价网站规划建设论文
  • 现在网站前台用什么做重庆智能网站建设价格
  • 交流建设网站软件技术职业
  • 南岗红旗大街网站建设调用wordpress分类名称
  • 做网站需要多少资金上海小程序开发哪家好
  • APP网站开发私人订制山东中恒建设集团网站
  • 深圳哪家公司需要网站建设的wordpress 企业门户
  • a5站长网网站交易石家庄最新事件
  • 做查询网站费用安徽信息工程学院信息门户平台
  • discuz做企业网站做百度推广一个月多少钱
  • 东台哪家专业做网站做自行车网站应该注意什么
  • 做的网站被挂马南阳公司注册
  • 襄阳门户网站建设跨境电商培训哪家最好
  • 电子商务网站建设规划论文建一个网站是不是要开公司
  • 促销礼品网站建设做公司企业网站
  • 网站移动端指的是什么北京网络职业技术学院官网
  • 无锡信息网站建设山西省诚信建设网站