C Recommend Book List

博客推荐了一系列C语言相关书籍。包括适合初学者的《C Programming: A Modern Approach》等,参考书籍如《C : A Reference Manual》,还有涉及高级主题的《C Traps and Pitfalls》等,涵盖了从基础入门到深入探索的不同阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GENERAL INTRODUCTION/TUTORIAL:

(1) For real beginners looking for a solid introduction:

C Programming: A Modern Approach.
K.N.King.
W.W.Norton & Company, 1996.
ISBN 0-393-96945-2


(2) For somewhat more experienced users looking for a solid introduction:

The C Programming Language, 2nd Ed.
Kernigan & Ritchie.
Prentice Hall, 1988.
ISBN 0-13-110362-8


(3) Other recommended introductory books:


C: How to Program, 2nd Ed.
Deitel, H.M. & Deitel, P.J.
Prentice Hall, 1994.
ISBN: 0-13-226119-7


Reference Books:


C : A Reference Manual, 4th Ed.
Harbison & Steele.
Prentice Hall, 1995.
ISBN 0-13-326224-3


The Standard C Library.
P.J.Plauger.
Prentice Hall, 1992.
ISBN 0-13-131509-9


C Programming FAQs
Steve Summit
Addison-Wesley, 1996.
ISBN 0-201-84519-9


Advanced topics / further exploration

C Traps and Pitfalls.
Andrew Koenig.
Addison-Wesley, 1989.
ISBN 0-201-17928-8


Expert C Programming: Deep C Secrets
Peter Van Der Linden
Prentice Hall, 1994.
ISBN 0-13-177429-8


Practical C Programming.
Steve Oualline.
O'Reilly & Associates, 1993.
ISBN 1-56592-035-X


Problem Solving And Program Design In C, 2nd Ed.
Hanly & Koffman.
Addison-Wesley, 1996.
ISBN 0-201-59063-8


Algorithms in C, 3rd Ed.
Robert Sedgewick
Addison-Wesley, 1998.
ISBN 0-201-31452-5

C Unleashed.
Heathfield, Kirby et al
Sams Publishing, 2000.
ISBN 0-672-31896-2

