Python多线程爬虫——数据分析项目实现详解

这篇具有很好参考价值的文章主要介绍了Python多线程爬虫——数据分析项目实现详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Python多线程爬虫——数据分析项目实现详解,粉丝福利活动,python,爬虫,开发语言
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z

「个人网站」:雪碧的个人网站
Python多线程爬虫——数据分析项目实现详解,粉丝福利活动,python,爬虫,开发语言

ChatGPT体验地址

Python多线程爬虫——数据分析项目实现详解,粉丝福利活动,python,爬虫,开发语言

爬虫

爬虫是指一种自动化程序,能够模拟人类用户在互联网上浏览网页、抓取网页内容、提取数据等操作。爬虫通常用于搜索引擎、数据挖掘、网络分析、竞争情报、用户行为分析等领域。
Python多线程爬虫——数据分析项目实现详解,粉丝福利活动,python,爬虫,开发语言
我们以爬取某个用户的博文列表并存储到文件中实现多线程爬虫为例,带大家体验爬虫的魅力

获取cookie

首先我们在爬取网站的时候首先获取cookie
Python多线程爬虫——数据分析项目实现详解,粉丝福利活动,python,爬虫,开发语言

拿我的博客主页为例,用F12打开控制台,点击网络,找到cookie
Python多线程爬虫——数据分析项目实现详解,粉丝福利活动,python,爬虫,开发语言
创建一个cookie文件,复制进去
然后从给定的cookie_path文件中读取cookie信息,并将其存储在一个字典中。函数返回这个字典。
具体如下

def get_headers(cookie_path:str):
cookies = {}
with open(cookie_path, "r", encoding="utf-8") as f:
cookie_list = f.readlines()
for line in cookie_list:
cookie = line.split(":")
cookies[cookie[0]] = str(cookie[1]).strip()
return cookies

网站爬取与启动

CSDN爬虫

class CSDN(object):
def init(self, username, folder_name, cookie_path):
# self.headers = {
# "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
# }
self.headers = get_headers(cookie_path)
self.s = requests.Session()
self.username = username
self.TaskQueue = TaskQueue()
self.folder_name = folder_name
self.url_num = 1
  1. headers: 这是一个字典,用于存储请求头信息。
  2. s: 这是一个会话对象,用于保持与CSDN网站的连接。
  3. username: 这是一个字符串,表示CSDN用户的用户名。
  4. TaskQueue: 这是一个任务队列对象,用于管理待访问的URL。
  5. folder_name: 这是一个字符串,表示保存爬取结果的文件夹名称。
  6. _name: 这是一个整数,表示当前保存的文件夹编号。
  7. _num: 这是一个整数,表示当前爬取的页面编号。

爬虫启动

def start(self):
	num = 0
	articles = [None]
	while len(articles) > 0:
		num += 1
		url = u'https://blog.csdn.net/' + self.username + '/article/list/' + str(num)
		response = self.s.get(url=url, headers=self.headers)
		html = response.text
		soup = BeautifulSoup(html, "html.parser")
		articles = soup.find_all('div', attrs={"class":"article-item-box csdn-tracking-statistics"})
		for article in articles:
			article_title = article.a.text.strip().replace('        ',':')
			article_href = article.a['href']
			with ensure_memory(sys.getsizeof(self.TaskQueue.UnVisitedList)):
				self.TaskQueue.InsertUnVisitedList([article_title, article_href])
  1. 初始化一个变量num,用于表示当前访问的文章页码。
  2. 初始化一个列表articles,用于存储待处理的文章信息。
  3. 使用一个while循环,当articles列表中的文章数量大于0时,执行循环体。
  4. 更新num变量,表示当前访问的文章页码。
  5. 构造一个URL,该URL包含当前用户名、文章列表和页码。
  6. 使用requests库发送请求,并获取响应。
  7. 使用BeautifulSoup库解析HTML内容,并提取相关的文章信息。
  8. 遍历提取到的文章列表,提取文章标题和链接。
  9. 将文章标题和链接插入到任务队列TaskQueue的未访问列表中。

