苦尽甘来,二本渣渣的上岸之路,苦学算法43天,5面字节跳动,侥幸拿下offer

本文分享了三份算法刷题资源,包括LeetCode算法收割机、算法刷题宝典及LeetCode中文刷题手册,共计520道题,覆盖多种算法类型,助力面试冲刺。

最近有看到很多朋友想进大厂,四面竟然都考了算法,很多同学面对算法的问题都很头大,因为自己做项目很难用到,但是但凡高薪的职位面试都会问到。最近我整理了一份刷题宝典,这份刷题宝典,也让我进了心仪的大厂。今天给大家分享一下:

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

毕竟现在大厂里用的都是算法,所以这块内容不吃透肯定是不行的。目录如下:图文并茂,附有刷题答案源码。

第一份:LeetCode算法收割机

由于篇幅原因,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,如需详细完整版的朋友,可以一键三连之后【见下图即可】免费获取!

 

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

部分目录展示:

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

第二份:算法刷题宝典

刷题任务的题目,是根据题目的类型来汇总的,总结了八个类别,每个类别下面也总结了5个左右的题型,帮助大家分门别类的突破,所以刷起来相对会更有重点和针对性。如果从头到尾的刷,每周按顺序刷42题,很容易让自己坚持不下来,也会觉得很枯燥。所以在制定计划的时候可以让这个计划变得更“有趣"和针对性,让它看起来更容易实现一点,才会更容易坚持。

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

部分内容展示:

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

第三份:LeetCode(520 道题)

除此之外,这里再跟大家推荐一本前不久火爆 GitHub 的 LeetCode 中文刷题手册,这本小册里面共包含刷 LeetCode 后整理的 520 道题,每道题均附有详细题解过程。自发布以后,受到技术圈内广大开发者的赞赏,建议大家收藏阅读。目录如下:

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

部分目录展示:

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

 

目前上述内容已打包成完整电子书,具体获取方式如下:

由于字数篇幅原因,在这只展示总目录和内容截图展示,有需要的朋友麻烦一键三连后,见下图即可免费获取

双非渣硕,开发两年,苦刷算法47天,四面字节斩获offer

import requests import time from bs4 import BeautifulSoup import os import csv import queue import threading import random from concurrent.futures import ThreadPoolExecutor from fake_useragent import UserAgent import logging # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', filename='crawler.log' ) # 全局变量 csv_lock = threading.Lock() header_written = False """生成待爬取的URL队列""" def getUrl(): urlQueue = queue.Queue() for i in range(0, 180, 20): # 0-160,每页20条,共9页 url = f"https://movie.douban.com/subject/36053256/comments?start={i}&limit=20&status=P&sort=new_score" urlQueue.put(url) return urlQueue """从URL队列获取内容并解析,带重试机制""" def getContent(urlQueue, max_retries=3): while True: try: # 使用timeout参数避免永久阻塞 url = urlQueue.get(timeout=5) except queue.Empty: logging.info("URL队列已空,退出内容获取线程") return retries = 0 while retries < max_retries: try: # 添加随机延迟,避免频繁请求 time.sleep(random.uniform(2, 5)) # 发送请求 html = requests.get(url, headers=getHeaders(), timeout=15) html.raise_for_status() # 检查HTTP状态码 # 检查是否被反爬 if "检测到有异常请求" in html.text: raise Exception("触发反爬机制") htmlValue = BeautifulSoup(html.text, 'html.parser') articles = htmlValue.select('.comment-item') # 验证是否获取到评论 if not articles: raise Exception("未找到评论元素,可能页结构变化或被反爬") # 解析评论 comments = [] for article in articles: try: comment_info = article.select_one('span.comment-info') if not comment_info: continue # 提取用户名 user_name = comment_info.select_one('a').get_text(strip=True) if comment_info.select_one( 'a') else "匿名用户" # 提取评论时间 time_elem = comment_info.select_one('span.comment-time') comment_time = time_elem.get_text(strip=True) if time_elem else "未知时间" # 提取评论地点 location_elem = comment_info.select_one('span.comment-location') comment_place = location_elem.get_text(strip=True) if location_elem else "未知地区" # 提取评分 rate_elem = comment_info.select_one('span[class*="allstar"].rating[title]') comment_rate = rate_elem['title'] if rate_elem else "未评分" # 提取评论内容 content_elem = article.select_one('span.short') comment_content = content_elem.get_text(strip=True) if content_elem else "无内容" comments.append([user_name, comment_time, comment_place, comment_rate, comment_content]) except Exception as e: logging.error(f"解析评论时出错: {e}") continue # 批量保存评论 if comments: downloaderContent(comments) logging.info(f"成功处理页: {url}, 获取到 {len(comments)} 条评论") break except requests.exceptions.RequestException as e: retries += 1 logging.warning(f"请求失败 ({url}): {e},尝试重试 ({retries}/{max_retries})") time.sleep(5 * retries) # 指数退避 except Exception as e: retries += 1 logging.error(f"处理页时出错 ({url}): {e},尝试重试 ({retries}/{max_retries})") time.sleep(5 * retries) # 指数退避 else: logging.error(f"达到最大重试次数,跳过URL: {url}") urlQueue.task_done() # 标记任务完成 """生成随机请求头,增强反爬能力""" def getHeaders(): try: ua = UserAgent() return { 'User-Agent': ua.random, 'Referer': 'https://movie.douban.com/', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', 'TE': 'Trailers' } except Exception: # 备用User-Agent列表 user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11.5; rv:90.0) Gecko/20100101 Firefox/90.0' ] return { 'User-Agent': random.choice(user_agents), 'Referer': 'https://movie.douban.com/' } """线程安全的CSV写入,批量处理""" def downloaderContent(content): global header_written try: src = './qimocontent/' setDir(src) filename = os.path.join(src, 'douban_comments.csv') with csv_lock: file_exists = os.path.isfile(filename) with open(filename, 'a', newline='', encoding='utf-8-sig') as writer: f_csv = csv.writer(writer) if not file_exists or not header_written: f_csv.writerow(['用户名', '发表时间', '发表地点', '评级', '评论']) header_written = True f_csv.writerows(content) except Exception as e: logging.error(f"保存数据失败: {e}") """创建目录,增加异常处理""" def setDir(dirname): try: if not os.path.exists(dirname): os.makedirs(dirname) except Exception as e: logging.error(f"创建目录失败: {dirname}, 错误: {e}") """主函数,使用线程池管理并发""" def main(): start_time = time.time() logging.info("豆瓣评论爬虫启动...") try: # 初始化队列 url_queue = getUrl() # 使用线程池控制并发 with ThreadPoolExecutor(max_workers=3) as executor: for _ in range(3): # 创建3个工作线程 executor.submit(getContent, url_queue) # 等待所有任务完成 url_queue.join() logging.info(f"爬取完成!耗时: {time.time() - start_time:.2f}秒") logging.info(f"数据已保存到: ./qimocontent/douban_comments.csv") print(f"爬取完成!耗时: {time.time() - start_time:.2f}秒") print(f"数据已保存到: ./qimocontent/douban_comments.csv") except KeyboardInterrupt: logging.info("用户中断操作,程序退出") print("程序已被用户中断") except Exception as e: logging.critical(f"主程序异常: {e}", exc_info=True) print(f"程序发生严重错误: {e}") if __name__ == '__main__': main() 这是我对《苦尽甘来遇见你》在豆瓣网上的数据爬取的代码,但是爬取出来的数据有很多重复的,并且爬取到一定数据量后,就不允许爬取了,但我想爬取大约300条数据,可以根据我的要求帮我重新修改代码
06-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值