Requests+BeautifulSoup编写爬虫程序爬取历史彩票数据,成功!【人生第一个!】

本文记录了一个初学者编写人生首个爬虫程序的过程,使用了Requests和BeautifulSoup库来爬取彩票网站的历史数据。从确定爬取目标、设置请求头、解析HTML到存储数据到CSV文件,作者分享了遇到的问题和解决方法,强调在遇到困难时及时寻求外部资源帮助的重要性。

人生编写的第一个爬虫程序,以兹纪念!

拖着老身子骨熬夜盯屏幕敲键盘,感觉死了无数脑细胞,掉了好多头发,眼睛也要老眼昏花了!

一点体会就是,不要钻牛角尖,没思路的时候赶紧去看帖子,找视频看看!自己盯着屏幕憋不出来的,憋出来的也是效率太低。

言归正传,静态网页爬取是基础,所以爬虫就找个静态网页练练手,彩票网绝对是首选啊!(第一步完成)哈哈
第二步:确定爬取目标:具体就是用chrome浏览器,鼠标放在要选取内容上,右键检查,找到标签。
第三步:把网页内容都弄下来(用request.get(),注意要不要headers,需要的话还是右键检查,去代码里找,粘贴复制)
第四步: 作汤!find(),find_all()确定你要的标签位置,注意 得到的结果不唯一的时候,类型是列表!列表!可以用列表【数字】.get_text()获取标签内容,否则容易出错的!我就是这里卡了下!
第五步:将爬取的内容形成一个列表a=[b,c,d]
第六步:将爬取内容存到CSV里头,用unicodecsv,也可以用其它的包,看个人熟悉程度。

看到爬出来的1983条数据,还是有点成就感的!

from bs4 import BeautifulSoup
import requests
import unicodecsv as csv

red_ball = []
blue_ball = []
ball_date = []
result = []
one_result = []
r_result = []
b_result = []
url_all = []


def get_url():
    for l in range(7001, 7094):
        url1 = 'http://kaijiang.500.com/shtml/dlt/' + '%05d' % l + '.shtml'
        url_all.append(url1)
    for k in range(8001, 8155):
        url2 = 'http://kaijiang.500.com/shtml/dlt/' + '%05d' % k + '.shtml'