可以在原有基础上 再简化一下这个代码吗 不要修改相关代码的名称之类的 哦可以删除多余的注释部分 保留关键的环节点就行 import requests # 导入requests库,用于发送HTTP请求 from bs4 import BeautifulSoup # 导入BeautifulSoup库,用于解析HTML页面 import csv # 导入csv库,用于处理CSV文件 from tqdm import tqdm # 导入tqdm库,用于显示进度条 import re # 导入re库,用于正则表达式操作 import os # 导入os库,用于操作系统相关功能,如文件和目录操作 import random # 导入random库,用于生成随机数 import time # 导入time库,用于处理时间相关操作 from jsonpath_ng import parse # 导入jsonpath_ng库的parse函数,用于解析JSONPath表达式 # 定义一个函数,用于发送HTTP请求获取页面内容 def get_page(url, headers): try: # 发送GET请求到指定的URL,并携带请求头信息 response = requests.get(url, headers=headers) # 设置响应的编码为gbk,因为当当网使用gbk编码 response.encoding = "gbk" # 检查请求是否成功,如果失败会抛出异常 response.raise_for_status() # 返回响应的文本内容 return response.text except requests.exceptions.RequestException as e: # 如果请求过程中出现异常,打印错误信息 print(f"请求失败: {e}") # 返回空字符串 return "" # 定义一个函数,用于解析书籍榜单页面,提取书籍信息并保存到CSV def get_book_list_data(html): book_ids = [] # 初始化一个空列表,用于存储提取到的书籍ID # 使用BeautifulSoup解析HTML内容 soup = BeautifulSoup(html, "html.parser") # 查找书籍列表的ul元素 ul = soup.find("ul", class_="bang_list clearfix bang_list_mode") if not ul: # 如果未找到书籍列表的ul元素,打印提示信息 print("未找到书籍列表,请检查页面结构是否变化") # 返回空列表 return book_ids # 遍历所有li元素(每本书) li_list = ul.find_all("li") for li in li_list: # 对li_list列表中的每个li元素进行遍历 try: # 提取排名信息 rank_div = li.find("div", class_="list_num red") or li.find("div", class_="list_num") rank = rank_div.get_text().strip(".") # 获取排名文本并去除末尾的点号 # 提取书籍ID book_link = li.find("div", class_="name").a["href"] book_id = book_link.split('/')[-1].split('.')[0] # 从链接中提取书籍ID # 提取书名 book_name = li.find("div", class_="name").a["title"] # 提取评论数量 content = li.find("div", class_="star").a.get_text().strip("条评论") # 提取推荐指数 recommend = li.find("span", class_="tuijian").get_text().strip("推荐") # 提取作者、出版社和出版时间 publisher_info = li.find_all("div", class_="publisher_info") author = publisher_info[0].a["title"] if publisher_info[0].a else None # 如果有作者信息则提取,否则为None publish_time = publisher_info[1].span.get_text() press = publisher_info[1].a.get_text() # 提取价格信息 original_price = li.find("span", class_="price_r").get_text().strip("¥") now_price = li.find("span", class_="price_n").get_text().strip("¥") discount = li.find("span", class_="price_s").get_text().strip("折") # 组织数据 data = [rank, book_id, book_name, author, publish_time, press, original_price, now_price, discount, content, recommend] # 写入CSV文件 with open("data.csv", "a", encoding="utf-8", newline="") as csv_file: csv_writer = csv.writer(csv_file) # 修改变量名 csv_writer.writerow(data) # 将数据写入CSV文件的一行 # 收集有效书籍ID if book_id != "未知ID": book_ids.append(book_id) # 如果书籍ID有效,则添加到book_ids列表中 except Exception as e: # 如果解析书籍信息时出现异常,打印错误信息 print(f"解析书籍信息时出错: {e}") continue # 跳过当前循环,继续处理下一个li元素 return book_ids # 返回提取到的书籍ID列表 # 定义一个函数,用于从CSV文件中读取前N个书籍ID def get_top_book_ids(limit=10): book_ids = [] # 初始化一个空列表,用于存储书籍ID try: with open("data.csv", "r", encoding="utf-8") as data_file: reader = csv.reader(data_file) next(reader) # 跳过CSV文件的表头 for i, row in enumerate(reader): # 遍历CSV文件的每一行 if i >= limit: break # 如果已经获取了指定数量的书籍ID,跳出循环 book_id = row[1] if book_id and book_id != "未知ID": book_ids.append(book_id) # 如果书籍ID有效,则添加到book_ids列表中 except Exception as e: # 如果读取书籍ID时出现异常,打印错误信息 print(f"读取书籍ID失败: {e}") return book_ids # 返回书籍ID列表 # 定义一个函数,用于爬取指定书籍的评论并保存到CSV文件 def crawl_book_reviews(pages, book_id, reviews_dir): csv_file = os.path.join(reviews_dir, f'当当网商品_{book_id}_评价.csv') # 构建评论文件的完整路径 # 创建CSV文件并写入表头 with open(csv_file, 'w', encoding='utf-8-sig', newline='') as review_file: c_writer = csv.DictWriter(review_file, fieldnames=['用户名', '评论内容']) c_writer.writeheader() # 写入CSV文件的表头 for i in range(pages): page = i + 1 # 从第1页到指定的页数进行遍历 # 使用传入的书籍ID构建URL url = f'http://product.dangdang.com/index.php?r=comment%2Flist&productId={book_id}&categoryPath=58.65.03.03.00.00&mainProductId={book_id}&mediumId=21&pageIndex={page}&sortType=1&filterType=1&isSystem=1&tagId=0&tagFilterCount=0&template=cloth' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36', 'Referer': f'http://product.dangdang.com/{book_id}.html', 'Cookie': 'from=460-5-biaoti; order_follow_source=P-460-5-bi%7C%231%7C%23www.baidu.com%252Fother.php%253Fsc.060000jRtGgkBd47ECAxHUxBlqwLkfBJsl8lSLtmm9Zl27Qa_kZyOm2Qg_lyRgkRd4vKD9uWt%7C%230-%7C-; ddscreen=2; __permanent_id=20210304204636997189494350346254347; __visit_id=20210304204637001245338343220621735; __out_refer=1614861997%7C!%7Cwww.baidu.com%7C!%7C%25E5%25BD%2593%25E5%25BD%2591%25E7%25BD%2591; __ddc_15d_f=1614861997%7C!%7C000000000000000000000000000000000000000000000000000000000000000_utm_brand_id%3D11106; dest_area=country_id%3D9000%26province_id%3D111%26city_id%3D0%26district_id%3D0%26town_id%3D0; pos_0_end=1614862009963; __ddc_1d=1614862062%7C!%7C_utm_brand_id%3D11106; __ddc_24h=1614862062%7C!%7C_utm_brand_id%3D11106; __ddc_15d=1614862062%7C!%7C_utm_brand_id%3D11106; pos_9_end=1614862078563; ad_ids=4343831%2C3554365%7C%233%2C2; secret_key=f097eea219c17c155499399cb471dd5a; pos_1_start=1614863547245; pos_1_end=1614863547264; __rpm=%7Cp_23665180.029..1614863548625; __trace_id=20210304211706253212636290464425201' } try: # 发送请求获取JSON数据 response = requests.get(url, headers=headers) response.raise_for_status() # 检查请求是否成功 py_data = response.json() # 将响应内容解析为JSON格式 except Exception as e: print(f"第 {page} 页请求失败: {e}") continue try: # 使用jsonpath提取HTML内容 jsonpath_expr = parse('$..html') matches = [match.value for match in jsonpath_expr.find(py_data)] # 使用列表推导式提取匹配的HTML内容 if matches: html_data = matches[0] else: print(f"第 {page} 页未找到 HTML 数据") # 如果未找到HTML数据,打印提示信息 continue # 使用正则表达式提取评论信息 comments = re.findall(r'<div class="describe_detail">\s*<span>(.*?)</span>\s*</div>', html_data) nicknames = re.findall(r'alt="(.*?)"', html_data) # 确保昵称和评论数量匹配 min_length = min(len(comments), len(nicknames)) # 写入评论数据 if min_length > 0: # 确保有有效数据 with open(csv_file, 'a', encoding='utf-8-sig', newline='') as pinglun_f: pinglun_writer = csv.DictWriter(pinglun_f, fieldnames=['用户名', '评论内容']) for idx in range(min_length): if nicknames[idx].strip() and comments[idx].strip(): pinglun_writer.writerow({ '用户名': nicknames[idx], '评论内容': comments[idx] }) print(f"书籍ID {book_id} 的第 {page} 页完成,添加了 {min_length} 条评论") else: print(f"书籍ID {book_id} 的第 {page} 页没有找到任何评论") time.sleep(random.uniform(0.8, 2.6)) # 随机延迟避免被封 except Exception as e: # 如果处理页面时出现异常,打印错误信息 print(f"第 {page} 页处理失败: {e}") continue # 跳过当前循环,继续处理下一页 # 定义一个函数,用于创建评论文件存储目录 def create_reviews_directory(): reviews_dir = "book_reviews" # 定义评论文件存储目录的名称 try: if not os.path.exists(reviews_dir): os.makedirs(reviews_dir) # 如果目录不存在,则创建目录 print(f"已创建评论文件夹: {reviews_dir}") return reviews_dir # 返回目录路径 except Exception as e: # 如果创建目录时出现异常,打印错误信息 print(f"创建文件夹失败: {e}") return None # 返回None # 定义一个函数,用于显示主菜单并处理用户选择 def main_menu(): while True: # 进入无限循环,直到用户选择退出 print("\n=== 当当网书籍数据分析系统 ===") print("1. 爬取书籍榜单数据") print("2. 退出系统") choice = input("请选择操作(1-2): ") # 获取用户输入的选择 if choice == "1": # 爬取书籍榜单数据 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.78" } # 创建并写入榜单数据CSV表头 with open("data.csv", "w", encoding="utf-8", newline="") as bangdan_f: head = ["排名", "书籍ID", "书名", "作者", "出版时间", "出版社", "原价", "现价", "打折", "评论", "推荐"] bangdan_writer = csv.writer(bangdan_f) bangdan_writer.writerow(head) # 写入CSV文件的表头 # 创建评论文件存储目录 reviews_dir = create_reviews_directory() if not reviews_dir: # 如果无法创建评论文件夹,打印提示信息并继续循环 print("无法创建评论文件夹,程序终止") continue # 爬取书籍榜单数据 print("开始爬取书籍榜单数据...") all_book_ids = [] # 初始化一个空列表,用于存储所有书籍ID for i in tqdm(range(1, 26)): # 从第1页到第25页进行遍历 url = f"http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent30-0-0-1-{i}" html = get_page(url, headers) # 调用get_page函数获取页面内容 if html: book_ids = get_book_list_data(html) # 调用get_book_list_data函数提取书籍信息 all_book_ids.extend(book_ids) # 将提取到的书籍ID添加到all_book_ids列表中 time.sleep(random.uniform(0.8, 2.6)) # 随机延迟 print(f"书籍榜单数据爬取完成,共获取 {len(all_book_ids)} 本书籍信息") # 获取前10本热门书籍ID top_book_ids = get_top_book_ids(10) # 调用get_top_book_ids函数获取前10本热门书籍ID if not top_book_ids: # 如果未找到有效的书籍ID,打印提示信息 print("未找到有效的书籍ID,请检查data.csv文件") else: print(f"准备爬取以下书籍的评论:{top_book_ids}") pages = int(input('请输入要爬取的评论页数(每本书): ')) # 获取用户输入的评论页数 # 爬取评论数据 for book_id in top_book_ids: # 遍历前10本热门书籍ID print(f"\n开始爬取书籍ID {book_id} 的评论...") crawl_book_reviews(pages, book_id, reviews_dir) # 调用crawl_book_reviews函数爬取评论数据 print("\n所有书籍评论爬取完成!") print("榜单数据已保存到 data.csv") print(f"各书籍评论已分别保存到 {reviews_dir} 文件夹中") elif choice == "2": print("感谢使用,再见!") break else: print("无效的选择,请重新输入") # 如果用户输入的选择无效,打印提示信息 if __name__ == "__main__": #检查脚本是否作为主程序运行 # 初始化 CSV 文件:如果 data.csv 文件不存在,则创建该文件并写入表头 if not os.path.exists("data.csv"): with open("data.csv", "w", encoding="utf-8", newline="") as f: writer = csv.writer(f) writer.writerow(["排名", "书籍ID", "书名", "作者", "出版时间", "出版社", "原价", "现价", "打折", "评论", "推荐"]) # 写入CSV文件的表头 create_reviews_directory() # 调用create_reviews_directory函数创建评论文件存储目录 # 启动主菜单 main_menu() # 调用main_menu函数显示主菜单并处理用户选择
06-12
print("开始执行推荐算法....") #spark.sql(etl_sql).write.jdbc(mysql_url, 'task888', 'overwrite', prop) # 获取:用户ID、房源ID、评分 etl_rdd = spark.sql(etl_sql).select('user_id', 'phone_id', 'action_core').rdd rdd = etl_rdd.map(lambda x: Row(user_id=x[0], book_id=x[1], action_core=x[2])).map(lambda x: (x[2], x[1], x[0])) # 5.训练模型 model = ALS.train(rdd, 10, 10, 0.01) # 7.调用模型 products_for_users_list = model.recommendProductsForUsers(10).collect() # 8.打开文件,将推荐的结果保存到data目录下 out = open(r'data_etl/recommend_info.csv', 'w', newline='', encoding='utf-8') # 9.设置写入模式 csv_write = csv.writer(out, dialect='excel') # 10.设置用户csv文件头行 user_head = ['user_id', 'phone_id', 'score'] # 12.写入头行 csv_write.writerow(user_head) # 13.循环推荐数据 for i in products_for_users_list: for value in i[1]: rating = [value[0], value[1], value[2]] # 写入数据 csv_write.writerow(rating) print("推荐算法执行结束,开始加工和变换推荐结果....") # 14.读取推荐的结果 recommend_df = spark \ .read \ .format('com.databricks.spark.csv') \ .options(header='true', inferschema='true', ending='utf-8') \ .load("data_etl/recommend_info.csv") # 注册临时表 recommend_df.createOrReplaceTempView("recommend") # 构造 spark执行的sql recommend_sql = ''' SELECT a.user_id, a.phone_id, bid,phone_name, phone_brand, phone_price, phone_memory ,phone_screen_size,ROUND(score,1) score FROM recommend a,phone b WHERE a.phone_id=b.phone_id ''' # 执行spark sql语句,得到dataframe recommend_df = spark.sql(recommend_sql) # 将推荐的结果写入mysql recommend_df.write.jdbc(mysql_url, 'recommend', 'overwrite', prop) 解释一下这段代码
06-08
这个代码可以顺便把书籍的数字id也爬出来吗 其他都不需要改 import requests from bs4 import BeautifulSoup import csv from tqdm import tqdm #进度条 def get_page(url,headers): response = requests.get(url,headers) response.encoding = "gbk" html = response.text return html def get_data(html): soup = BeautifulSoup(html,"html.parser") ul = soup.find("ul",class_="bang_list clearfix bang_list_mode") li_list = ul.find_all("li") for li in li_list: try: rank = li.find("div",class_="list_num red").get_text().strip(".") #排名 except: rank = li.find("div", class_="list_num").get_text().strip(".") # 排名 bookName = li.find("div",class_="name").a["title"] #书名 content = li.find("div",class_="star").a.get_text().strip("条评论") #评论 recommend = li.find("span",class_="tuijian").get_text().strip("推荐") #推荐 div_list = li.find_all("div",class_="publisher_info") try: author = div_list[0].a["title"] #作者 except: author = None publishTime = div_list[1].span.get_text() #出版日期 press = div_list[1].a.get_text() #出版社 originalPrice = li.find("span",class_="price_r").get_text().strip("¥") #原价 nowPrice = li.find("span", class_="price_n").get_text().strip("¥") # 现价 discount = li.find("span", class_="price_s").get_text().strip("折") #打折 data = [rank,bookName,author,publishTime,press,originalPrice,nowPrice,discount,content,recommend] with open("data.csv", "a", encoding="utf-8",newline="") as f: writer = csv.writer(f) writer.writerow(data) if __name__=="__main__": headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.78" } #写入表头 with open("data.csv","w",encoding="utf-8",newline="") as f: head = ["排名","书名","作者","出版时间","出版社","原价","现价","打折","评论","推荐"] writer = csv.writer(f) writer.writerow(head) for i in tqdm(range(1,26)): url = f"http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-{i}" html = get_page(url,headers) get_data(html) print("数据爬取完成!!!")
06-10
<%-- Created by IntelliJ IDEA. User: vili Date: 2019/8/23 Time: 13:42 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page isELIgnored="false" %> <!--header--> <div class="header"> <div class="container"> <nav class="navbar navbar-default" role="navigation"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <h1 class="navbar-brand"><a href="index.action">叮当书城</a></h1> </div> <!--navbar-header--> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li><a href="index.action" <c:if test="${param.flag==1}">class="active"</c:if>>首页</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle <c:if test="${param.flag==2}">active</c:if>" data-toggle="dropdown">商品分类<b class="caret"></b></a> <ul class="dropdown-menu multi-column columns-2"> <li> <div class="row"> <div class="col-sm-12"> <h4>商品分类</h4> <ul class="multi-column-dropdown"> <li><a class="list" href="booktypes_list.action?pageNumber=1&btid=-1">全部系列</a></li> <c:forEach items="${bookTypes}" var="t"> <li><a class="list" href="booktypes_list.action?pageNumber=1&btid=${t.btid}">${t.btname}</a></li> </c:forEach> </ul> </div> </div> </li> </ul> </li> <li><a href="recommend_books.action?rtype=2&pageNumber=1" <c:if test="${param.flag==3 && t==2}">class="active"</c:if>>热销</a></li> <li><a href="recommend_books.action?rtype=3&pageNumber=1" <c:if test="${param.flag==3 && t==3}">class="active"</c:if>>新品</a></li> <c:choose> <c:when test="${empty user }"> <li><a href="user_register.jsp" <c:if test="${param.flag==10 }">class="active"</c:if>>注册</a></li> <li><a href="user_login.jsp" <c:if test="${param.flag==9 }">class="active"</c:if>>登录</a></li> </c:when> <c:otherwise> <li><a href="order_list.action" <c:if test="${param.flag==5 }">class="active"</c:if>>我的订单</a></li> <li><a href="user_center.jsp" <c:if test="${param.flag==4 }">class="active"</c:if>>个人中心</a></li> <li><a href="logout.action" >退出</a></li> <li><a href="admin/index.jsp" target="_blank">后台管理</a></li> </c:otherwise> </c:choose> </ul> <!--/.navbar-collapse--> </div> <!--//navbar-header--> </nav> <div class="header-info"> <div class="header-right search-box"> <a href="javascript:;"><span class="glyphicon glyphicon-search" aria-hidden="true"></span></a> <div class="search"> <form class="navbar-form" action="search_books.action"> <input type="hidden" name="pageNumber" value="1"/> <input type="text" class="form-control" name="keyword"> <button type="submit" class="btn btn-default <c:if test="${param.flag==7 }">active</c:if>" aria-label="Left Align">搜索</button> </form> </div> </div> <div class="header-right cart"> <a href="book_cart.jsp"> <span class="glyphicon glyphicon-shopping-cart <c:if test="${param.flag==8 }">active</c:if>" aria-hidden="true"><span class="card_num"><c:choose><c:when test="${empty order}">0</c:when><c:otherwise>${order.itemMap.size()}</c:otherwise></c:choose></span></span> </a> </div> <div class="clearfix"> </div> </div> <div class="clearfix"> </div> </div> </div> <!--//header-- 修改代码使后台管理标签能跳转到后台管理页面
最新发布
06-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值