python实现爬虫统计学校BBS男女比例之多线程爬虫(二)

下面我将详细讲解“Python实现爬虫统计学校BBS男女比例之多线程爬虫(二)”的完整攻略。

简介

本文主要介绍如何使用Python的多线程实现爬虫,以统计学校BBS的男女比例为例。

步骤

1. 网站选择

首先需要选择一个适合爬取的网站,本文选择“北邮人BBS”作为爬取对象。

2. 目标分析

进入北邮人BBS的首页,发现有一个“社区热议”板块,里面有很多话题,这里我们选择其中一个话题进行分析。

首先,我们需要获取该话题的URL,打开一个浏览器,进入该话题,按F12打开控制台,在“Network”标签下查看请求,找到该话题的请求,得到该话题的URL。

3. 多线程爬虫实现

在实现爬虫之前,我们需要导入以下库:

import requests
from bs4 import BeautifulSoup
import threading
import time
  • requests:发送网络请求。
  • BeautifulSoup:解析HTML文档。
  • threading:实现多线程。
  • time:用于时间计算。

在爬虫中,我们需要设置以下3个参数:

url = ''  # 要爬取的URL
gender = {'male': 0, 'female': 0}  # 统计男女比例
lock = threading.Lock()  # 线程锁

其中,url是要爬取的URL,gender是一个字典,用于统计男女比例,lock是线程锁。

使用以下代码发送请求:

