【新手必学】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爬虫之多线程实战的更多相关文章
- Python爬虫工程师必学——App数据抓取实战 ✌✌
Python爬虫工程师必学——App数据抓取实战 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统 ...
- Python爬虫工程师必学APP数据抓取实战✍✍✍
Python爬虫工程师必学APP数据抓取实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...
- Python爬虫工程师必学——App数据抓取实战
Python爬虫工程师必学 App数据抓取实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...
- 小白学 Python 爬虫(16):urllib 实战之爬取妹子图
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(40):爬虫框架 Scrapy 入门基础(七)对接 Selenium 实战
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(41):爬虫框架 Scrapy 入门基础(八)对接 Splash 实战
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(23):解析库 pyquery 入门
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(4):前置准备(三)Docker基础入门
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(11):urllib 基础使用(一)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
随机推荐
- vue开发之跨域请求,请求头not allowed by Access-Control-Allow-Headers,后端cookie session值取不到(二)
原因:你本地的请求ajax的get和post请求:如果你的请求头内放一些可用验证数据Token的时候就会存在跨域请求这是浏览器所不允许的问题: 方案一:后台的接口请求模式都写成jsonp请求,前端去调 ...
- iOS:应用程序扩展开发之Today扩展(Today Extesnsion)
一.简介 iOS应用程序扩展是苹果在iOS8推出的一个新特性,可以将自定义的功能和内容扩展到应用程序之外,在之后又经过不断地优化和更新,已经成为开发中不可或缺的功能之一.扩展也是一个Target项目, ...
- asp.net以流导出Excel
废话不多说,直接上代码 这是点击导出的事件函数,因为我是从前端获取的Table的json数据,所以需要转换一下,大家直接用查询出来的DataTable即可 protected void bt_expo ...
- 更改input标签的placeholder的样式
主要是要区别不同浏览器的不同css类 在input框中有时想将输入的字和placeholder设为不同的颜色或其它效果,这时就可以用以下代码来对placeholder进行样式设置了. input::- ...
- css+js相关笔记
作者:故事我忘了c个人微信公众号:程序猿的月光宝盒 css部分: 1.内联元素垂直居中的设置: (1) 设置父级元素的行高 line-height,和高度 height 原则:line-heigh ...
- 爬虫json文件存储形式
json的表现形式和python中的字典是没有很大区别的,唯一的区别是dict的键是可hash对象,而json只能是字符串. 对于json的操作可以分为两类 一是对字符串的操作: 当需要将python ...
- 菜鸟系列Fabric源码学习 — peer节点启动
Fabric 1.4 源码分析peer节点启动 peer模块采用cobra库来实现cli命令. Cobra提供简单的接口来创建强大的现代化CLI接口,比如git与go工具.Cobra同时也是一个程序, ...
- vue 做一个简单的TodoList
目录结构 index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...
- Selenium+Java(一)Selenium基础环境配置
前言 Selenium在Java中是以Jar包的形式存在,如要使用Java编写Selenium自动化测试用例,需要导入Jar包. selenium需要的Jar包下载地址: http://seleniu ...
- MySQL 格式化时间 成字符串
创建个表: CREATE TABLE `x02基本信息` ( `ID` varchar(32) NOT NULL COMMENT '系统内记录的唯一标识,供系统内部使用.', `名称` varchar ...
