Python多线程爬虫实例

多线程爬虫用到的类库
import queue
import time
import random
import blog_spider
import queue
import threading
import requests
from bs4 import BeautifulSoup

代码完成:

"""
首先我们先创建第一个文件,名字自己取,我这里取名为 crawl_spider.py
"""
import requests
from bs4 import BeautifulSoup

# 使用列表表达式生成一个包含100个链接的列表
urls = [f"https://www.xxxx.com/p{page}" for page in range(1,101)]

def crawl(url):
	"""
	本函数主要实现下载功能
	"""
	r = requests.get(url)
	return r.text

def parse(html):
	"""
	本函数主要实现数据抽取的功能
	"""
	soup = BeautifulSoup(html, 'html.parser')
	links = soup.find_all("a", class_="xxxxxxx")
	return [(linke['href'],linke.get_text()) for link in likes]

"""
此处创建一个文件,我们用于使用多线程进行调度爬取
"""

import threading
import queue			# 实现线程之间的安全的数据通信
import crawl_spider  # 这个是我们上一个文件的名字,如果在同一文件夹下直接import就可以,如果不是需要from  路径  import 文件名称


def do_crawl(url_queue:queue.Queue, html_queue:queue.Queue):   
	"""
	这是一个生产者,会生产出html,用于 do_parse 进行消费。
	"""
	url = url_queue.get()  			# 将queue中的url获取过来
	html = crawl_spider.crawl(url)	# 将获取到的url传给下载函数进行处理,接收返回过来的html
	html_queue.put(html)			# 将html 存放到queue

def do_parse(html_queue:queue.Queue, fout):
	html = html_queue.get()			# 获取下载函数下载的html
	results = crawl_spider.parse(html)	# 传给处理函数进行处理
	for result in results:				# 使用循环写入本地文件中
		fout.write(str(results) +'\n')

if __name__ == "__main__":
	url_queue = queue.Queue()			# queue 实例化
	html_queue = queue.Queue()			# queue 实例化
	for url in crawl_spider.urls:		# 循环将任务添加到 queue实例中
		url_queue.put(url)
	
	for idx in range(3):
		t = threading.Thread(target=do_crawl, args=(url_queue, html_queue),name=f"crawl{idx}")			# 创建线程,target 是指你要调用的函数名。args是指你要传入的参数,如果不传参可以不写。 name是指给线程一个名字
		t.start()						# 启动线程,只创建不启动也是白瞎。
	
	fout = open("data.txt", 'w')		# 打开一个文件准备往里面保存数据
	for idx in range(2):
		t = threading.Thread(target=do_parse, args=(html_queue, fout), name=f"parse{idx}")
		t.start()

import queue # 是用来做线程之间的数据的安全通信的,name这个怎么理解呢?让本灵魂画家来整个图瞅瞅。
Python多线程爬虫实例_第1张图片
如果还有不理解,可以评论留言联系我,我们一起讨论,共同进步。

和大家简单分享一下我的学习经历吧,希望能够帮到一些朋友:
首先遇到不会的技术,先去百度,找到别的大佬的实例代码,不要管看不看得懂,去自己一个字母一个字母的手敲一遍,在你看不懂的时候,可能敲第一遍是最痛苦的时候,坚持下来,敲完它,然后用你扎实的基本功去读代码,把你明白的地方全部做上注释,然后不懂的地方,针对性的去搜一搜,比如 queue 这个类库,我们针对性去搜这个,总比我们直接搜多线程会靠谱很多吧?
所以先敲,后看,再搜。

你可能感兴趣的:(笔记,学习,python,多线程)