python代码运行速度有点慢 ? 教你使用多线程速度飞升
创始人
2024-05-08 11:04:37
0

前言

嗨喽,大家好呀~这里是爱看美女的茜茜呐

又到了学Python时刻~

在我们爬取数据的时候,有时候它运行速度会非常慢

那么怎么解决呢?

这里给大家带来一个多线程的方法

我们用采集二手车来举例

环境使用:

  • Python 3.8

  • Pycharm

模块使用:

  • requests 数据请求模块

  • parsel 数据解析模块

  • re

  • csv 内置模块

一. 代码实现步骤:

  1. 发送请求, 模拟浏览器对于url地址发送请求

  2. 获取数据, 获取服务器返回响应数据

    开发者工具: response

  3. 解析数据, 提取我们想要的数据内容

    提取: 房源基本信息

  4. 保存数据, 把数据保存表格文件里面

  5. 多页数据采集

二. 代码展示

基础版

导入模块

# 导入数据请求模块 --> 第三方模块 需要安装 pip install requests
import requests
# 导入数据解析模块 --> 第三方模块 需要安装 pip install parsel
import parsel
# 导入csv
import csv
# 导入时间模块
import time

( 源码\解答\资料\教程点击此处跳转跳转文末名片加入,找管理员小姐姐领取呀~)

time_1 = time.time()

创建文件 <对象>

f = open('data.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题''小区','总价','单价','户型','面积','朝向','装修','楼层','建筑日期','建筑类型','详情页',
])

写入表头

csv_writer.writeheader()

“”"

  1. 发送请求, 模拟浏览器对于url地址发送请求
    • 伪装模拟: 请求头 字典数据类型 构建完整键值对
      headers 可以直接在开发者工具里面进行复制

    • 响应对象
      200 状态码 表示请求成功

“”"

for page in range(1, 101):try:print(f'==================正在采集第{page}页的数据内容==================')

请求链接

( 因不可抗原因,不能出现网址,会发不出去,用图片代替了,大家照着敲一下

或者点击此处跳转跳转文末名片加入裙聊,找管理员小姐姐领取呀~ )

