普通爬虫VS多线程爬虫!Python爬虫运行时间对比[Python基础]

python

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

以下文章来自于爬小虫联盟,作者:Code皮皮虾

 

前言

“ 相信各位爬虫小伙伴在工作中,肯定遇到过写了大半天才出来的爬虫,好不容易运行起来,结果跑的贼慢,反正我是遇到过的。如今是大数据的时代,光会写爬虫根本没有什么竞争力,所以要学会对爬虫代码进行优化,优化爬虫的健壮性或者爬取速度等等,这些都能提高自己的竞争力!”

本文爬虫以糗事百科为例,以普通爬虫和多线程爬虫运行时间相比,相信大家都能领略到多线程的厉害之处!

多线程表情包分类爬取实战,话不多说,开干!

1、普通爬虫

import requests

from lxml import etree

import time

import sys

headers = {

"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36"

}

#爬取

def Crawl(response):

e = etree.HTML(response.text)

#根据class值定位

span_text = e.xpath("//div[@class="content"]/span[1]")

with open("duanzi.txt", "a", encoding="utf-8") as f:

for span in span_text:

info = span.xpath("string(.)")

f.write(info)

#main

if__name__ == "__main__":

//记下开始时间

start = time.time()

base_url = "https://www.qiushibaike.com/text/page/{}"

for i in range(1, 14):

#打印当前爬取的页数

print("正在爬取第{}页".format(i))

new_url = base_url.format(i)

#发送get请求

response = requests.get(new_url,headers=headers)

Crawl(response)

#记下结束时间

end = time.time()

#相减获取运行时间

print(end - start)

 

 

2、多线程爬虫

import requests

from lxml import etree

#Queue队列,先进先出

from queue import Queue

from threading import Thread

import time

#请求头

headers = {

"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36"

}

#数据获取

#继承Thread

class CrawlInfo(Thread):

#重写init函数

def__init__(self,url_queue,html_queue):

Thread.__init__(self)

self.url_queue = url_queue

self.html_queue = html_queue

# 重写run方法

def run(self):

while self.url_queue.empty()== False:

url = self.url_queue.get()

response = requests.get(url,headers=headers)

if response.status_code == 200:

#将数据放到队列中

self.html_queue.put(response.text)

#数据解析、保存

#继承Thread

class ParseInfo(Thread):

def__init__(self,html_queue):

Thread.__init__(self)

self.html_queue = html_queue

def run(self):

#判断队列是否为空。不为空则继续遍历

while self.html_queue.empty() == False:

#从队列中取最后一个数据

e = etree.HTML(self.html_queue.get())

span_text = e.xpath("//div[@class="content"]/span[1]")

with open("duanzi.txt", "a", encoding="utf-8") as f:

for span in span_text:

info = span.xpath("string(.)")

f.write(info)

#开始

if__name__ == "__main__":

start = time.time()

#实例化

url_queue = Queue()

html_queue = Queue()

base_url = "https://www.qiushibaike.com/text/page/{}"

for i in range(1,14):

print("正在爬取第{}页".format(i))

new_url = base_url.format(i)

url_queue.put(new_url)

crawl_list = []

for i in range(3):

Crawl = CrawlInfo(url_queue,html_queue)

crawl_list.append(Crawl)

Crawl.start()

for crawl in crawl_list:

#join()等到队列为空,再执行别的操作

crawl.join()

parse_list = []

for i in range(3):

parse = ParseInfo(html_queue)

parse_list.append(parse)

parse.start()

for parse in parse_list:

parse.join()

end = time.time()

print(end - start)

 

 

3、对比运行

普通爬虫

 

多线程爬虫

 

可能还有些小伙伴觉得这几秒钟的时间没什么大不了的,还是那句话,现在是大数据时代,动不动都是上百万、上千万的数据量,在采集总量中会有很大的区别。 如有不足之处或更多技巧,欢迎指教补充。愿本文的分享对您之后多线程有所帮助。谢谢~

以上是 普通爬虫VS多线程爬虫!Python爬虫运行时间对比[Python基础] 的全部内容, 来源链接: utcz.com/z/530417.html

回到顶部