前言

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

正文

新手注意:如果你学习遇到问题找不到人解答,可以点我进裙,里面大佬解决问题及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. Appium+python自动化(四十)-Appium自动化测试框架综合实践 - 代码实现(超详解)

    1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现.由于时间的关系,宏哥这里用代码给小伙伴演示两个模块:注册和登录. 2.业务模块封装 因为现在各种APP的层出不群 ...

  2. ES6,import时如何正确使用花括号'{ }'

    在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种.前者用于服务器,后者用于浏览器.ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取 ...

  3. java编程思想第四版第十八章总结

    一.概述 如何学习java I/O 学习I/O类库 学习I/O发展史,为什么要学习发展史呢? 因为,如果缺乏发展史,我们就会对什么时候使用哪个类,以及什么时候不该使用它们而感到迷惑. 了解nio 二. ...

  4. pat 1006 Sign In and Sign Out(25 分)

    1006 Sign In and Sign Out(25 分) At the beginning of every day, the first person who signs in the com ...

  5. nyoj 41-三个数从小到大排序(STL --> sort(a, a+n) 升序)

    41-三个数从小到大排序 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:31 submit:44 题目描述: 现在要写一个程序,实现给三个数排序的功 ...

  6. nyoj 283-对称排序 (sort)

    283-对称排序 内存限制:64MB 时间限制:1000ms 特判: No 通过数:2 提交数:4 难度:1 题目描述: In your job at Albatross Circus Managem ...

  7. django_4:数据库1——django操作数据库

    创建数据库记录(插入) 使用python3 manage.py shell(python3亲测好使) ipython3 manage.py shell(亲测不好使) 方式一. [root@centos ...

  8. 0MQ文档导读

    1. 先结合RabbitMQ Tutorials,弄清0MQ socket的各种类型. 1.1. 0MQ PAIR 对应 RabbitMQ Tutorials的 "Hello world&q ...

  9. Cygwin安装教程

    cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件. 它对于学习unix/linux操作环境,或者从unix到windows的应用程序 ...

  10. 【论文阅读】TextSnake: A Flexible Representation for Detecting Text of Arbitrary Shapes

    TextSnake: A Flexible Representation for Detecting Text of Arbitrary Shapes ECCV2018 北京大学.face++ 思路: ...