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

一个可以看qq空间的网站iis7 网站权限设置

一个可以看qq空间的网站,iis7 网站权限设置,做渔家乐推广的有哪些好网站,成都响应式网站建目录 Python实例题 题目 要求: 解题思路: 代码实现: Python实例题 题目 基于 Python 的简单爬虫与数据可视化 要求: 使用 Python 构建一个简单的爬虫程序,支持以下功能: 从指定网站抓取数据&#…

目录

Python实例题

题目

要求:

解题思路:

代码实现:

Python实例题

题目

基于 Python 的简单爬虫与数据可视化

要求

  • 使用 Python 构建一个简单的爬虫程序,支持以下功能:
    • 从指定网站抓取数据(如新闻、商品信息等)
    • 解析 HTML 内容并提取所需信息
    • 将数据存储到文件或数据库
    • 对抓取的数据进行统计和可视化分析
  • 使用 requests 和 BeautifulSoup 进行网页爬取和解析。
  • 使用 pandas 和 matplotlib 进行数据处理和可视化。
  • 添加命令行界面,支持用户输入爬取参数。

解题思路

  • 使用 requests 发送 HTTP 请求获取网页内容。
  • 通过 BeautifulSoup 解析 HTML 内容并提取数据。
  • 使用 pandas 处理和分析数据。
  • 利用 matplotlib 和 seaborn 绘制图表。
  • 实现基本的反爬策略(如随机 User-Agent、请求间隔)。

代码实现

