赞
踩
多线程爬虫用到的类库
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 进行消费。
"""
while url_queue.qsize(): # qsize判断队列是否为空,为空时则结束生产
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):
while html_queue.qsize(): # qsize判断队列是否为空,为空时则结束消费
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这个怎么理解呢?让本灵魂画家来整个图瞅瞅。
如果还有不理解,可以评论留言联系我,我们一起讨论,共同进步。
和大家简单分享一下我的学习经历吧,希望能够帮到一些朋友:
首先遇到不会的技术,先去百度,找到别的大佬的实例代码,不要管看不看得懂,去自己一个字母一个字母的手敲一遍,在你看不懂的时候,可能敲第一遍是最痛苦的时候,坚持下来,敲完它,然后用你扎实的基本功去读代码,把你明白的地方全部做上注释,然后不懂的地方,针对性的去搜一搜,比如 queue 这个类库,我们针对性去搜这个,总比我们直接搜多线程会靠谱很多吧?
所以先敲,后看,再搜。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。