前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者:清风化煞_  

正文

新手注意:如果你学习遇到问题找不到人解答,可以点我进裙,里面大佬解决问题及Python教.程下载和一群上进的人一起交流!


1.先附上没有用多线程的包图网爬虫的代码

import requests

from lxml import etree
import os
import time start_time = time.time()#记录开始时间
for i in range(1,7):
#1.请求包图网拿到整体数据
response = requests.get("https://ibaotu.com/shipin/7-0-0-0-0-%s.html" %str(i)) #2.抽取 视频标题、视频链接
html = etree.HTML(response.text)
tit_list = html.xpath('//span[@class="video-title"]/text()')#获取视频标题
src_list = html.xpath('//div[@class="video-play"]/video/@src')#获取视频链接

for tit,src in zip(tit_list,src_list):
#3.下载视频
response = requests.get("http:" + src)
#给视频链接头加上http头,http快但是不一定安全,https安全但是慢 #4.保存视频
if os.path.exists("video1") == False:#判断是否有video这个文件夹
os.mkdir("video1")#没有的话创建video文件夹
fileName = "video1\\" + tit + ".mp4"#保存在video文件夹下,用自己的标题命名,文件格式是mp4
#有特殊字符的话需要用\来注释它,\是特殊字符所以这里要用2个\\
print("正在保存视频文件: " +fileName)#打印出来正在保存哪个文件
with open (fileName,"wb") as f:#将视频写入fileName命名的文件中
f.write(response.content)
end_time = time.time()#记录结束时间
print("耗时%d秒"%(end_time-start_time))#输出用了多少时间

2.将上述代码套用多线程,先创建多线程

data_list = []#设置一个全局变量的列表
# 创建多线程
class MyThread(threading.Thread):
def __init__(self, q):
threading.Thread.__init__(self)
self.q = q #调用get_index()
def run(self) -> None:
self.get_index() #拿到网址后获取所需要的数据并存入全局变量data_list中
def get_index(self):
url = self.q.get()
try:
resp = requests.get(url)# 访问网址
# 将返回的数据转成lxml格式,之后使用xpath进行抓取
html = etree.HTML(resp.content)
tit_list = html.xpath('//span[@class="video-title"]/text()') # 获取视频标题
src_list = html.xpath('//div[@class="video-play"]/video/@src') # 获取视频链接
for tit, src in zip(tit_list, src_list):
data_dict = {}#设置一个存放数据的字典
data_dict['title'] = tit#往字典里添加视频标题
data_dict['src'] = src#往字典里添加视频链接
# print(data_dict)
data_list.append(data_dict)#将这个字典添加到全局变量的列表中 except Exception as e:
# 如果访问超时就打印错误信息,并将该条url放入队列,防止出错的url没有爬取
self.q.put(url)
print(e)

3.用队列queue,queue模块主要是多线程,保证线程安全使用的

def main():
# 创建队列存储url
q = queue.Queue()
for i in range(1,6): # 将url的参数进行编码后拼接到url
url = 'https://ibaotu.com/shipin/7-0-0-0-0-%s.html'%str(i)
# 将拼接好的url放入队列中
q.put(url) # 如果队列不为空,就继续爬
while not q.empty():
# 创建3个线程
ts = []
for count in range(1,4):
t = MyThread(q)
ts.append(t)
for t in ts:
t.start()
for t in ts:
t.join()

4.创建存储方法,如果你学习遇到问题找不到人解答,可以点我进裙,里面大佬解决问题及Python教.程下载和一群上进的人一起交流!

#提取data_list的数据并保存
def save_index(data_list):
if data_list:
for i in data_list:
# 下载视频
response = requests.get("http:" + i['src'])
# 给视频链接头加上http头,http快但是不安全,https安全但是慢 # 保存视频
if os.path.exists("video") == False: # 判断是否有video这个文件夹
os.mkdir("video") # 没有的话创建video文件夹
fileName = "video\\" + i['title'] + ".mp4" # 保存在video文件夹下,用自己的标题命名,文件格式是mp4
# 有特殊字符的话需要用\来注释它,\是特殊字符所以这里要用2个\\
print("正在保存视频文件: " + fileName) # 打印出来正在保存哪个文件
with open(fileName, "wb") as f: # 将视频写入fileName命名的文件中
f.write(response.content)

5.最后就是调用函数了

if __name__ == '__main__':
start_time = time.time()
# 启动爬虫
main()
save_index(data_list)
end_time = time.time()
print("耗时%d"%(end_time-start_time))

6.附上完整的多线程代码

