【python实操】年轻人,想会写抢购脚本和爬虫?试试多线程吧(附爬虫完整源代码)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 【python实操】年轻人,想会写抢购脚本和爬虫?试试多线程吧(附爬虫完整源代码)
  • 作者:20岁爱吃必胜客(坤制作人),近十年开发经验, 跨域学习者,目前于海外某世界知名高校就读计算机相关专业。
  • 荣誉:阿里云博客专家认证、腾讯开发者社区优质创作者,在CTF省赛校赛多次取得好成绩。
  • 跨领域学习,喜欢摄影、弹吉他、咏春拳。文章深入浅出、语言风趣;爱吃必胜客社区创立者,旨在“发现美 欣赏美




⭐️前言

Python 多线程(multi-threading)是一种利用多个线程同时执行任务的技术,它旨在提高程序的运行效率和性能。

⭐️分析

Python 中多线程的实现主要基于 threading 模块。在该模块中,我们可以通过创建一个 Thread 对象来启动一个新线程,并通过 start() 方法来启动该线程的执行。与此相应的,我们还需要定义一个所谓的“线程函数”(Thread Function),即我们希望新线程执行的函数。通常情况下,该函数的形式为:

def thread_func(args):
    # 线程要执行的操作

其中 args 是线程函数接收的参数,而具体的线程操作就在函数体内实现了。

🌟 其他模块

除了 threading 模块外,Python 还提供了一些相关的库和方法,如 Queue、Lock 和 RLock等,可以对多线程编程进行更深入和细节的控制和处理

🌟 注意GIL

需要注意的是,由于 Python 的全局解释器锁(Global Interpreter Lock, GIL)的存在,使得在使用多线程时,无法真正实现并行计算,只能通过线程间的切换来模拟多个线程同时运行。因此,在考虑使用多线程技术来优化程序性能时,需要详细评估程序结构和运行环境,以便选择合适的算法和工具进行优化

⭐️ 多线程用来做什么

Python 多线程常用于以下几种情况:

  1. 网络编程:Python 中的 socket 模块支持多线程,可以实现多个客户端与服务器的并发通信
  2. IO 密集型任务:对于 CPU 耗时相对较短,但需要频繁读写数据的任务,如文件操作、爬虫等,使用多线程可以提高程序的运行效率。
  3. 并发控制:利用多线程可以实现对共享资源的并发访问和管理,如访问数据库等。
  4. 可视化界面:在 Python 的 GUI 编程中,通过多线程技术能够让用户界面保持响应,使得程序更加友好和易用

需要注意的是,在选择使用多线程时,需要仔细评估程序结构和运行环境,避免出现线程安全问题和性能瓶颈。

🌟 多线程应用示例

以下是两个常见的 Python 多线程应用示例:

  1. 多线程下载文件

该示例演示如何使用 Python 多线程技术下载多个文件,从而加快下载速度。在该示例中,我们使用 threading 模块创建多个线程每个线程负责下载一个文件

import requests
import threading
def download(url, filename):
    # 下载文件
    content = requests.get(url).content
    with open(filename, "wb") as f:
        f.write(content)
if __name__ == '__main__':
    urls = ["http://example.com/file1", "http://example.com/file2", "http://example.com/file3"]
    filenames = ["file1.txt", "file2.txt", "file3.txt"]
    threads = []
    for i in range(3):
        t = threading.Thread(target=download, args=(urls[i], filenames[i]))
        threads.append(t)
    # 启动多线程
    for t in threads:
        t.start()
    # 等待所有线程完成
    for t in threads:
        t.join()
  1. 解析 HTML 页面

该示例演示如何使用 Python 多线程技术加快解析 HTML 页面的速度。在该示例中,我们使用 threading 模块创建多个线程,每个线程负责下载并解析一个页面,最后将结果合并为一个列表。

import requests
import threading
from bs4 import BeautifulSoup
def parse_page(url):
    # 下载页面
    content = requests.get(url).content
    soup = BeautifulSoup(content, "html.parser")
    # 解析页面
    results = soup.find_all("div", class_="result")
    return results
if __name__ == '__main__':
    urls = ["http://example.com/page1", "http://example.com/page2", "http://example.com/page3"]
    threads = []
    for url in urls:
        t = threading.Thread(target=parse_page, args=(url,))
        threads.append(t)
    # 启动多线程
    for t in threads:
        t.start()
    # 合并结果
    results = []
    for t in threads:
        results += t.join()

需要注意的是,在选择使用多线程时,需要仔细评估程序结构和运行环境

实例爬虫-完整源代码

以下是一个简单的爬虫示例,使用Python中的requestsBeautifulSoup库来获取网页内容并提取其中的信息。这个爬虫程序可以从豆瓣电影Top250页面中提取电影名称、评分、导演和演员等信息,并将其保存到一个CSV文件中。

import requests
from bs4 import BeautifulSoup
import csv
# 定义要爬取的页面URL
url = 'https://movie.douban.com/top250'
# 发送HTTP请求获取页面内容
response = requests.get(url)
# 使用BeautifulSoup解析HTML页面
soup = BeautifulSoup(response.text, 'html.parser')
# 遍历每个电影条目,并提取电影信息
movies = []
for li in soup.find_all('li', class_='item'):
    # 获取电影名称
    name = li.find('span', class_='title').text
    # 获取电影评分
    rating = li.find('span', class_='rating_num').text
    # 获取电影导演和演员
    info = li.find('div', class_='bd').p.text.strip().split('\n')[0]
    # 提取导演和演员信息
    director = info.split(':')[0]
    actors = [x.strip() for x in info.split(':')[1].split('/')]
    # 将电影信息添加到列表中
    movies.append([name, rating, director, actors])