将爬取内容存到文件中

  1. 打印爬取开始的信息。
  2. 计算并获取存储博文列表的文件路径。
  3. 使用open函数以写入模式打开文件,并设置文件编码为utf-8
  4. 写入文件头,包括用户名和博文列表。
  5. 遍历任务队列TaskQueue中的未访问列表,将每篇文章的标题和链接写入文件。
  6. 在每篇文章标题和链接之间添加一个空行,以提高可读性。
  7. 更新一个变量_num,用于表示当前已写入的文章序号。

代码如下

def write_readme(self):
	print("+"*100)
	print("[++] 开始爬取 {} 的博文 ......".format(self.username))
	print("+"*100)
	reademe_path = result_file(self.username,file_name="README.md",folder_name=self.folder_name)
	with open(reademe_path,'w', encoding='utf-8') as reademe_file:
		readme_head = "# " + self.username + " 的博文\n"
		reademe_file.write(readme_head)
		for [article_title,article_href] in self.TaskQueue.UnVisitedList[::-1]:
				text = str(self.url_num) + '. [' + article_title + ']('+ article_href +')\n'
				reademe_file.write(text)
				self.url_num += 1
	self.url_num = 1

列表文件生成之后,我们要对每一个链接进行处理

def get_all_articles(self):
	try:
		while True:
			[article_title,article_href] = self.TaskQueue.PopUnVisitedList()
			try:
				file_name = re.sub(r'[\/::*?"<>|]','-', article_title) + ".md"
				artical_path = result_file(folder_username=self.username, file_name=file_name, folder_name=self.folder_name)
				md_head = "# " + article_title + "\n"
				md = md_head + self.get_md(article_href)
				print("[++++] 正在处理URL:{}".format(article_href))
				with open(artical_path, "w", encoding="utf-8") as artical_file:
					artical_file.write(md)
			except Exception:
				print("[----] 处理URL异常:{}".format(article_href))
			self.url_num += 1
	except Exception:
		pass
  1. 从任务队列TaskQueue中弹出未访问的文章链接和标题。
  2. 尝试获取一个文件名,该文件名由文章标题生成,以避免文件名中的特殊字符。
  3. 计算并获取存储文章的文件路径。
  4. 创建一个Markdown文件头,包括文章标题。
  5. 获取文章内容,并将其添加到Markdown文件头。
  6. 将处理后的Markdown内容写入文件。
  7. 打印正在处理的URL。
  8. 更新一个变量_num,用于表示已处理的文章数量。

多线程爬虫

实现多线程爬虫,以提高爬取速度。在循环中,会不断地创建新的线程来处理任务队列中的任务,直到任务队列为空。这样可以充分利用计算机的多核性能,提高爬取效率。

def muti_spider(self, thread_num):
	while self.TaskQueue.getUnVisitedListLength() > 0:
		thread_list = []
		for i in range(thread_num):
			th = threading.Thread(target=self.get_all_articles)
			thread_list.append(th)
		for th in thread_list:
			th.start()

我们在多线程爬虫的时候,要保证系统有足够的内存空间。通过使用contextlib库的contextmanager装饰器,可以轻松地实现上下文管理,确保内存分配和释放的正确性。

lock = threading.Lock()
total_mem= 1024 * 1024 * 500 #500MB spare memory
@contextlib.contextmanager
def ensure_memory(size):
    global total_mem
    while 1:
        with lock:
            if total_mem > size:
                total_mem-= size
                break
        time.sleep(5)
    yield 
    with lock:
        total_mem += size

__enter__方法中,使用with lock语句模拟加锁,确保在执行内存分配操作时,不会发生竞争条件。然后判断当前系统的总内存是否大于所需分配的内存空间,如果大于,则减少总内存,并跳出循环。

选择要爬取的用户

def spider_user(username: str, cookie_path:str, thread_num: int = 10, folder_name: str = "articles"):
	if not os.path.exists(folder_name):
		os.makedirs(folder_name)
	csdn = CSDN(username, folder_name, cookie_path)
	csdn.start()
	th1 = threading.Thread(target=csdn.write_readme)
	th1.start()
	th2 = threading.Thread(target=csdn.muti_spider, args=(thread_num,))
	th2.start()
  1. 检查文件夹folder_name是否存在,如果不存在,则创建该文件夹。
  2. 创建一个CSDN对象csdn,用于模拟用户登录和爬取文章。
  3. 创建一个线程th1,目标为_readme
  4. 创建一个线程th2,目标为_spider,并传入参数(thread_num,),用于指定线程数量。