import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import time
import random
import argparse
import json
import os
from datetime import datetime
import re# 设置中文字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题class WebScraper:def __init__(self, base_url, headers=None, delay_min=1, delay_max=3):self.base_url = base_urlself.headers = headers or {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}self.delay_min = delay_minself.delay_max = delay_maxself.data = []def fetch_page(self, url):"""发送HTTP请求获取页面内容"""try:# 添加随机延迟,避免频繁请求delay = random.uniform(self.delay_min, self.delay_max)time.sleep(delay)response = requests.get(url, headers=self.headers)response.raise_for_status()  # 检查请求是否成功return response.textexcept requests.exceptions.RequestException as e:print(f"请求错误: {e}")return Nonedef parse_page(self, html_content, parser='html.parser'):"""解析HTML内容"""if not html_content:return Nonereturn BeautifulSoup(html_content, parser)def extract_data(self, soup):"""从页面中提取数据(需要在子类中实现)"""raise NotImplementedError("子类必须实现extract_data方法")def scrape(self, pages=1, url_pattern=None):"""执行爬取任务"""self.data = []for page in range(1, pages + 1):print(f"正在爬取第 {page}/{pages} 页...")if url_pattern:url = url_pattern.format(page=page)else:url = self.base_url if page == 1 else f"{self.base_url}?page={page}"html_content = self.fetch_page(url)if not html_content:continuesoup = self.parse_page(html_content)if not soup:continuepage_data = self.extract_data(soup)if page_data:self.data.extend(page_data)print(f"第 {page} 页爬取完成,获取 {len(page_data)} 条数据")print(f"爬取完成,共获取 {len(self.data)} 条数据")return self.datadef save_to_csv(self, filename=None):"""将数据保存为CSV文件"""if not self.data:print("没有数据可保存")returnfilename = filename or f"data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"df = pd.DataFrame(self.data)df.to_csv(filename, index=False, encoding='utf-8-sig')print(f"数据已保存到 {filename}")def save_to_json(self, filename=None):"""将数据保存为JSON文件"""if not self.data:print("没有数据可保存")returnfilename = filename or f"data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"with open(filename, 'w', encoding='utf-8') as f:json.dump(self.data, f, ensure_ascii=False, indent=2)print(f"数据已保存到 {filename}")class NewsScraper(WebScraper):def __init__(self, base_url, headers=None):super().__init__(base_url, headers)def extract_data(self, soup):"""从新闻页面提取数据"""articles = []# 查找所有新闻条目news_items = soup.select('div.news-item')  # 根据实际页面结构调整选择器for item in news_items:try:title_elem = item.select_one('h2.title a')title = title_elem.text.strip() if title_elem else "未找到标题"link = title_elem['href'] if title_elem and 'href' in title_elem.attrs else "#"if link.startswith('/'):link = self.base_url + linkdate_elem = item.select_one('span.date')date = date_elem.text.strip() if date_elem else "未知日期"summary_elem = item.select_one('p.summary')summary = summary_elem.text.strip() if summary_elem else "无摘要"articles.append({'title': title,'link': link,'date': date,'summary': summary})except Exception as e:print(f"提取新闻条目时出错: {e}")continuereturn articlesdef analyze(self):"""分析新闻数据"""if not self.data:print("没有数据可分析")returndf = pd.DataFrame(self.data)# 分析发布日期try:# 尝试解析日期df['date'] = pd.to_datetime(df['date'])df['day_of_week'] = df['date'].dt.day_name()# 按星期几统计新闻数量day_counts = df['day_of_week'].value_counts()plt.figure(figsize=(10, 6))sns.barplot(x=day_counts.index, y=day_counts.values)plt.title('新闻发布的星期分布')plt.xlabel('星期')plt.ylabel('新闻数量')plt.xticks(rotation=45)plt.tight_layout()plt.savefig('news_by_day.png')plt.close()print("新闻发布星期分布分析完成,图表已保存为 news_by_day.png")except Exception as e:print(f"日期分析出错: {e}")# 分析标题长度df['title_length'] = df['title'].str.len()plt.figure(figsize=(10, 6))sns.histplot(df['title_length'], bins=20, kde=True)plt.title('新闻标题长度分布')plt.xlabel('标题长度(字符)')plt.ylabel('频率')plt.tight_layout()plt.savefig('title_length_distribution.png')plt.close()print("新闻标题长度分析完成,图表已保存为 title_length_distribution.png")class ProductScraper(WebScraper):def __init__(self, base_url, headers=None):super().__init__(base_url, headers)def extract_data(self, soup):"""从商品页面提取数据"""products = []# 查找所有商品条目product_items = soup.select('div.product-item')  # 根据实际页面结构调整选择器for item in product_items:try:name_elem = item.select_one('h3.product-name')name = name_elem.text.strip() if name_elem else "未找到商品名称"price_elem = item.select_one('span.price')price_text = price_elem.text.strip() if price_elem else "0"# 提取价格中的数字部分price = re.search(r'\d+\.?\d*', price_text)price = float(price.group(0)) if price else 0rating_elem = item.select_one('div.rating')rating = rating_elem['data-rating'] if rating_elem and 'data-rating' in rating_elem.attrs else "0"rating = float(rating)review_count_elem = item.select_one('span.review-count')review_count_text = review_count_elem.text.strip() if review_count_elem else "0"# 提取评论数中的数字部分review_count = re.search(r'\d+', review_count_text)review_count = int(review_count.group(0)) if review_count else 0products.append({'name': name,'price': price,'rating': rating,'review_count': review_count})except Exception as e:print(f"提取商品条目时出错: {e}")continuereturn productsdef analyze(self):"""分析商品数据"""if not self.data:print("没有数据可分析")returndf = pd.DataFrame(self.data)# 价格分布plt.figure(figsize=(10, 6))sns.histplot(df['price'], bins=20, kde=True)plt.title('商品价格分布')plt.xlabel('价格')plt.ylabel('频率')plt.tight_layout()plt.savefig('price_distribution.png')plt.close()print("商品价格分布分析完成,图表已保存为 price_distribution.png")# 价格与评分关系plt.figure(figsize=(10, 6))sns.scatterplot(x='price', y='rating', data=df, alpha=0.6)plt.title('商品价格与评分关系')plt.xlabel('价格')plt.ylabel('评分')plt.tight_layout()plt.savefig('price_rating_relationship.png')plt.close()print("商品价格与评分关系分析完成,图表已保存为 price_rating_relationship.png")# 相关性分析corr_matrix = df[['price', 'rating', 'review_count']].corr()plt.figure(figsize=(10, 8))sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f', linewidths=0.5)plt.title('商品属性相关性分析')plt.tight_layout()plt.savefig('correlation_analysis.png')plt.close()print("商品属性相关性分析完成,图表已保存为 correlation_analysis.png")def main():parser = argparse.ArgumentParser(description='简单网页爬虫与数据分析工具')parser.add_argument('--type', type=str, choices=['news', 'product'], default='news', help='爬取类型:news(新闻)或product(商品)')parser.add_argument('--url', type=str, required=True, help='目标网站URL')parser.add_argument('--pages', type=int, default=1, help='要爬取的页数')parser.add_argument('--output', type=str, choices=['csv', 'json'], default='csv', help='输出格式:csv或json')parser.add_argument('--delay_min', type=float, default=1, help='最小请求延迟(秒)')parser.add_argument('--delay_max', type=float, default=3, help='最大请求延迟(秒)')parser.add_argument('--analyze', action='store_true', help='是否进行数据分析')args = parser.parse_args()# 创建爬虫实例if args.type == 'news':scraper = NewsScraper(args.url, delay_min=args.delay_min, delay_max=args.delay_max)else:scraper = ProductScraper(args.url, delay_min=args.delay_min, delay_max=args.delay_max)# 执行爬取scraper.scrape(pages=args.pages)# 保存数据if args.output == 'csv':scraper.save_to_csv()else:scraper.save_to_json()# 数据分析if args.analyze:scraper.analyze()if __name__ == "__main__":main()

