1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > python爬虫——多线程的简单实例

python爬虫——多线程的简单实例

时间:2022-06-02 03:51:55

相关推荐

python爬虫——多线程的简单实例

python爬虫——多线程的简单实例

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

import requestsfrom lxml import etreeimport osimport timestart_time = time.time()#记录开始时间for i in range(1,7):#1.请求包图网拿到整体数据response = requests.get("/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():# 创建队列存储urlq = queue.Queue()for i in range(1,6):# 将url的参数进行编码后拼接到urlurl = '/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.创建存储方法

#提取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 requestsfrom lxml import etreeimport osimport queueimport threadingimport timedata_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():# 创建队列存储urlq = queue.Queue()for i in range(1,7):# 将url的参数进行编码后拼接到urlurl = '/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个爬虫我都设置了开始时间和结束时间,可以用(结束时间-开始时间)来计算比较两者的效率。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。