当前位置:   article > 正文

Python多线程实例之爬虫_python queue thread 多线程 爬虫

python queue thread 多线程 爬虫

多线程爬虫用到的类库
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]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
"""
此处创建一个文件,我们用于使用多线程进行调度爬取
"""
"""
此处创建一个文件,我们用于使用多线程进行调度爬取
"""

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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

import queue # 是用来做线程之间的数据的安全通信的,name这个怎么理解呢?让本灵魂画家来整个图瞅瞅。
在这里插入图片描述
如果还有不理解,可以评论留言联系我,我们一起讨论,共同进步。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/189699
推荐阅读
相关标签
  

闽ICP备14008679号