96SEO 2026-02-23 15:29 0
在中国气象网(http://www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库。

(1)代码和运行结果
sqlite3.connect("weathers.db")self.cursor
创建天气数据表,主键为城市+日期self.cursor.execute("""create
若表已存在则清空表数据self.cursor.execute("delete
closeDB(self):self.con.commit()
temp):try:self.cursor.execute("""insert
show(self):self.cursor.execute("select
打印表头print("%-16s%-16s%-32s%-16s"
rows:print("%-16s%-16s%-32s%-16s"
城市与对应天气网代码的映射(用于构造请求URL)self.cityCode
self.cityCode.keys():print(f"{city}
f"http://www.weather.com.cn/weather/{self.cityCode[city]}.shtml"try:#
urllib.request.urlopen(req)data
li.select('p[class="wea"]')[0].text#
调用数据库插入方法存储数据self.db.insert(city,
cities:self.forecastCity(city)#
WeatherForecast()ws.process(["北京",
data-src="https://img2024.cnblogs.com/blog/3714476/202510/3714476-20251031171125025-795428111.png"
(2)心得体会
data-src="https://img2024.cnblogs.com/blog/3714476/202510/3714476-20251031171458891-125394241.png"
从上图的url网址中可以看出各个不同的城市之间只需要修改url城市编号即可,所以我们可以构建一个映射表,去分别访问不同城市的url。
data-src="https://img2024.cnblogs.com/blog/3714476/202510/3714476-20251031171825882-419727685.png"
通过f12我们可以很清晰的看到我们先要的数据都被存放在一个class='t
clearfix'的ul中,只要去遍历ul下面的每一个li,利用css去定位爬取,就可以得到我们想要的结果
总之,无论使用re、css,只要明确自己所要爬取的网页结构,就可以轻松爬取到
用requests和BeautifulSoup库方法定向爬取股票相关信息,并存储在数据库中。
(1)代码和运行结果
sqlite3.connect('stock_data.db')cursor
创建股票数据表,定义各字段及类型cursor.execute('''CREATE
sqlite3.connect('stock_data.db')cursor
datetime.now().strftime('%Y-%m-%d
data_list:cursor.execute('''INSERT
(data['code'],data['name'],data['latest_price'],data['change_percent'],data['change_amount'],data['volume'],data['turnover'],data['increase'],crawl_time))conn.commit()conn.close()#
f"https://push2.eastmoney.com/api/qt/clist/get?np=1&fltt=1&invt=2&cb=jQuery37107275901173684839_1761722704966&fs=m%3A0%2Bt%3A6%2Bf%3A!2%2Cm%3A0%2Bt%3A80%2Bf%3A!2%2Cm%3A1%2Bt%3A2%2Bf%3A!2%2Cm%3A1%2Bt%3A23%2Bf%3A!2%2Cm%3A0%2Bt%3A81%2Bs%3A262144%2Bf%3A!2&fields=f12%2Cf13%2Cf14%2Cf1%2Cf2%2Cf4%2Cf3%2Cf152%2Cf5%2Cf6%2Cf7%2Cf15%2Cf18%2Cf16%2Cf17%2Cf10%2Cf8%2Cf9%2Cf23&fid=f3&pn={page}&pz={pagesize}&po=1&dect=1&ut=fa5fd1943c7b386f172d6893dbfba10b&wbp2u=%7C0%7C0%7C0%7Cweb&_=1761722704968"try:#
"https://www.eastmoney.com/","Accept":
response.text[response.text.find('(')
response.text.rfind(')')]else:print("返回数据非JSONP格式,无法解析")return
位转换(API返回原始数据为最小单位,需转换为常规显示单位)stock_info
stock_info['name']:stock_list.append(stock_info)return
stock_listelse:print(f"API返回数据结构异常:{data.get('rc',
requests.exceptions.RequestException
e:print(f"JSON解析错误(返回内容:{response.text[:100]}...):
打印表头,使用制表符和对齐符保证格式整齐print(f"\n{'序号':<4}\t{'代码':<8}\t{'名称':<8}\t{'最新价':<8}\t{'涨跌幅(%)':<10}\t{'涨跌额':<8}\t{'成交量':<10}\t{'成交额(万)':<10}\t{'涨幅(%)':<8}")print("-"
1):print(f"{i:<4}\t{stock['code']:<8}\t{stock['name']:<8}\t{stock['latest_price']:<8.2f}\t"f"{stock['change_percent']:<10.2f}\t{stock['change_amount']:<8.2f}\t{stock['volume']:<10}\t"f"{stock['turnover']:<10.1f}\t{stock['increase']:<8.2f}")def
main():init_db()print("数据库初始化完成,开始爬取股票数据...")total_pages
stock_list:print_stock_data(stock_list)
存储数据print(f"第{page}页数据已保存至stock_data.db(共{len(stock_list)}条记录)")else:print(f"第{page}页未获取到有效股票数据")time.sleep(3)print(f"\n爬取完成!
数据已存储至stock_data.db")if
data-src="https://img2024.cnblogs.com/blog/3714476/202510/3714476-20251031173636971-905160615.png"
(2)心得体会
data-src="https://img2024.cnblogs.com/blog/3714476/202510/3714476-20251031173747719-1577203015.png"
通过f12去抓包到相应的信息包,可以从预览中查看到存储的数据,将这个我们所需要的包的标头复制下来,通过浏览器可以查看到我们所需要的信息存储在data下的diff
data-src="https://img2024.cnblogs.com/blog/3714476/202510/3714476-20251031173933589-1187100965.png"
这个网页结构很整洁也很清晰,所以只需要找到我们所需对应的数据,用get方法获取请求的参数f数据即可得到
这道题是用了一种新方法,刚开始还不能够很熟练的掌握,抓包的时候也需要一个一个去点击查看是不是自己想要的包,第一次代码运行出来的时候,我发现API返回原始数据为最小单位,需要我们对数据进行处理,转换为常规显示单位
爬取中国大学2021主榜(https://www.shanghairanking.cn/rankings/bcur/2021)所有院校信息,并存储在数据库中,同时将浏览器F12调试分析的过程录制Gif加入至博客中。
(1)代码和运行结果
save_path="payload.js"):"""下载payload.js文件到本地"""try:headers
timeout=15)response.raise_for_status()with
f:f.write(response.text)print(f"下载成功,保存至:
{os.path.abspath(save_path)}")return
requests.exceptions.RequestException
parse_all_rankings(file_path="payload.js"):"""解析本地文件,提取所有排名数据"""if
os.path.exists(file_path):print(f"{file_path}不存在,无法解析")return
re.search(r'univData:\s*\[(.*?)\],\s*indList:',
univ_data_match:print("未找到核心数据区域")return
re.findall(r'\{[^}]*univNameCn:"[^"]+"[^}]*\}',
re.search(r'univNameCn:"(.*?)"',
re.search(r'univNameCn:"(.*?)"',item)
re.search(r'univNameEn:"(.*?)"',
re.search(r'univNameEn:"(.*?)"',item)
rank_match.group(1).strip('"').isdigit():rank
int(rank_match.group(1).strip('"'))else:rank
province_match.group(1).strip('"')
province_map.get(province_code,
re.search(r'univCategory:([^,]+)',
category_map.get(category_code,
score_match.group(1).strip('"')score
re.search(r'univTags:\[([^\]]*)\]',
re.search(r'indData:(\{[^}]+\})',
re.search(f'"{code}":"?([^,"]+)"?',
val_match.group(1).strip()ind_data[name]
组装数据all_rankings.append({"rank":
ind_data.get("办学层次"),"discipline_level":
ind_data.get("学科水平"),"talent_train":
ind_data.get("人才培养"),"crawl_time":
datetime.datetime.now().strftime("%Y-%m-%d
create_db_connection(db_file):"""创建与SQLite数据库的连接"""conn
sqlite3.connect(db_file)print(f"数据库连接成功
create_ranking_table(conn):"""创建大学排名表"""try:sql_create_rankings_table
conn.cursor()cursor.execute(sql_create_rankings_table)print("大学排名表创建成功")except
rankings:print("没有数据可插入")return
conn.cursor()cursor.execute("DELETE
rankings:data_to_insert.append((item['rank'],item['name_cn'],item['name_en'],item['province'],item['category'],item['score'],item['tags'],item['school_level'],item['discipline_level'],item['talent_train'],item['crawl_time']))#
data_to_insert)conn.commit()print(f"成功插入
main():"""主函数:下载-解析-存储到数据库全流程"""#
"https://www.shanghairanking.cn/_nuxt/static/1761118404/rankings/bcur/2021/payload.js"local_file
local_file):print("无法继续,缺少必要的数据源文件")return#
parse_all_rankings(local_file)if
all_rankings:print("解析过程出现问题,无法获取数据")return#
create_db_connection(db_file)if
关闭连接conn.close()print("数据库连接已关闭")else:print("无法建立数据库连接,数据未保存")#
步骤4:打印部分结果预览print("\n数据预览:")print(f"{'排名':<6}{'学校':<18}{'省市':<6}{'类型':<8}{'总分':<6}")print("-"
print(f"{item['rank']:<6}{item['name_cn']:<18}{item['province']:<6}{item['category']:<8}{str(item['score']):<6}")print(f"\n共解析
data-src="https://img2024.cnblogs.com/blog/3714476/202510/3714476-20251031184942594-633988696.png"
data-src="https://img2024.cnblogs.com/blog/3714476/202510/3714476-20251031192036891-1804035461.gif"
(2)心得体会
data-src="https://img2024.cnblogs.com/blog/3714476/202510/3714476-20251031185103500-2146911967.png"
依旧是打开网址后进行抓包,找到存储数据的包,但是当我们用浏览器去预览这个包的标头时,我发现它的信息是乱码的
data-src="https://img2024.cnblogs.com/blog/3714476/202510/3714476-20251031185222920-1550960990.png"
这就造成我们没有办法很清晰的去查看数据的结构,同学给我提供了一个思路,他让我将这个js文件下载并解析下来
data-src="https://img2024.cnblogs.com/blog/3714476/202510/3714476-20251031185509819-1148459476.png"
通过下载解析后,我们可以清楚的看到存储数据的结构,通过re正则表达式去匹配univNameCn(学校)、ranking(排名)、province(省份)等等。
data-src="https://img2024.cnblogs.com/blog/3714476/202510/3714476-20251031190223467-1479610886.png"
但是在查看结构的时候,我们发现这个网址为了不想让我们能够很轻易的爬取到数据,它应用了一些密钥来转换,所以我们只能去添加一下映射表,先爬取它的代号,再将其通过密钥转换过来。
代码地址:https://gitee.com/lizixian66/shujucaiji/tree/homework2/
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback