普通爬虫VS多线程爬虫!Python爬虫运行时间对比[Python基础]
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
以下文章来自于爬小虫联盟,作者:Code皮皮虾
前言
“ 相信各位爬虫小伙伴在工作中,肯定遇到过写了大半天才出来的爬虫,好不容易运行起来,结果跑的贼慢,反正我是遇到过的。如今是大数据的时代,光会写爬虫根本没有什么竞争力,所以要学会对爬虫代码进行优化,优化爬虫的健壮性或者爬取速度等等,这些都能提高自己的竞争力!”
本文爬虫以糗事百科为例,以普通爬虫和多线程爬虫运行时间相比,相信大家都能领略到多线程的厉害之处!
多线程表情包分类爬取实战,话不多说,开干!
1、普通爬虫
import requestsfrom lxml import etreeimport timeimport sysheaders
= {"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 requestsfrom 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