<think> 我们被要求提供一个基于Scrapy、BeautifulSoup、Pandas和Scikit-learn的代码示例,该示例包括以下步骤: 1. 使用Scrapy爬取网页(这里我们将提供一个Scrapy爬虫的示例,但注意Scrapy通常用于构建大型爬虫项目) 2. 使用BeautifulSoup解析网页(在Scrapy中,我们通常使用其内置的Selector,但也可以结合BeautifulSoup) 3. 使用Pandas进行数据清洗和整理 4. 使用Scikit-learn进行机器学习训练(这里需要一个简单的机器学习任务,例如文本分类) 由于Scrapy是一个独立的框架,通常我们会创建一个Scrapy项目。但在这里,为了简洁,我们将展示一个独立的Scrapy爬虫(使用CrawlerProcess)并结合BeautifulSoup解析。然后,我们将数据保存到CSV,用Pandas进行清洗,最后使用Scikit-learn进行文本分类。 步骤: 1. 创建一个Scrapy爬虫,用于爬取目标网站(这里以http://quotes.toscrape.com为例,因为它是一个用于练习爬虫的网站)。 2. 在爬虫中使用BeautifulSoup解析页面(虽然Scrapy有自己的解析方法,但这里按照要求使用BeautifulSoup)。 3. 将抓取的数据保存为CSV文件。 4. 使用Pandas读取CSV,进行数据清洗(例如处理缺失值、重复值等)。 5. 使用Scikit-learn构建一个简单的文本分类模型(例如,根据引言的文本分类作者)。 注意:由于quotes.toscrape.com的数据量小,且作者类别有限,我们可以尝试建立一个多分类模型。 我们将分步骤编写代码: 第一步:使用Scrapy和BeautifulSoup爬取数据 我们将创建一个Scrapy爬虫,在回调函数中使用BeautifulSoup解析HTML,提取引言(quote)、作者(author)和标签(tags)。 第二步:使用Pandas清洗数据 我们将读取爬取数据,进行必要的清洗(例如去重、处理缺失值等)。 第三步:使用Scikit-learn训练模型 我们将使用TF-IDF向量化文本(引言),然后训练一个多分类模型(如朴素贝叶斯)来预测作者。 由于代码较长,我们将分块展示。首先,确保已安装以下库: - scrapy - beautifulsoup4 - pandas - scikit-learn 然后,我们编写一个独立的Scrapy爬虫脚本(不创建完整项目): </think> 以下是基于Scrapy、BeautifulSoup、Pandas和Scikit-learn的完整数据处理流程代码示例,包含网页爬取数据清洗和机器学习训练三个核心模块: ```python import scrapy from scrapy.crawler import CrawlerProcess from bs4 import BeautifulSoup import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.preprocessing import LabelEncoder from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import accuracy_score # ========== 1. 网页爬取模块(Scrapy + BeautifulSoup) ========== class ArticleSpider(scrapy.Spider): name = 'article_spider' start_urls = ['https://example-news-site.com/technology'] # 替换为目标网站 custom_settings = { 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'DOWNLOAD_DELAY': 2, # 礼貌爬取 'CONCURRENT_REQUESTS': 1 } def parse(self, response): """解析文章列表页""" soup = BeautifulSoup(response.text, 'lxml') # 提取文章链接 for article in soup.select('article a.entry-link'): yield response.follow(article['href'], callback=self.parse_article) # 分页处理 next_page = soup.select_one('a.next-page') if next_page: yield response.follow(next_page['href'], self.parse) def parse_article(self, response): """解析文章详情页""" soup = BeautifulSoup(response.text, 'lxml') yield { 'title': soup.select_one('h1.article-title').get_text().strip(), 'content': '\n'.join([p.get_text() for p in soup.select('div.article-body > p')]), 'category': soup.select_one('meta[property="article:section"]')['content'], 'publish_date': soup.select_one('time.published')['datetime'], 'url': response.url } # 启动爬虫 process = CrawlerProcess(settings={ 'FEED_FORMAT': 'csv', 'FEED_URI': 'articles.csv' }) process.crawl(ArticleSpider) process.start() # ========== 2. 数据清洗模块(Pandas) ========== df = pd.read_csv('articles.csv') # 数据清洗函数 def clean_text(text): """文本清洗处理""" if not isinstance(text, str): return "" # 去除特殊字符 text = re.sub(r'[^\w\s]', '', text) # 转换为小写 text = text.lower() # 去除多余空格 return re.sub(r'\s+', ' ', text).strip() # 应用清洗 df['clean_title'] = df['title'].apply(clean_text) df['clean_content'] = df['content'].apply(clean_text) df['category'] = df['category'].astype('category') # 处理缺失值 df = df.dropna(subset=['clean_content', 'category']) df = df[df['clean_content'].str.len() > 100] # 移除内容过短的记录 # ========== 3. 机器学习训练模块(Scikit-learn) ========== # 划分数据集 X = df['clean_content'] y = df['category'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 文本向量化 vectorizer = TfidfVectorizer(max_features=5000, stop_words='english') X_train_vec = vectorizer.fit_transform(X_train) X_test_vec = vectorizer.transform(X_test) # 标签编码 label_encoder = LabelEncoder() y_train_enc = label_encoder.fit_transform(y_train) y_test_enc = label_encoder.transform(y_test) # 训练分类模型 classifier = MultinomialNB(alpha=0.1) classifier.fit(X_train_vec, y_train_enc) # 预测与评估 y_pred = classifier.predict(X_test_vec) accuracy = accuracy_score(y_test_enc, y_pred) print(f"模型准确率: {accuracy:.2f}") # 示例预测 sample_text = ["New AI breakthrough in quantum computing announced today"] sample_vec = vectorizer.transform(sample_text) predicted = label_encoder.inverse_transform(classifier.predict(sample_vec)) print(f"预测类别: {predicted[0]}") ``` ### 代码结构说明 1. **爬取模块(Scrapy + BeautifulSoup)** - 使用Scrapy框架构建分布式爬虫 - BeautifulSoup解析HTML提取结构化数据 - 支持分页爬取和详情页解析 - 输出CSV格式的原始数据集[^1][^2] 2. **清洗模块(Pandas)** - 读取CSV数据到DataFrame - 文本清洗(特殊字符处理、大小写转换) - 缺失值处理 - 数据过滤(按内容长度)[^3] 3. **机器学习模块(Scikit-learn)** - 数据集划分(训练集/测试集) - 文本向量化(TF-IDF) - 分类标签编码(LabelEncoder) - 朴素贝叶斯分类器训练 - 模型评估与预测[^2] ### 环境依赖 ```bash pip install scrapy beautifulsoup4 pandas scikit-learn ``` ### 典型应用场景 1. **新闻分类**:自动识别文章主题类别 2. **情感分析**:分析评论情感倾向 3. **内容推荐**:基于文本相似度的推荐系统 4. **舆情监控**:自动识别热点话题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值