# 将电影信息保存到CSV文件中
with open('douban_movies.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['电影名称', '评分', '导演', '演员'])
    writer.writerows(movies)
print('豆瓣电影Top250信息已保存到douban_movies.csv文件中。')

这个爬虫程序首先使用requests库发送HTTP请求并获取到网页的HTML内容然后使用BeautifulSoup库解析HTML页面然后遍历每个电影条目,并提取电影名称、评分、导演和演员等信息最后把提取的电影信息保存到CSV文件中。

需要注意的是,爬虫程序必须遵守网站的爬虫规定,不得进行未经授权的数据采集或过度频繁的访问。违反网站的爬虫规定可能会导致IP封锁或其他法律问题。建议在进行爬虫程序之前仔细阅读目标网

import requests
from lxml import etree
import csv
import time
class DoubanSpider(object):
    def __init__(self):
        self.header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
        }
    # 发请求 获响应
    def get_source(self, com_url):
        res = requests.get(com_url, headers=self.header)
        html = res.content.decode('utf-8')
        return html
    # 解析数据
    def parsed_source(self, html):
        tree = etree.HTML(html)
        divs = tree.xpath('//div[@class="info"]')
        # print(divs)
        lis_data = []
        for div in divs:
            d = {}
            # 标题
            title = div.xpath('./div[@class="hd"]/a/span/text()')[0].strip()
            # print(title)
            # 评分
            score = div.xpath('./div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0].strip()
            # print(score)
            # 评价人数
            evaluate = div.xpath('./div[@class="bd"]/div[@class="star"]/span[last()]/text()')[0].strip()
            # print(evaluate)
            # 引用
            quote = div.xpath('./div[@class="bd"]/p[@class="quote"]/span/text()')
            if quote:
                quote = quote[0]
            else:
                quote = ''
            # 电影链接url
            link_url = div.xpath('./div[@class="hd"]/a/@href')[0].strip()
            # print(link_url)
            # 根据key值提取数据
            d['title'] = title
            d['score'] = score
            d['evaluate'] = evaluate
            d['quote'] = quote
            d['link_url'] = link_url
            lis_data.append(d)
        # print(lis_data)
        return lis_data
    # 保存数据
    def save_source(self, move_data, header):
        with open('movie_data.csv', 'a', encoding='utf-8-sig', newline='') as f:
            w = csv.DictWriter(f, header)
            # 写入表头
            w.writeheader()
            # writerows 一次性写入多行数据
            w.writerows(move_data)
    # 主函数
    def main(self):
        start = int(input('输入要爬取的起始页:'))
        end = int(input('输入要爬取的末尾页:'))
        for i in range(start, end+1):
            time.sleep(2)
            page = (i-1) * 25
            com_url = 'https://movie.douban.com/top250?start=' + str(page)
            h = self.get_source(com_url)
            # print(h)
            print('爬虫机器人正在爬取第%d页' % i)
            move_data = self.parsed_source(h)
            # 设置表头
            header = ['title', 'score', 'evaluate', 'quote', 'link_url']
            # print(move_data)
            self.save_source(move_data, header)
if __name__ == '__main__':
    # 实例化对象
    Spider = DoubanSpider()
    # 主函数调用
    Spider.main()

🌟 我的故事

python学习之路任重而道远,要想学完说容易也容易,说难也难。 很多人说python最好学了,但扪心自问,你会用python做什么了?

刚开始在大学学习c语言,写一个飞行棋的小游戏,用dos界面来做,真是出力不讨好。 地图要自己一点一点画出来,就像这样:

================
|       |
|       |
|===============
从此讨厌编程,不想继续学下去。每次作业应付。
算法考试,数据结构考试随便背代码,只求通过。
最后呢?我学会变成了吗?只能对一些概念侃侃而谈,但真的会几行代码,能写出实用工具吗?
答案变得模糊。
所以我们要从现在开始,学好python,不要再糊弄下去!!!

相关文章
|
5天前
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
34 20
|
18天前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
97 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
25天前
|
安全 Linux 网络安全
利用Python脚本自动备份网络设备配置
通过本文的介绍,我们了解了如何利用Python脚本自动备份网络设备配置。该脚本使用 `paramiko`库通过SSH连接到设备,获取并保存配置文件。通过定时任务调度,可以实现定期自动备份,确保网络设备配置的安全和可用。希望这些内容能够帮助你在实际工作中实现网络设备的自动化备份。
51 14
|
2月前
|
Python
自动化微信朋友圈:Python脚本实现自动发布动态
本文介绍如何使用Python脚本自动化发布微信朋友圈动态,节省手动输入的时间。主要依赖`pyautogui`、`time`、`pyperclip`等库,通过模拟鼠标和键盘操作实现自动发布。代码涵盖打开微信、定位朋友圈、准备输入框、模拟打字等功能。虽然该方法能提高效率,但需注意可能违反微信使用条款,存在风险。定期更新脚本以适应微信界面变化也很重要。
213 61
|
2月前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
178 5
|
2月前
|
数据采集 存储 监控
21个Python脚本自动执行日常任务(2)
21个Python脚本自动执行日常任务(2)
129 7
21个Python脚本自动执行日常任务(2)
|
2月前
|
数据采集 机器学习/深度学习 前端开发
PHP爬虫性能优化:从多线程到连接池的实现
本文介绍了一种通过多线程技术和连接池优化PHP爬虫性能的方法,以新浪投诉平台为例,详细展示了如何提高数据采集效率和稳定性,解决了传统单线程爬虫效率低下的问题。
114 2
PHP爬虫性能优化:从多线程到连接池的实现
|
2月前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
108 7
|
3月前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
3月前
|
监控 JavaScript 前端开发
python中的线程和进程(一文带你了解)
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
47 0

推荐镜像

更多