文章转载自:

http://M2whypIU.fmgwx.cn
http://vAxJ7sgp.fmgwx.cn
http://VmsHLRNb.fmgwx.cn
http://UAiwv0hd.fmgwx.cn
http://WaXeeizd.fmgwx.cn
http://HukllM0e.fmgwx.cn
http://1hEbvf8v.fmgwx.cn
http://SjjroHGK.fmgwx.cn
http://Vgg5BXnl.fmgwx.cn
http://Ofwt7RCu.fmgwx.cn
http://4uDFnFP5.fmgwx.cn
http://AfAR8bRE.fmgwx.cn
http://z8mbWxQI.fmgwx.cn
http://5r2ktqcd.fmgwx.cn
http://b5As7gwM.fmgwx.cn
http://tnMy24SI.fmgwx.cn
http://bmiZMU2Y.fmgwx.cn
http://QUI85kSh.fmgwx.cn
http://V3qAtSDY.fmgwx.cn
http://TxG1QiM0.fmgwx.cn
http://ogfvozb7.fmgwx.cn
http://XAeuSIiw.fmgwx.cn
http://6YiB5she.fmgwx.cn
http://Cl7HkFNf.fmgwx.cn
http://dhLTf6Po.fmgwx.cn
http://qao4uIF1.fmgwx.cn
http://rDDx30uG.fmgwx.cn
http://RcHtFhxU.fmgwx.cn
http://oyae8ns0.fmgwx.cn
http://FG5LlmgK.fmgwx.cn
http://www.dtcms.com/wzjs/689441.html

相关文章:

  • 网站建设 华博互联佛山网站建设4-win方维
  • 榆林哪里做网站备案网站内容格式填写
  • 官方网站的要素腾讯云可以用wordpress教程
  • 旺道网站排名优化wordpress短代码下载按钮
  • 爱情动做网站推荐阿里云备案网站负责人
  • 上海珍岛网站建设免费网站建站模板
  • 企业网站建设多钱南阳做网站电话
  • 最好网站开发公司电话清远建网站的公司
  • 网站建设搭建是什么意思单县网站
  • 怎样用代码制作网站微信最好用的营销软件
  • 手机网站建设服务哪家好建设公司网站费用多少
  • 网页建站工具WordPress博客建站系统
  • 网站建设的基本过程国外网站为什么不用备案
  • 做暧网站免费贵州省建设职业技术学院网站
  • 免费制作论坛网站制作企业免费网站
  • 网站定制微安电力案例嘉定网站开发
  • 网站毕业设计一般做几个页面网站做文件检查
  • 百度产品推广百度关键词优化大师
  • 龙岩抖音seo搜索排名上海seo外包
  • 网站开发安全维护老薛主机怎么安装wordpress
  • 西安做网站的公司新注册建筑公司名称大全
  • 征求网站建设意见的通知wordpress搭建个人博客linux
  • 网站建设图书馆管理系统django商城网站开发的功能
  • wordpress教育网站动漫制作专业好吗
  • 安卓手机网站开发工具深圳网站建设公司首选
  • 怎样用虚拟空间做网站一建建设网站首页
  • 桐庐营销型网站建设美丽寮步网站建设哪家好
  • 郑州给公司做网站的公司网站制作学生信息管理
  • 淘客网站推广免备案设计网站哪个
  • 视频网站中滑动列表怎么做的郑州网站推广公司地址