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日

相关文章

  • Javascript & DHTML DOM基础和基本API第4/5页

    《Javascript & DHTML DOM基础和基本API》的4/5页主要介绍了JavaScript中DOM的基础知识和基本API的使用。 DOM的基础知识 DOM是文档对象模型(Document Object Model)的缩写,它是一种表示和操作HTML和XML文档的标准编程接口,可以使用JavaScript来控制web页面的内容、结构和样式…

    云计算 2023年5月17日
    00
  • 芝麻信用在哪里查看自己是否有负面记录?有负面记录怎么办?

    芝麻信用是一款普及度较高的信用评估工具,用户可以通过芝麻信用了解自己的信用状况。以下是芝麻信用在哪里查看自己是否有负面记录以及有负面记录怎么办的详细攻略: 1. 查看自己是否有负面记录 如果您想了解自己是否有负面记录,可以通过以下步骤在芝麻信用中查看: 打开芝麻信用APP。 点击“信用报告”按钮。 在信用报告页面中,您可以查看自己的信用分数以及信用记录。 如…

    云计算 2023年5月16日
    00
  • Python基于多线程操作数据库相关问题分析

    Python基于多线程操作数据库相关问题分析 在进行 Python 多线程操作数据库时,需要注意以下几个问题: 数据库连接 在多线程情况下,不同线程操作数据的时候需要使用独立的数据库连接,否则可能会出现一些不可预测的错误。因此,在多线程操作数据库之前,需要优先创建多个独立的数据库连接。 线程安全 MySQL 库的使用是单线程安全的,因此在多线程操作数据库时,…

    云计算 2023年5月18日
    00
  • DTCC大会归来,为何云计算厂商都在搞数据库?

    几乎每一年,我们都能从数据库大会参展企业中发现新的面孔,不仅专注数据库领域的创新企业越来越多,更有越来越多的云计算厂商开始重视数据库应用服务,并选择研发自己的数据库?这其中到底有何奥妙?作为八届数据库大会的全程亲历者,老鱼这里就跟大家扯一扯其中的缘由。 文 | 老鱼 第八届中国数据库技术大会(DTCC 2017)上周末在北京国际会议中心完美闭幕,也许还有很多…

    云计算 2023年4月13日
    00
  • 阿里云为啥要像O2O一样烧钱?

    阿里云为啥要像O2O一样烧钱? 阿里云是阿里巴巴集团下属的云计算服务商,与其他云计算公司相比,如AWS和Azure,在国内市场上占据着相当大的份额。然而,阿里云近年来在扩大市场份额时注入了大量资金,给人们留下了“像O2O一样烧钱”的印象。 阿里云投入资金的原因 市场占有率增长需要 阿里云市场份额的快速增长很大程度上是通过大规模的投资来实现的。阿里云之所以要投…

    云计算 2023年5月17日
    00
  • 首届!「中国云计算基础架构开发者大会」征稿启动

    写在前面 首届中国云计算基础架构开发者大会(China Cloud Computing Infrastructure Developer Conference – 简称 CID)即将举行。 与  CLK (中国 Linux 内核开发者大会)不同的是,CLK 主题是与 Linux 内核相关,CID 主题则以云计算基础架构技术为主。本文推送首届 CID 的征稿启…

    云计算 2023年4月13日
    00
  • 云计算设计模式(二十二)——静态内容托管模式

    部署静态内容到一个基于云的存储服务,可以直接向客户提供这些。这个模式可以减少潜在的昂贵的计算实例的需求。 景和问题 Web应用程序通常包括静态内容的一些元素。此静态内容可以包括HTML页面和诸如图像和可用到客户端的文件的其他资源,无论是作为一个HTML页的一部分(如嵌入式图像,样式表和客户端JavaScript文件)或作为单独的下载(如PDF文档)。 尽管W…

    2023年4月10日
    00
  • 本真的REST架构风格理解

    本真的REST架构风格理解 REST(Representational State Transfer)是一种架构风格,它以统一资源标识符(URI)作为唯一的资源标识,通过HTTP方法(GET、POST、PUT、DELETE等)对资源进行操作,使得客户端和服务器之间的交互方式简单明了、具有良好的可读性和可扩展性。但是,由于部分开发者对REST的不同理解,很多应…

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