Python3多线程处理爬虫的实战
作者:我才是李叔 发布时间:2023-08-16 02:16:21
标签:Python3,多线程爬虫
多线程
到底什么是多线程?说起多线程我们首先从单线程来说。例如,我在这里看书,等这件事情干完,我就再去听音乐。对于这两件事情来说都是属于单线程,是一个完成了再接着完成下一个。但是我一般看书一边听歌,同时进行,这个就属于多线程了。
在爬虫过程中,如果只使用单线程进行爬取,效率会比较低下,因此多线程的爬虫处理方式更为常用。Python3提供了threading模块来支持多线程编程,以下是使用Python3多线程处理爬虫的一般步骤:
导入依赖模块
import threading
import requests
from queue import Queue
构建爬虫类
class Spider:
def __init__(self):
self.urls = Queue() # 待爬取的链接队列
self.results = [] # 存储爬取结果的列表
self.lock = threading.Lock() # 线程锁
self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
# 获取链接列表
def get_urls(self):
# 这里可以从文件、数据库、网页等方式获取待爬取的链接
# 这里以一个示例链接列表作为例子
urls = ['<https://www.example.com/page1>', '<https://www.example.com/page2>', '<https://www.example.com/page3>']
for url in urls:
self.urls.put(url)
# 爬取页面并处理结果
def crawl(self):
while not self.urls.empty():
url = self.urls.get()
try:
response = requests.get(url, headers=self.headers)
# 这里可以对response进行解析,获取需要的信息
# 这里以抓取页面title作为例子
title = response.text.split('<title>')[1].split('</title>')[0]
self.results.append(title)
except Exception as e:
print(e)
finally:
self.urls.task_done()
# 启动多线程爬虫
def run(self, thread_num=10):
self.get_urls()
for i in range(thread_num):
t = threading.Thread(target=self.crawl)
t.start()
self.urls.join()
# 将结果写入文件或者数据库
with self.lock:
with open('result.txt', 'a') as f:
for result in self.results:
f.write(result + '\\n')
来源:https://blog.csdn.net/qq_56920529/article/details/129201627


猜你喜欢
- 论坛里面有不少人在使用Javascript编写Asp,经常有人在论坛提问,为什么Asp对象在对比指定值时返回结果不对?现在在这里给大家写点关
- Java 8终于到来了! 经过几年的等待, java程序员终于能在java中得到函数式编程的支持了. 函数式编程的支持能流程化现
- 条件选取:torch.where(condition, x, y) → Tensor返回从 x 或 y 中选择元素的张量,取决于 condi
- AXObject可用来解决IE需要激活 ActiveX 控件和生成控件调用代码 AXObjec
- 一、必要的 python 模块PyTorch 的 Vision 模块提供了图像变换的很多函数.torchvision/transforms/
- 1 plot 函数语法plot:绘制二维线图NO.1 绘制横轴为X,竖轴为Y二维线图,Y值与X值一一对应。plot(X,Y)如果 X 和 Y
- 本文实例分析了JavaScript事件委托技术。分享给大家供大家参考。具体分析如下:如果一个整体页面里有大量的按钮.我们就要为每一个按钮绑定
- 测试方法首先使用implode, serialize, json_encode, msgpack_pack创建四个文本文件,用于测试。创建代
- <script> Function.prototype.createInstance = function(){ var T =
- 1. 引言在数据处理、机器学习等领域,我们经常需要对各式各样的数据进行处理,本文重点介绍三种非常简单的方法来检测数据集中的异常值。
- sql 查出一张表中重复的所有记录数据1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a
- 字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,
- # 源码如下:#!/usr/bin/env python#coding=utf-8import osfrom PIL import Imag
- 本文实例讲述了Python操作Mongodb数据库的方法。分享给大家供大家参考,具体如下:一 导入 pymongofrom pymongo
- 这篇文章主要介绍了python如何实现不可变字典inmutabledict,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
- 本文实例讲述了python sqlite的Row对象操作。分享给大家供大家参考,具体如下:一 代码import sqlite3conn=sq
- 思路有些混乱,希望大家能理解我的意思。看了faster rcnn的tensorflow代码,关于fix_variables的作用我不是很明白
- Linux Centos 下使用yum 命令安装mysql实现步骤1. 查看服务器中有没有安装过Mysql1. 查看有没有安装包: &nbs
- 什么是运算符重载让自定义的类生成的对象(实例)能够使用运算符进行操作作用:让自定义的实例像内建对象一样进行运算符操作让程序简洁易读对自定义对
- 说明视频剪辑时需要为视频添加字幕,添加字幕方法之一:根据字幕文本文件批量生成透明底只有字幕内容的图片文件,如下图,然后将这些图片文件添加到视