模拟伪装

        headers = {# User-Agent 用户代理, 表示浏览器基本身份信息'User-Agent': ' Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'}

发送请求

        response = requests.get(url, headers)

“”"

  1. 获取数据, 获取服务器返回响应数据

    开发者工具: response

    获取网页源代码

    • response.text 获取响应文本数据, 字符串数据类型 获取html字符串数据内容

    • response.json() 获取响应字典数据 json数据 必须是完整json数据格式

  2. 解析数据, 提取我们想要的数据内容

    提取: 房源基本信息

    解析方法:

    • xpath

    • re正则

    • css

    • json数据处理

    css选择器: 根据标签属性提取数据内容

    1. 看数据在那个标签里面

“”"

        html_data = requests.get(link).textselect = parsel.Selector(html_data)

把获取下来 html字符串数据 response.text , 转成可解析对象

        selector = parsel.Selector(response.text)

第一次提取, 把包含房源数据信息 标签全部获取下来 获取所有li标签

        lis = selector.css('sellListContent li')

for循环把列表里 元素一个一个提取出来

        for li in lis:
            源码、解答、资源、学习交流可加企鹅裙:261823976##title = li.css('.title a::text').get()  # 标题href = li.css('.title a::attr(href)').get()  # 详情页totalPrice = li.css('.totalPrice span::text').get()  # 售价unitPrice = li.css('.unitPrice span::text').get()  # 单价string = select.css('.comments div:nth-child(7) .comment_text::text').get()

join把列表合并字符串

            area = '-'.join(li.css('.info .flood .positionInfo a::text').getall())  # 小区houseInfo = li.css('.info .address .houseInfo::text').get()

split 把字符串分割成列表

            houseType = houseInfo.split(' | ')[0]  # 户型houseArea = houseInfo.split(' | ')[1]  # 面积orientation = houseInfo.split(' | ')[2]  # 朝向renovation = houseInfo.split(' | ')[3]  # 装修floor = houseInfo.split(' | ')[4]  # 楼层

判断 houseInfo.split(’ | ') 有多少个元素, 如果6个元素 说明没有建造日期

            if len(houseInfo.split(' | ')) == 6:date = ''else:date = houseInfo.split(' | ')[5]buildingType = houseInfo.split(' | ')[-1]  # 建筑类型dit = {'标题': title,'小区': area,'总价': totalPrice,'单价': unitPrice,'户型': houseType,'面积': houseArea,'朝向': orientation,'装修': renovation,'楼层': floor,源码、解答、资源、学习交流可加企鹅裙:261823976##'建筑日期': date,'建筑类型': buildingType,'详情页': href,}csv_writer.writerow(dit)print(string)except:print('报名系统课程可以添加清风老师微信: pythonmiss')

多线程版

mport requests
import parsel
import re
import csv
# 线程池模块
import concurrent.futures
import timedef get_response(html_url):"""发送请求函数:param html_url::return:"""headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'}response = requests.get(url=html_url, headers=headers)return responsedef get_content(html_url):"""获取数据函数:param html_url::return:"""response = get_response(html_url)html_data = get_response(link).textselector = parsel.Selector(response.text)select = parsel.Selector(html_data)lis = selector.css('.sellListContent li')content_list = []for li in lis:title = li.css('.title a::text').get()  # 标题area = '-'.join(li.css('.positionInfo a::text').getall())  # 小区Price = li.css('.totalPrice span::text').get()  # 总价Price_1 = li.css('.unitPrice span::text').get().replace('元/平', '')  # 单价houseInfo = li.css('.houseInfo::text').get()  # 信息HouseType = houseInfo.split(' | ')[0]  # 户型HouseArea = houseInfo.split(' | ')[1].replace('平米', '')  # 面积direction = houseInfo.split(' | ')[2].replace(' ', '')  # 朝向renovation = houseInfo.split(' | ')[3]  # 装修floor_info = houseInfo.split(' | ')[4]floor = floor_info[:3]  # 楼层floor_num = re.findall('(\d+)层', floor_info)[0]  # 层数BuildingType = houseInfo.split(' | ')[-1]string = select.css('.comments div:nth-child(7) .comment_text::text').get()href = li.css('.title a::attr(href)').get()  # 详情页if len(houseInfo.split(' | ')) == 6:date = 'None'else:date = houseInfo.split(' | ')[5].replace('年建', '')  # 日期print(string)dit = {源码、解答、资源、学习交流可加企鹅裙:261823976##'标题': title,'内容': string,'小区': area,'总价': Price,'单价': Price_1,'户型': HouseType,'面积': HouseArea,'朝向': direction,'装修': renovation,'楼层': floor,'层数': floor_num,'建筑日期': date,'建筑类型': BuildingType,'详情页': href,}content_list.append(dit)return content_listdef main(page):"""主函数:param page::return:"""print(f'===============正在采集第{page}页的数据内容===============')

    content_list = get_content(html_url=url)for content in content_list:csv_writer.writerow(content)if __name__ == '__main__':time_1 = time.time()link = 'http:// *******.com/article/149'# 创建文件f = open('data多线程.csv', mode='a', encoding='utf-8', newline='')csv_writer = csv.DictWriter(f, fieldnames=['标题','内容','小区','总价','单价','户型','面积','朝向','装修','楼层','层数','建筑日期','建筑类型','详情页',])csv_writer.writeheader()# 线程池执行器 max_workers 最大线程数exe = concurrent.futures.ThreadPoolExecutor(max_workers=10)for page in range(1, 11):exe.submit(main, page)exe.shutdown()time_2 = time.time()use_time = int(time_2 - time_1)# 总计耗时: 9print('总计耗时:', use_time)

尾语

感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇👇

相关内容

热门资讯

oppo安卓版系统设置,全面解... 亲爱的手机控们,你是不是也和我一样,对OPPO安卓版系统的设置充满了好奇?想要让你的OPPO手机更加...
安卓系统是什么cp,CP架构下... 你有没有想过,你的手机里那个默默无闻的安卓系统,其实就像是一个超级贴心的CP(情侣搭档)呢?没错,就...
系统垃圾清理大师 安卓,安卓手... 手机里的垃圾文件是不是让你头疼不已?别急,今天我要给你介绍一位安卓系统里的“清洁小能手”——系统垃圾...
安卓系统分为几层,安卓系统分层... 你知道吗?安卓系统,这个陪伴我们手机生活的“小助手”,其实它内部结构可是相当复杂的呢!今天,就让我带...
系统最像苹果的安卓,揭秘最像苹... 你有没有发现,现在的安卓手机越来越像苹果了?没错,就是那个以简洁设计和流畅体验著称的苹果。今天,就让...
安卓更新13系统游戏,性能升级... 你知道吗?最近安卓系统又来了一次大变身,那就是安卓13系统!这次更新可是带来了不少惊喜,尤其是对那些...
安卓系统开机出错了,安卓系统开... 手机突然开不了机了,这可怎么办?别急,让我来帮你分析一下安卓系统开机出错的那些事儿。一、安卓系统开机...
vovg是安卓系统吗,安卓系统... 你有没有听说过Vovg这个操作系统?最近,这个名词在数码圈里可是引起了不小的热议呢!很多人都在问,V...
谷歌终止安卓系统更新,影响与未... 你知道吗?最近科技圈可是炸开了锅,因为谷歌突然宣布了一项重大决定——终止对某些安卓系统的更新!这可不...
塞班系统比安卓好,超越安卓的卓... 你知道吗?在手机操作系统的大战中,塞班系统和安卓系统一直是你争我斗的态势。但你知道吗?塞班系统在某些...
安卓系统手机便宜测评,深度测评... 你有没有想过,为什么安卓系统手机总是那么便宜呢?是不是觉得它们质量不好?别急,今天我就要带你深入了解...
安卓怎么扫描门禁系统,安卓设备... 你有没有想过,家里的门禁系统竟然也能用手机轻松搞定?没错,就是那个你每天进出都离不开的安卓手机!今天...
安卓系统账号注册过程,安卓系统... 你终于决定加入安卓系统的大家庭啦! 想必你对这个系统充满了期待,不过别急,注册账号可是第一步哦!今天...
日产天籁的安卓系统,智能驾驶体... 你有没有注意到,最近开车的朋友们都在议论纷纷,说他们的日产天籁换了个新玩意儿——安卓系统!这可不是什...
安卓系统怎么下载闹钟,安卓系统... 你有没有发现,每天早晨闹钟一响,整个人就像被电击了一样,瞬间清醒?没错,闹钟可是我们生活中不可或缺的...
手机系统设置铃声安卓,个性化定... 手机里那首动听的铃声,是不是让你每次听到都忍不住嘴角上扬呢?今天,就让我带你一起探索安卓手机系统设置...
安卓电脑双系统平板,畅享多模态... 你有没有想过,一台平板电脑既能满足你办公的需求,又能让你畅享娱乐时光?现在,有一种神奇的设备——安卓...
创维电视安卓系统2.3,回顾经... 你有没有发现家里的创维电视有点儿“老态龙钟”了?别急,别急,今天就来给你揭秘一下这款电视的“内心世界...
如何破解车载安卓系统,轻松解锁... 如何破解车载安卓系统:揭秘背后的技术与风险在当今这个数字化飞速发展的时代,汽车已经不仅仅是一种交通工...
安卓机上的windows系统,... 你有没有想过,把Windows系统的强大功能搬到安卓机上?想象那可是个让人眼前一亮的操作体验呢!今天...