这个函数的目的是爬取指定用户的CSDN博客文章,并将文章保存到文件夹folder_name中。通过创建线程,可以实现多线程爬虫,提高爬取速度。

线程池

线程池存储爬虫代理 IP 的数据库或集合。在网络爬虫中,由于目标网站可能会针对同一 IP 地址的访问频率进行限制,因此需要使用池来存储多个代理 IP 地址,以实现 IP 地址的轮换和代理。池可以提高爬虫的稳定性和效率,避免因为 IP 地址被封禁而导致的爬虫失效。
爬虫和池是爬虫领域中不可或缺的概念,池能够提高爬虫的稳定性和效率,同时帮助爬虫更好地适应目标的反爬虫策略。
Python多线程爬虫——数据分析项目实现详解,粉丝福利活动,python,爬虫,开发语言文章来源地址https://www.toymoban.com/news/detail-800400.html

到了这里,关于Python多线程爬虫——数据分析项目实现详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python多线程爬取链家房源,保存表格,实现数据可视化分析!

    使用Python来爬取二手房源数据,并保存表格,实现数据分析! Python 3.8 Pycharm 模块   创建文件   发送请求, 模拟浏览器 对于 url地址 发送请求 模拟浏览器   请求网址/网站   发送请求   获取数据, 获取网页源代码 获取服务器返回响应数据 解析数据, 提取我们想要的数据内容

    2024年02月05日
    浏览(31)
  • Python上海二手房源爬虫数据可视化分析大屏全屏系统设计与实现 开题报告

     博主介绍 :《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月05日
    浏览(32)
  • Python天津二手房源爬虫数据可视化分析大屏全屏系统设计与实现 开题报告

     博主介绍 :《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月05日
    浏览(30)
  • Python北京二手房源爬虫数据可视化分析大屏全屏系统设计与实现 开题报告

     博主介绍 :《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月04日
    浏览(32)
  • Python杭州二手房源爬虫数据可视化分析大屏全屏系统设计与实现和开题报告

     博主介绍 :《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月04日
    浏览(31)
  • 基于Python的网络爬虫及数据处理---智联招聘人才招聘特征分析与挖掘的算法实现

    收藏和点赞,您的关注是我创作的动力   随着科学技术的发展,人类进入了互联网时代,不仅数据量庞大,而且数据种类繁多,Python简单易学, 语法清晰,在数据操作方面有着一定优势,成为了数据采集和可视化领域的热门语言。本论文主要是使用Python来作为开发语言,并

    2024年02月03日
    浏览(43)
  • 【Python爬虫与数据分析】爬虫selenium工具

    目录 一、selenium工具安装 二、selenium打开浏览器测试 三、无头浏览器 四、元素定位 五、页面滑动 六、按键、填写登录表单 七、页面切换 八、实战爬取当当网书籍数据 Selenium是Web的自动化测试工具,为网站自动化测试而开发,Selenium可以直接运行在浏览器上,它支持所有主

    2024年02月15日
    浏览(39)
  • 大数据舆情评论数据分析:基于Python微博舆情数据爬虫可视化分析系统(NLP情感分析+爬虫+机器学习)

    基于Python的微博舆情数据爬虫可视化分析系统,结合了NLP情感分析、爬虫技术和机器学习算法。该系统的主要目标是从微博平台上抓取实时数据,对这些数据进行情感分析,并通过可视化方式呈现分析结果,以帮助用户更好地了解舆情动向和情感倾向。系统首先利用爬虫技术

    2024年04月15日
    浏览(34)
  • 大数据爬虫分析基于Python+Django旅游大数据分析系统

    欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。    基于Python和Django的旅游大数据分析系统是一种使用Python编程语言和Django框架开发的系统,用于处理和分析旅游行业的大数据,为旅游从业者和决策者提供有关旅游趋势、客户需求、市场竞争

    2024年02月03日
    浏览(50)
  • 【Python爬虫与数据分析】基本数据结构

    目录 一、概述 二、特性 三、列表 四、字典 Python基本数据结构有四种,分别是列表、元组、集合、字典 ,这是Python解释器默认的数据结构,可以直接使用,无需像C语言那样需要手搓或像C++那样需要声明STL头文件。 Python的数据结构非常灵活,对数据类型没有限制,即一个数

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包