赞
踩
这个Python脚本用于从中国福利彩票官方网站爬取双色球开奖结果,并将数据保存到CSV文件中。该脚本使用requests
库发送HTTP请求,使用pandas
库处理和保存数据,仅供参考学习使用。
爬虫,也称为网络爬虫或网页爬虫,是一种自动化的网络机器人,其主要原理是按照一定的规则自动浏览万维网并抓取信息的程序或脚本。以下是爬虫的基本工作原理:
初始URL:爬虫开始工作时,通常会有一组初始的URL列表,这些是爬虫开始抓取数据的起点。
请求网页:爬虫通过HTTP或HTTPS协议向特定的URL发送请求,就像普通用户使用浏览器访问网页一样。
解析内容:一旦网页响应,爬虫会下载网页内容,并从中提取有用的信息。这通常涉及到HTML和CSS的解析。
数据提取:爬虫会根据预设的规则解析HTML文档,提取出需要的数据,如文本、图片、链接等。
数据存储:提取出的数据会被存储起来,常见的存储方式包括数据库、文件系统或者内存中。
遵循链接:爬虫会分析当前页面的链接,并将这些链接添加到待爬取的队列中,以便接下来访问。
去重复:为了效率和避免重复工作,爬虫会检查新发现的URL是否已经被访问过,通常使用一个大型的集合数据结构来存储已访问的URL。
遵守规则:爬虫在抓取过程中会遵守robots.txt
文件中的规则,这是网站管理员指定哪些部分可以被爬虫访问的标准。
错误处理:在爬取过程中,爬虫会遇到各种异常情况,如404错误、服务器错误等,良好的爬虫设计会包括错误处理机制。
用户代理:爬虫通常会设置一个用户代理(User-Agent),模仿浏览器的行为,有时候也会进行伪装,以避免被服务器识别为爬虫。
爬虫的设计和实现可以根据需求的不同而有很大的变化,但上述是大多数爬虫的基本工作流程。在设计爬虫时,应当考虑到效率、并发、网络延迟、数据处理和法律等多方面的因素。
在运行脚本之前,需要安装必要的Python库。可以使用以下命令安装:
pip install requests pandas
catch(i)
: 一个函数,用于爬取指定页码的开奖数据。try...except
: 主逻辑块,用于循环调用catch
函数,并处理数据。reversed_data.csv
文件中。url
: 目标网站的URL。params
: 用于请求的参数字典。header
: 自定义的HTTP头部信息。pageNo
: 当前爬取的页码。pageSize
: 每页显示的记录数。time.sleep(1)
被注释掉了,建议根据实际情况取消注释以设置合理的请求间隔。代码附上:
- # coding=gbk
- import time
- import requests
- import pandas as pd
-
- url = "https://www.cwl.gov.cn/cwl_admin/front/cwlkj/search/kjxx/findDrawNotice"
- params = {
- 'name': 'ssq',
- 'issueCount': '',
- 'issueStart': '',
- 'issueEnd': '',
- 'dayStart': '',
- 'dayEnd': '',
- 'pageNo': 1,
- 'pageSize': 30,
- 'week': '',
- 'systemType': 'PC',
- }
-
- header = {
- 'Accept': 'application/json, text/javascript, */*; q=0.01',
- 'Accept-Encoding': 'gzip, deflate, br',
- 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
- 'Connection': 'keep-alive',
- 'Cookie': 'HMF_CI=c5e50c6669ec97153ed140ea30f3eb070d8faea96fbcdf670ed7e2d8931d52333b32cced986c96d2e15287f95c0b17c77e9928eadb1275b99291225d5bbd4ca230; 21_vq=5',
- 'Host': 'www.cwl.gov.cn',
- 'Referer': 'https://www.cwl.gov.cn/ygkj/wqkjgg/ssq/',
- 'Sec-Ch-Ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Microsoft Edge";v="122"',
- 'Sec-Ch-Ua-Mobile': '?0',
- 'Sec-Ch-Ua-Platform': '"Windows"',
- 'Sec-Fetch-Dest': 'empty',
- 'Sec-Fetch-Mode': 'cors',
- 'Sec-Fetch-Site': 'same-origin',
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
- 'X-Requested-With': 'XMLHttpRequest',
- }
-
-
- def catch(i):
- params['pageNo'] = i
- try:
- response = requests.get(url=url, params=params, headers=header)
- if response.status_code == 200:
- result = response.json()['result']
- if not result: # 如果结果为空,说明没有更多数据
- return None
- data = [[int(a['code'])] + [int(k) for k in a['red'].split(',')] + [int(a['blue'])] for a in result]
- return pd.DataFrame(data, columns=['code', 'r1', 'r2', 'r3', 'r4', 'r5', 'r6', 'b1'])
- else:
- print('请求错误:', response.status_code)
- except Exception as e:
- print('发生异常:', e)
-
- try:
- data_frames = [] # 创建一个空列表来存储数据帧
- page = 1
- while True:
- print("正在爬取第{}页数据....".format(page))
- new_data = catch(page) # 假设 catch() 函数返回一个数据帧
- if new_data is not None:
- print("爬取成功,正在整合数据...")
- data_frames.append(new_data) # 将新数据帧添加到列表中
- else:
- print("已经没有更多数据,爬取结束。")
- break # 如果没有新数据,则退出循环
- page += 1
- # time.sleep(1)
- df = pd.concat(data_frames, ignore_index=True) # 循环结束后一次性合并所有数据帧
- # 反序DataFrame
- df = df.iloc[::-1]
- # 保存反序后的DataFrame到新的CSV文件
- df.to_csv('reversed_data.csv', index=False, encoding='gbk')
- except Exception as e:
- print('出错或到达页数最底层:', e)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。