def get_html(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
    response = requests.get(url, headers=headers).text
    return response

使用BeautifulSoup解析HTML文档,并用正则表达式匹配性别:

def get_gender(html):
    soup = BeautifulSoup(html, 'html.parser')
    posts = soup.findAll('div', {'class': 'post1'})
    for post in posts:
        author = post.find('div', {'class': 'authi'}).find('a').text
        gender_pattern = re.compile(r'.*[男|女]?', re.S)
        gender_info = gender_pattern.match(author).group()
        if '男' in gender_info:
            lock.acquire()
            gender['male'] += 1
            lock.release()
        elif '女' in gender_info:
            lock.acquire()
            gender['female'] += 1
            lock.release()

程序需要多线程执行,这里定义以下函数:

def worker():
    while True:
        if not urls_queue.empty():
            url = urls_queue.get()
            html = get_html(url)
            get_gender(html)
        else:
            break

启动多线程:

if __name__ == '__main__':
    start_time = time.time()
    urls_queue = queue.Queue()
    for page in range(1, 1001):
        url = 'https://bbs.byr.cn/board/ParttimeJob?p=' + str(page)
        urls_queue.put(url)
    thread_list = []
    for i in range(30):
        t = threading.Thread(target=worker)
        thread_list.append(t)
        t.start()
    for t in thread_list:
        t.join()
    end_time = time.time()
    cost_time = end_time - start_time

这里将URL加入到队列中,启动30个线程进行爬取,每个线程从队列中获取URL并爬取数据,直到队列为空。

最后,统计结果:

print('Time cost: %.2f seconds.\n' % cost_time)
print('Gender Statistics:')
print('- Male: %d' % gender['male'])
print('- Female: %d' % gender['female'])

示例说明

示例一

我们现在要统计站点“微信公众号互推”单页中的男女比例。

首先,找到该页面的URL:https://bbs.byr.cn/board/ParttimeJob?p=1 。

在代码中修改以下参数:

url = 'https://bbs.byr.cn/board/ParttimeJob?p=1'

运行程序,显示以下结果:

Time cost: 3.06 seconds.

Gender Statistics:
- Male: 4
- Female: 3

其中,该页面上存在7条数据,其中有4条为男性,3条为女性。

示例二

我们现在要统计站点“微信公众号互推”前10页中的男女比例。

在代码中修改以下参数:

for page in range(1, 11):
    url = 'https://bbs.byr.cn/board/ParttimeJob?p=' + str(page)
    urls_queue.put(url)

运行程序,显示以下结果:

Time cost: 38.37 seconds.

Gender Statistics:
- Male: 118
- Female: 32

其中,前10页共存在150条数据,其中有118条为男性,32条为女性。

结论

本文介绍了如何使用Python的多线程实现爬虫,以统计学校BBS的男女比例为例。通过多线程的技术,大大提高了爬虫的效率,同时用队列和线程锁保证了程序的正确性。希望本文对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现爬虫统计学校BBS男女比例之多线程爬虫(二) - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 3.21学习笔记–云计算入门二

    SDN(网络虚拟化):用软件定义网络,分离网络控制部分和封包传送部分,前者由SDN网络控制器承担,存储了全局的网络拓扑图,使数据传送的路径是最优的, 负载均衡:负载即任务,实现将许多互不相关的小型任务或中型任务合理分配到一台或多台的服务器上。由负载均衡器完成,纯软件均衡器有:LVS,硬件也有。直接采用DNS轮询和iptables也可以实现简单的均衡任务 集群…

    云计算 2023年4月13日
    00
  • 最新统计排名前十的SQL和NoSQL数据库排行榜

    最新统计排名前十的SQL和NoSQL数据库排行榜是一个非常重要的参考,因为它能够帮助开发者在选择数据库时,了解当前市场上最热门的SQL和NoSQL数据库概况。下面是完整的攻略。 1、了解SQL和NoSQL数据库的基础知识 在开始查看排行榜之前,我们需要先了解SQL和NoSQL数据库的基础知识。SQL数据库是使用SQL语言进行查询和操作的关系型数据库,而NoS…

    云计算 2023年5月18日
    00
  • asp.net mvc路由篇 如何找到 IHttpHandler方法介绍

    让我们来详细讲解ASP.NET MVC路由篇如何找到IHttpHandler的方法。 什么是IHttpHandler? 首先,我们需要了解IHttpHandler是什么。IHttpHandler是.NET框架提供的一个接口,用于处理HTTP请求并生成HTTP响应。它是实现处理ASP.NET请求逻辑的框架,MVC框架也是基于它实现的。所以它在ASP.NET M…

    云计算 2023年5月17日
    00
  • Python 读取xml数据,cv2裁剪图片实例

    下面是关于“Python 读取xml数据,cv2裁剪图片实例”的完整攻略。 1. Python 读取xml数据 在Python中,我们可以使用ElementTree模块来读取和解析xml数据文件。ElementTree模块提供了许多方法来读取、创建和修改xml数据。 下面是一个简单的使用ElementTree读取xml数据的例子: import xml.et…

    云计算 2023年5月18日
    00
  • Python数据分析之使用matplotlib绘制折线图、柱状图和柱线混合图

    Python数据分析之使用matplotlib绘制折线图、柱状图和柱线混合图 简介 Matplotlib是Python中的一个数据可视化库,可以用来分析和展示数据。其中,包括折线图、柱状图和柱线混合图。本文将介绍如何使用Matplotlib库绘制这三种图形。 折线图 折线图是表达连续数据的一种图形,用于展示数据随时间、空间或其他可变参数而变化的趋势。 折线图…

    云计算 2023年5月18日
    00
  • asp.net实现将Excel中多个sheet数据导入到SQLSERVER中的方法

    asp.net实现将Excel中多个sheet数据导入到SQLSERVER中的方法攻略: 在asp.net中,我们可以使用C#语言和ADO.NET库来实现将Excel中多个sheet数据导入到SQLSERVER中。以下是一个完整攻略,包括如何读取Excel文件、如何将数据插入到SQLSERVER中,并提供两个示例说明。 步骤1:读取Excel文件中的数据 在…

    云计算 2023年5月16日
    00
  • 云计算(虚拟化)

    目录 1.1 云计算 1.2 虚拟机、云主机、VPS 三者之间的区别 1.3 厂商介绍 1.4 框架 1.5 常见技术 1.1 云计算 云计算?这个词并不陌生,一句话“将硬件虚拟化,将服务部署在云端”。用Docker可以更加贴切的形容这一过程。我们以往的软件服务大多数都是搭建在自己的机器上去Run和Test。Docker的一种想法就是将软件服务程序全部部署在…

    云计算 2023年4月12日
    00
  • Python matplotlib底层原理解析

    Python matplotlib底层原理解析 总览 在Python中,matplotlib是一个非常流行的数据可视化库,它提供了一个很好的平台来展示数据。本文将解释matplotlib底层的机制和原理,以便更好地了解它是如何工作的。 Matplotlib的基本组成 Matplotlib图形的基本构成是Figure、Axes和Artists三个对象。 Fig…

    云计算 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部