import requests
from lxml import etree
import os
import queue
import threading
import time data_list = []#设置一个全局变量的列表 # 创建多线程
class MyThread(threading.Thread):
def __init__(self, q):
threading.Thread.__init__(self)
self.q = q #调用get_index()
def run(self) -> None:
self.get_index() #拿到网址后获取所需要的数据并存入全局变量data_list中
def get_index(self):
url = self.q.get()
try:
resp = requests.get(url)# 访问网址
# 将返回的数据转成lxml格式,之后使用xpath进行抓取
html = etree.HTML(resp.content)
tit_list = html.xpath('//span[@class="video-title"]/text()') # 获取视频标题
src_list = html.xpath('//div[@class="video-play"]/video/@src') # 获取视频链接
for tit, src in zip(tit_list, src_list):
data_dict = {}#设置一个存放数据的字典
data_dict['title'] = tit#往字典里添加视频标题
data_dict['src'] = src#往字典里添加视频链接
# print(data_dict)
data_list.append(data_dict)#将这个字典添加到全局变量的列表中 except Exception as e:
# 如果访问超时就打印错误信息,并将该条url放入队列,防止出错的url没有爬取
self.q.put(url)
print(e) def main():
# 创建队列存储url
q = queue.Queue()
for i in range(1,7): # 将url的参数进行编码后拼接到url
url = 'https://ibaotu.com/shipin/7-0-0-0-0-%s.html'%str(i)
# 将拼接好的url放入队列中
q.put(url) # 如果队列不为空,就继续爬
while not q.empty():
# 创建3个线程
ts = []
for count in range(1,4):
t = MyThread(q)
ts.append(t)
for t in ts:
t.start()
for t in ts:
t.join() #提取data_list的数据并保存
def save_index(data_list):
if data_list:
for i in data_list:
# 下载视频
response = requests.get("http:" + i['src'])
# 给视频链接头加上http头,http快但是不安全,https安全但是慢 # 保存视频
if os.path.exists("video") == False: # 判断是否有video这个文件夹
os.mkdir("video") # 没有的话创建video文件夹
fileName = "video\\" + i['title'] + ".mp4" # 保存在video文件夹下,用自己的标题命名,文件格式是mp4
# 有特殊字符的话需要用\来注释它,\是特殊字符所以这里要用2个\\
print("正在保存视频文件: " + fileName) # 打印出来正在保存哪个文件
with open(fileName, "wb") as f: # 将视频写入fileName命名的文件中
f.write(response.content) if __name__ == '__main__':
start_time = time.time()
# 启动爬虫
main()
save_index(data_list)
end_time = time.time()
print("耗时%d"%(end_time-start_time))

7.这2个爬虫我都设置了开始时间和结束时间,可以用(结束时间-开始时间)来计算比较两者的效率。

 

【新手必学】Python爬虫之多线程实战的更多相关文章

  1. Python爬虫工程师必学——App数据抓取实战 ✌✌

    Python爬虫工程师必学——App数据抓取实战 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统 ...

  2. Python爬虫工程师必学APP数据抓取实战✍✍✍

    Python爬虫工程师必学APP数据抓取实战  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...

  3. Python爬虫工程师必学——App数据抓取实战

    Python爬虫工程师必学 App数据抓取实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...

  4. 小白学 Python 爬虫(16):urllib 实战之爬取妹子图

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  5. 小白学 Python 爬虫(40):爬虫框架 Scrapy 入门基础(七)对接 Selenium 实战

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  6. 小白学 Python 爬虫(41):爬虫框架 Scrapy 入门基础(八)对接 Splash 实战

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  7. 小白学 Python 爬虫(23):解析库 pyquery 入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. 小白学 Python 爬虫(4):前置准备(三)Docker基础入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  9. 小白学 Python 爬虫(11):urllib 基础使用(一)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

随机推荐

  1. windows 2008 服务器优化:停powershell,卸载不相干软件,开启防火墙

    windows 2008 作为 全录 的服务器,经常cpu达到100%,查看是powershell.exe占cpu有98%.影响 全录 软件进行电话录音.所以想禁止powershell.exe程序启动 ...

  2. 微擎修改 icon.jpg 后项目主页未变

    微擎修改 icon.jpg 后项目主页Logo未变 产生原因: 设置了自定义图标,但系统未找到该图标,就选择使用默认的起始图标 解决办法: 在项目根目录位置上传一个图标名为 icon-custom.j ...

  3. python:调用bash

    利用os模块 python调用Shell脚本,有三种方法: os.system(cmd)返回值是脚本的退出状态码 os.popen(cmd)返回值是脚本执行过程中的输出内容 commands.gets ...

  4. Linux网络基本配置命令

    修改方法: 命令方式,大多是立即生效.临时有效: GUI图形方式, 修改配置文件,重启服务有效 1.修改主机名 hostname查看 hostname name临时修改 hostnamectl set ...

  5. 【algo&ds】8.最小生成树

    1.最小生成树介绍 什么是最小生成树? 最小生成树(Minimum spanning tree,MST)是在一个给定的无向图G(V,E)中求一棵树T,使得这棵树拥有图G中的所有顶点,且所有边都是来自图 ...

  6. 论文阅读:Face Recognition: From Traditional to Deep Learning Methods 《人脸识别综述:从传统方法到深度学习》

     论文阅读:Face Recognition: From Traditional to Deep Learning Methods  <人脸识别综述:从传统方法到深度学习>     一.引 ...

  7. [FPGA]浅谈LCD1602字符型液晶显示器(Verilog)

    目录 概述 LCD1602 LCD1602是什么? LCD1602的管脚 RS_数据/命令选择 E_使能 D0-D7 LCD1602有个DDRAM LCD1602还有个CGROM 指令集 清屏 进入模 ...

  8. 性能测试专题:Locust工具实战之“蝗虫”降世

    阅读全文需5分钟. 1. 前言 在上一篇文章中,我们已经为大家介绍了什么是Locust,具体可参照:性能专题:Locust工具实战之开篇哲学三问,简单来说,Locust 是基于 Python 语言下的 ...

  9. (四十二)golang--管道

    假设我们现在有这么一个需求: 计算1-200之间各个数的阶乘,并将每个结果保存在mao中,最终显示出来,要求使用goroutime. 分析: (1)使用goroutime完成,效率高,但是会出现并发/ ...

  10. 2019-9-25:渗透测试,基础学习,初识Hydra,BP爆破密码

    一,使用Hydra爆破ubuntu的SSH服务 输入命令,hydra -l root -P password.txt 192.168.20.128 ssh Hydra工具,基本参数说明 -l:指定用户 ...